IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA EXCEL : boucle, recherche ligne


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 41
    Points : 11
    Points
    11
    Par défaut [VBA-E] boucle, recherche ligne
    Bonjour à tous,

    J'ai trouvé plusieur aide et site mais je n'arrive pas à trouver la solution. Le temps passe et je dois présenter mon travail jeudi prochaine et je suis un peu dans l'impasse.

    Je cherche un peu d'aide pour corriger ou me donner des idees pour réaliser mon projet. J'ai testé quelques lignes de codes cela marchait plutot bien. Je les ai implantés dans mon document type et la ce ne donne pas le resultat escompté.


    J'utilise des boutons mais je pensais aussi à un userform + boutons pour réaliser mon étape 1 et 2. ( à creuser )

    1ere etape :
    En quelque mot, je voudrais copier la ligne a5 s5 toujours en dessous
    ( reconnaissance de la derniere ligne ) la difficulte c'st que j'ai deux tableaux sur la meme feuille . Le deuxieme tableau me sert pour des listes déroulantes.
    J'ai trouvé plusieur aide et site mais je n'arrive pas à trouver la solution.

    2eme etape :
    Je voudrais pouvoir remodifier n'importe quel ligne sauf ma ligne exemple L5.

    3eme etape :
    J'ai une macro de protection de feuille et deprotection de feuille ( non visible sur cette exemple ).
    Je désirerais verrouiller ou déverouiller des plages.

    C'est pour éviter des modifications non voulu.

    voici mon exemple
    http://cjoint.com/?dAqgLwaGeN


    Merci pour votre futur aide.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 66
    Points
    66
    Par défaut
    pour ton étape 1 :

    voici un axe de recherche, un bout de code a adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Sub TestA()
     
     
    For i = 1 To 25
     
    If IsEmpty(Range("A1").Offset(i, 0)) = True Then
      'si la 1 cellule de mon tableau est vide (en supposant que si la 1er cellule est vide -> la ligne est vide)
      'alors je copie la ligne où je suis avec mon ActiveCell
     
      ActiveCell.Offset(0, -1).Range("A1").Select
        Range(Selection, Selection.End(xlToLeft)).Select
     
      Exit For
     
    End If
     
    Next i
        Selection.Copy Destination:=Range("A1").Offset(i, 0)
    'je la colle à la fin de mon tableau
    End Sub

    dans mon cas je suis sur un tableau à 3 colonnes + une 4 eme colonne en jaunes, qui me sert juste pour délacer mon curseur.

    En fonction d'ou se trouve mon curdeur, je copie la ligne ou je me trouve (depuis la colonne n-1 ou je me trouve), tout a la fin de mon tableau, a la derniere ligne vide...


    voilà essai de l'adapter un peu a ton cas avec les bonnes colonnes.
    oups j'allais oublier que j'ai considérer aussi que ma recherche se faisait de A1 jusqu'à la 25 eme ligne ...

    si quelqu'1 a autre chose de plus intelligent ... c toujours intéressant
    bonne chance A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 41
    Points : 11
    Points
    11
    Par défaut boucle, recherche ligne
    slt,

    J'ai regardé comment fonctionner tes ligne de code, j'ai compris avec un essai en reprenant un tableau à 4 colonne.

    Je l'ai essaye avec mon tableau .
    Soit cela me copie ma ligne au dessus de mon champs titre.
    Si je vire les deux lignes vides. Cela me detruit ma ligne que je voudrais copier.

    Est-ce que mes liste déroulantes pourrait etre la cause de mes problèmes?


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 66
    Points
    66
    Par défaut
    Oups ... je crois comprendre ta question mais jsu un peu KO V me coucher...

    avant ça, regarde bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsEmpty(Range("A1").Offset(i, 0)) = True Then
    Je pars ici de A1, je considère donc que mon tableau commence à la premiere ligne A1 (ligne comprenant d'ailleur les titres du tableau) puisque :

    donc ma prmeire ligne scanée est :

    Range("A1").Offset(1, 0))

    il faut adapter ton code en conséquence, tu dois avoir un tableau qui ne commence pas dès la ligne A1 ou carrément en plein milieu de ta feuil excel et là forcément le code ne s'adapte pas automatiquement

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 41
    Points : 11
    Points
    11
    Par défaut boucle ,recherche ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub CommandButton2_Click()
     
    '--------------------------------------------
    'Comptage du nombre de lignes "REP" existantes  dans la feuille "Données"
    ' Le nombre de  lignes "REP" est limité à 242
    '---------------------------------------------
        i = 5
     
    Do While Worksheets("Feuil2").Cells(i, 1) <> ""
        i = i + 1
        If i = 250 Then
                MsgBox ("LE NOMBRE DE REPERE DE MAILLONS EST LIMITE A 242")
                Exit Do ' Quitte la boucle interne.
        End If
    Loop
        Nb_ligne_REP = i - 5
     
    '-----------------------------------------
    'Création d'une nouvelle ligne  "REP" dans la feuille "Données"
    'qui comprend "REP, ..."
    '---------------------------------------
    Creation_ligne_REP Nb_ligne_REP + 4
    End Sub
    Module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Sub Creation_ligne_REP(Nb_ligne_REP)
    '----------------------------------------------
    'Création d'une nouvelle ligne  "REP" dans la feuille "Données"
    'qui comprend "REP, ..."
    '-------------------------------------
        Sheets("Feuil2").Select
        Range(Cells(5, 1), Cells(5, 20)).Select
        Selection.Copy
        Cells(Nb_ligne_REP + 1, 1).Select
        ActiveSheet.Paste
     
    '-------------------------------
    ' Ecriture du numéro de "REP" dans la 1ère colonne
    '--------------------------------
        Sheets("Feuil2").Cells(Nb_ligne_REP + 1, 1) = Nb_ligne_REP - 3
     
    End Sub
    --------------------------------------------------------------------------
    J'ai pas mal avance . J'ai résolu mon etape 1 par les lignes de codes ci-dessus. Cela peut peut-etre servir à quelqu'un.

    Mais je voudrais y integrer une boucle pour éviter les répétitions ( j'ai 20 feuilles ). je bloque sur le code. J'ai tester par mal de chose.

    J'ai une erreur du type :
    Erreur d'execution 9
    l'indice n'appartient pas à la sélection


  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour Sebi78,

    Essayez ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    nbf = 20
     
    For n = 1 To nbf
     
    Sheets(n).Select
     
      'Votre traitement
     
    Next n
    Amicalement.
    Dernière modification par AlainTech ; 01/04/2007 à 03h58. Motif: Suppression de la mise en forme dans le code

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    1ere etape :
    En quelque mot, je voudrais copier la ligne a5 s5 toujours en dessous
    ( reconnaissance de la derniere ligne ) la difficulte c'st que j'ai deux tableaux sur la meme feuille . Le deuxieme tableau me sert pour des listes déroulantes.
    J'ai trouvé plusieur aide et site mais je n'arrive pas à trouver la solution.
    On manque d'infos
    1 - Comment sont organisés tes tableaux ? Côte à côte ou l'un en dessous de l'autre ?
    2 - Une ligne ou une colonne sépare-t-elle les deux tableaux ?
    3 - Les deux tableaux sont censé être modifiés par ta procédure ou qu'un seul ?
    3b - S'il n'y en a qu'un, où se trouve-t-il ? (en dessus de l'autre, en dessous, à droite, à gauche ?
    4 - Les données à copier modifient-t-elles les dimensions du/des tableau(x) ?
    4b - La première ligne de tes tableaux est-elle toujours à la même adresse ?
    5 - Si les tableaux sont situés côte à côte, si une ligne vide sépare tes tableaux, si 4b enfin, alors pour connaître la plage occupée par ton tableau, et donc les dernière ligne et dernière colonne, tu as CurrentRegion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        DerniereLigne = Range("A1").CurrentRegion.End(xlDown).Row
        DernièreColonne = Selection.CurrentRegion.End(xlToRight).Column
    Tu as aussi la possibilité de nommer tes deux tableaux.
    Sinon, une réponse à mes questions pourrait nous aider à t'aider

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 41
    Points : 11
    Points
    11
    Par défaut boucle, recherche ligne
    Bonjour,

    C'est pas evident d'expliquer.
    voici un de mes fichiers test :
    http://cjoint.com/?ebrzUlzNIK

    1 - Mes deux tableaux sont l'un à cote de l'autre.
    1 tableau de A3 - T5 et l'autre AB3 - AP368

    2 - des colonnes separes mes deux tableaux

    3 - je me sert du deuxième tableau pour remplir mon premier tableau par des listes déroulants.
    J'ai une feuille avec seulement mon deuxieme tableau que je peux modifier à souhait. Je copie ce tableau sur chaque feuille tjs en AB3 - AP368

    4 - non les donnees ne modifient pas les dimensions du tableau ( colonne )
    On ne doit pas inserer de lignes sinon cela interferer avec le deuxième
    tableau ( cause liste deroulant ). Je veux juste copier

    4b - oui les tableaux sont tjs à la meme ligne


    Je suis arrivé à faire mon etape 1 ( copie ma ligne à l'infini ) sur feuille 2 . J'ai 20 feuilles avec le meme style de tableau. Je voudrais eviter de copier les meme lignes de code 20 fois. Comment puisse boucler sur mes feuilles.

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bon. Pour faire la même chose sur 20 feuilles, pourquoi ne dupliques-tu pas la première feuille 20 fois une fois renseignée ?
    Ou alors je n'ai toujours pas compris ton pb.

    Pour copier une ligne dans une autre feuille, tu as 7 exemple ici

    Pour écrire dans des cellules verrouillées, tu dois déprotéger la feuille, puis la re-protéger après modif. Tu peux faire ça par soft. Et tu as, semble-t-il le code...
    Si tu souhaites que certaines cellules soient accessibles, la feuille étant protégée, tu les déverrouilles et tu protèges la feuille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Cells(NoLigne, NoColonne).Locked = False
        ActiveSheet.Protect .....
    S'il te manque quelque chose, tu dis

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 41
    Points : 11
    Points
    11
    Par défaut boucle, recherche ligne
    Bonjour,

    Les 20 feuilles ont la meme base vide. Par contre lorsque les utilisateurs, renseigneront la page qui leur est dédié, les 20 feuilles ne seront pas plus identiques. Je ne chercherais pas à faire des macros si mes feuilles était identiques. Je ferais un simple copier-coller de ma feuille type.

    Cette base type est de la forme suivante :
    deux lignes de titre
    une ligne exemple ( vide ) avec liste déroulante qui pointe sur un deuxième tableau à gauche.
    J'impose à l'utilisateur avec mon bouton copie de ma ligne exemple de faire un copier-coller à la fin de mon 1 tableau. ( avec une déprotection / protection )
    Il choisit avec les liste déroulante des valeurs qui lui sont imposé ( taille, type et surtout donne )
    Apres avoir inserer sa ligne, je veux qu'il puisse modifie celle qui vient inserer ou une autre . ( deprotection / protection )
    En fait, je veux une protection pour que personne ne puisse faire de modification voulu.

    J'ai 20 feuilles de ce type. C'est pour cela que maintenant. Je cherche à récuperer la valeur de la feuille active et la réutiliser dans mon code copier-coller de ligne. ( peut-etre par un controle de feuille --> boucle )

    De plus , j'ai une 21 feuilles qui me fait la synthese des 20 feuilles de données.
    Je fais un copie coller de mes donnees.

    J'espere etre avoir ete un peu plus clair avec mes explications. Je pensait qu'avec un fichier exemple cela aurait pu suffir.

    Est-ce que mon explication, te suffit pour m'aider.

    Merci pour ta patience et ton aide.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    en fait tu n'as pas besoin de boucle, puisque quand un utilisteur ajoute une ligne, il ne la rajoute pas sur les 20 feuilles. tu a besoin d'une macro que tu appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub création_d'une_nouvelle_ligne()
    je deprotege
    je crée une ligne
    je protege
    end sub
    et pour chaque bouton de chaque page tu crée un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub commandbutton1 quand clik
    run création_d'une_nouvelle_ligne
    end sub

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 41
    Points : 11
    Points
    11
    Par défaut boucle, recherche ligne
    Bonjour,

    Tu va me dire que je suis tetu.
    Mais avec la methode que j'ai trouve. ( voir reponse 5, il y a mes lignes de codes ). Je fais réference à la feuille 2.
    Si je veux faire la meme chose sur feuille 3 etc.. 20.
    Je dois copier n x fois mon code et changais le numéro de feuille.
    Cela fait un programme bcp trop long. C'est pour cela que je cherche à récuprer le numéro de ma feuille active et utiliser ce numéro pour incrémenter la feuille.

    C'est ma premiere piste ... Par contre, cela m'a mis le souk dans ma feuille de synthèse.

    Je suis en train d'essayer une autre piste... Un exemple sur le forum tres interrressante. ( Lire & Ecrire avec scrollbar )
    Par contre, il faut que je trouve une astusce pour remplace les textbox par
    listebox ou combobox. Car je veux obliger mes utilisateurs à choisir dans une liste les valeurs à mettre.

    J'ai pas mal de piste et peu de temps pour tester. Alors vos idees sont les biens venu.

    merci

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    et alors? au moment ou l'utilisateur clique sur le bouton, il est déja sur la feuille x donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Feuil2").Select
    est inutile. pour les 4 lignes suivantes, elle sont identique quelque soit la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Range(Cells(5, 1), Cells(5, 20)).Select
        Selection.Copy
        Cells(Nb_ligne_REP + 1, 1).Select
        ActiveSheet.Paste
    '-------------------------------
    ' Ecriture du numéro de "REP" dans la 1ère colonne
    '--------------------------------
    et la derniere qui sert a écrire le nO de ligne n'est valable que pour cette feuille. si tu te base sur la feuille 2, tu n'auras pas le bon nombre pour la feuille x
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Sheets("Feuil2").Cells(Nb_ligne_REP + 1, 1) = Nb_ligne_REP - 3 est faux
    activesheets.Cells(Nb_ligne_REP + 1, 1) = Nb_ligne_REP - 3 est aussi bien
    End Sub

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    On peut même simplifier ça
    Range(Cells(5, 1), Cells(5, 20)).Select
    Selection.Copy
    Cells(Nb_ligne_REP + 1, 1).Select
    ActiveSheet.Paste
    en mettant ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Range(Cells(5, 1), Cells(5, 20)).Copy _
        Destination:=Cells(Nb_ligne_REP + 1, 1)

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 41
    Points : 11
    Points
    11
    Par défaut boucle, recherche ligne
    Bonjour,

    J'ai simplifie mon code en supprimant le lien avec une feuille. Cela marche tres bien en effet. Finalement pourquoi faire compliquer quand on peut faire simple.

    Par contre je n'ai pas réussi à faire marche ton code avec := .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range(Cells(5, 1), Cells(5, 20)).Copy _
        Destination:=Cells(Nb_ligne_REP + 1, 1)
    .

    J'ai résolu mon etape 1 . Je vais essayer de faire l'etape 2 et 3.

    Merci à tous pour votre aide .

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Curieux, je viens de tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Test()
        Nb_ligne_REP = 100
        Range(Cells(5, 1), Cells(5, 20)).Copy Destination:=Cells(Nb_ligne_REP + 1, 1)
    End Sub
    Et chez moi, ça fonctionne tout comme je le voulais

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA][EXCEL] pb suppression ligne
    Par megapacman dans le forum Access
    Réponses: 2
    Dernier message: 06/04/2006, 13h34
  2. [VBA]Excel - Suppression de ligne
    Par Jseb de Lyon dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 29/01/2006, 15h22
  3. [VBA][Excel]supprimer des lignes vierges
    Par Angel79 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/01/2006, 13h17
  4. [Vba + Excel] requete rechercher en vba
    Par Emcy dans le forum Access
    Réponses: 2
    Dernier message: 14/11/2005, 09h38
  5. [VBA][Excel]Insérer une ligne
    Par loverdose dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2005, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo