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 :

Copier les lignes qui contiennent une valeur


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 49
    Points
    49
    Par défaut Copier les lignes qui contiennent une valeur
    Bonjour ,
    Je souhaite chercher dans la colonne H les cellules qui contiennent "http" ou "https" puis copier leurs lignes dans une autre feuille d'un autre classeur , voir le code ci dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Partie les lignes serveurs
    Set wst = Workbooks("gestion.xls").Worksheets("Tableau_Proxy")
    For Each wb In Workbooks 'on parcourt tous les classeurs ouverts
    If UCase(wb.Name) <> UCase("gestion.xls") Then
    derlignee = wst.Range("A65536").End(xlUp).Row + 1
    derlignes = wb.Sheets("2. Servers").Range("A" & Rows.Count).End(xlUp).Row
     
    'on recherche la première ligne contenant "http"
    Set re = wb.Sheets("2. Servers").Range("H:H" & derlignes).Find("http", lookat:=xlPart)
    If Not re Is Nothing Then
    wb.Sheets("2. Servers").Range("B" & re.Row & ":V" & derlignes).Copy wst.Range("A" & derlignee)
    End If
    le souci avec ce code c'est qu'il cherche "http" mais dés qu'il le trouve il copie toutes les autres lignes qui sont après cette ligne peu n'importe le contenu ! par contre il faut q'il copie que les lignes qui contiennent "http" et "https"
    Merci pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Comme ceci peut-être ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set re = wb.Sheets("2. Servers").Columns("H").Find("http", lookat:=xlPart)
       If Not re Is Nothing Then
          wb.Sheets("2. Servers").Range("B" & re.Row & ":V" & re.Row).Copy wst.Range("A" & derlignee)
       End If
    Et s'il y a plusieurs occurences à copier, il faudra que tu utilises FindNext (voir ton aide - F1)
    MPi²

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 49
    Points
    49
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Set re = wb.Sheets("2. Servers").Range("H6:H" & derlignes).Find("http", lookat:=xlPart)
    If Not re Is Nothing Then
    wb.Sheets("2. Servers").Range("B" & re.Row & ":V" & re.Row).Copy wst.Range("A" & derlignee)
    End If
    maintenant il copie que la première ligne qui contient "http" le souci ce qu'il ne continue pas à tester les autres lignes qui suivent !

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 49
    Points
    49
    Par défaut
    j'ai trouver quelque chose d'utile je pense mais je n'arrive pas à l'interpréter à mon cas :
    un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With Worksheets(1).Range("a1:a500")
        Set c = .Find(2, lookin:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                c.Value = 5
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Ça devrait ressembler à ça.
    Prend le temps d'essayer de comprendre ce que fait chaque ligne.
    Utilise le pas à pas (F8) si nécessaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Set re = wb.Sheets("2. Servers").Columns("H").Find("http", lookat:=xlPart)
        If Not re Is Nothing Then
           firstAddress = re.Address
           Do
              derlignee = wst.Range("A65536").End(xlUp).Row + 1
              wb.Sheets("2. Servers").Range("B" & re.Row & ":V" & re.Row).Copy wst.Range("A" & derlignee)
     
              Set re = wb.Sheets("2. Servers").Columns("H").FindNext(re)
           Loop While Not re Is Nothing And re.Address <> firstAddress
        End If
    Set re = Nothing
    MPi²

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 49
    Points
    49
    Par défaut
    Merci bien , voici le code final qui a fonctionné
    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
     'Partie les lignes serveurs
      Set wst = Workbooks("gestion.xls").Worksheets("Tableau_Proxy")
        For Each wb In Workbooks 'on parcourt tous les classeurs ouverts
      If UCase(wb.Name) <> UCase("gestion.xls") Then
            derlignee = wst.Range("A65536").End(xlUp).Row + 1
            derlignes = wb.Sheets("2. Servers").Range("A" & Rows.Count).End(xlUp).Row
                    'on recherche les lignes contenant "http"
     
            With wb.Sheets("2. Servers")
                Set re = wb.Sheets("2. Servers").Range("H1:H" & derlignes).Find("http", lookat:=xlPart)
                If Not re Is Nothing Then
                    firstAddress = re.Address
                    Do
                        wb.Sheets("2. Servers").Range("B" & re.Row & ":V" & re.Row).Copy wst.Range("A" & derlignee)
                        derlignee = derlignee + 1
                        Set re = .Range("H1:H" & derlignes).FindNext(re)
                    Loop While Not re Is Nothing And re.Address <> firstAddress
                End If
            End With
    maintenant je souhaite ajouter "https" : je veux les lignes ou on trouve "http" ou "https" Merci , j'ai fait ça mais ça donne des répétitions :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    'Partie les lignes serveurs
      Set wst = Workbooks("gestion.xls").Worksheets("Tableau_Proxy")
        For Each wb In Workbooks 'on parcourt tous les classeurs ouverts
      If UCase(wb.Name) <> UCase("gestion.xls") Then
            derlignee = wst.Range("A65536").End(xlUp).Row + 1
            derlignes = wb.Sheets("2. Servers").Range("A" & Rows.Count).End(xlUp).Row
                    'on recherche les lignes contenant "http"
     
            With wb.Sheets("2. Servers")
                Set re = wb.Sheets("2. Servers").Range("H1:H" & derlignes).Find("http", lookat:=xlPart)
                If Not re Is Nothing Then
                    firstAddress = re.Address
                    Do
                        wb.Sheets("2. Servers").Range("B" & re.Row & ":V" & re.Row).Copy wst.Range("A" & derlignee)
                        derlignee = derlignee + 1
                        Set re = .Range("H1:H" & derlignes).FindNext(re)
                    Loop While Not re Is Nothing And re.Address <> firstAddress
                End If
            End With
     
            'on recherche les lignes contenant "https"
           With wb.Sheets("2. Servers")
                Set re1 = wb.Sheets("2. Servers").Range("H1:H" & derlignes).Find("https", lookat:=xlPart)
                If Not re1 Is Nothing Then
                    firstAddress = re1.Address
                    Do
                        wb.Sheets("2. Servers").Range("B" & re1.Row & ":V" & re1.Row).Copy wst.Range("A" & derlignee)
                        derlignee = derlignee + 1
                        Set re1 = .Range("H1:H" & derlignes).FindNext(re1)
                    Loop While Not re1 Is Nothing And re1.Address <> firstAddress
                End If
            End With
     
        End If
     
    Next

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Si tu utilise xlPart avec une recherche sur HTTP, ça devrait ressortir les HTTPS en même temps...
    MPi²

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 49
    Points
    49
    Par défaut
    ouiiii , merci j'ai pas fais attention excellente journée

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 49
    Points
    49
    Par défaut
    maintenant quand je souhaite le résultat contraire : toute les lignes qui ne contiennent pas ( "http" ou "https") , j'ai mis ce code , mais ça donne un résultat vide !
    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
    'Partie les lignes serveurs
      Set wst = Workbooks("gestion.xls").Worksheets("Tableau_Proxy")
       For Each wb In Workbooks 'on parcourt tous les classeurs ouverts
      If UCase(wb.Name) <> UCase("gestion.xls") Then
       derlignee = wst.Range("A65536").End(xlUp).Row + 1
       derlignes = wb.Sheets("2. Servers").Range("A" & Rows.Count).End(xlUp).Row
     
     
            'on recherche les lignes contenant "http et https"
           With wb.Sheets("2. Servers")
            Set re = wb.Sheets("2. Servers").Range("H1:H" & derlignes).Find("http", lookat:=xlPart)
            If re Is Nothing Then
            firstAddress = re.Address
            Do
            wb.Sheets("2. Servers").Range("B" & re.Row & ":V" & re.Row).Copy wst.Range("A" & derlignee)
            derlignee = derlignee + 1
            Set re = .Range("H1:H" & derlignes).FindNext(re)
            Loop While  re Is Nothing And re.Address <> firstAddress
            End If
            End With
            End If
            Next

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Le problème, c'est que Find recherche des données existantes.
    Dès qu'un HTTP existe il ne retournera pas autre chose.

    Il te faudrait alors boucler chaque ligne et utiliser Instr() pour voir si le mot HTTP est là ou non.

    Autrement, tu pourrais travailler avec les filtres automatiques <>"*HTTP*" pour masquer tous les HTTP et tu utilises SpecialCells(XlCellTypeVisible) pour lire les lignes visibles seulement (voir l'aide)
    MPi²

  11. #11
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Citation Envoyé par coolmomodu31 Voir le message
    maintenant quand je souhaite le résultat contraire : toute les lignes qui ne contiennent pas ( "http" ou "https")
    Bonjour,

    voir l'aide VBA concernant la fonction Filter par exemple …

    Ou bien, aussi valable pour la problématique d'origine, via un filtre automatique comme dans cette discussion
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 49
    Points
    49
    Par défaut
    Bonjour,
    qu'est ce que vous pensez de ça :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Sub ACL_Servers_Lines()
     
    Dim ret As Integer
    ret = MsgBox("Souhaitez-Vous toutes les Lignes (Servers) ?", vbYesNo, " ATOS / RENAULT (EIS) ")
    If ret = vbNo Then
    Exit Sub
    Else
     
     
    ' wst = feuille tableau du classeur gestion
     
    Set wst = Workbooks("gestion.xls").Worksheets("Tableau_ACL")
    derligne = wst.Range("A65536").End(xlUp).Row + 1
    Sheets("Tableau_ACL").Activate
    Cells(derligne, 1) = Range("dt").Value
    Cells(derligne, 2) = Range("demandeur").Value
    Cells(derligne, 3) = Range("adresse").Value
    Cells(derligne, 4) = Range("Statut").Value
    Cells(derligne, 5) = Range("CDS").Value
     
     Range("demandeur").Value = ""
     Range("adresse").Value = ""
     Range("Statut").Value = ""
     Range("CDS").Value = ""
     
     'Partie les lignes serveurs
     
    For Each wb In Workbooks 'on parcourt tous les classeurs ouverts
    If UCase(wb.Name) <> UCase("gestion.xls") Then
    derlignee = wst.Range("A65536").End(xlUp).Row + 1
    wb.Sheets("2. Servers").Range("B6:V100").Copy wst.Range("A" & derlignee)
    End If
    Next
    End If
     
    'supprimmer les lignes contenent "http"
    For i = dernligne To 1 Step -1
    If Workbooks("gestion.xls").Worksheets("Tableau_ACL").Cells(i, 7) = "http" Then
    Workbooks("gestion.xls").Worksheets("Tableau_ACL").Cells(i, 7).EntireRow.Delete
    End If
    Next i
     
    End Sub

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Difficile à dire sans tout connaître ce que tu fasi, maias ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wb.Sheets("2. Servers").Range("B6:V100").Copy wst.Range("A" & derlignee)
    Est-ce que c'est toujours B6:V100 ?

    Et ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Workbooks("gestion.xls").Worksheets("Tableau_ACL").Cells(i, 7) = "http" Then
    Workbooks("gestion.xls").Worksheets("Tableau_ACL").Cells(i, 7).EntireRow.Delete
    Est-ce que la cellule ne contient que HTTP ?
    Parce qu'on parlait de HTTPS aussi...

    Alors peut-être faudrait-il utiliser Instr() pour vérifier la présence de HTTP, ce qui inclurait HTTPS et d'autres mots...
    MPi²

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/01/2014, 11h38
  2. [XL-2007] Retrouver toutes les lignes qui ont une valeur identique dans la colonne A
    Par bartimeus35 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/06/2012, 17h47
  3. Réponses: 2
    Dernier message: 23/12/2010, 18h35
  4. Réponses: 17
    Dernier message: 09/02/2010, 16h22
  5. commande find: trouver les fichiers qui contiennent une chaine de caractère
    Par hammag dans le forum Administration système
    Réponses: 3
    Dernier message: 18/05/2008, 13h19

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