Macro Visual Basic (VBA), rechercheV et correction

Basjero0044 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour,

J'ai une modification à effectuer sur à peu près 1000 fichiers Excel (à la volée sans les ouvrir) dont les extensions varient entre .xls et .xlsx. Cette modification doit s'opérer uniquement sur la feuille nommée "Dossier" et consiste à remplacer le texte de la cellule à droite de celle nommée "Documents clients" par le texte "N/A".

Jusque là, ça va à peu près... Ma difficulté est bien évidemment que cette paire de cellules n'est jamais positionnée au même endroit selon les fichiers et que les extensions de fichiers diffèrent entre du xls et du xlsx... Je dois donc faire appel à une fonction rechercheV ou équivalent sous Visual Basic. Et là, je décroche !

Voici ma ligne de code que j'ai écrite mais qui fonctionne uniquement si la cellule à modifier est toujours située au même endroit (en F15) dans un fichier .xls uniquement

Option Explicit
Sub test()
Dim r As String, f As String, wb As Workbook
r = ThisWorkbook.Path & "\ici\"
f = Dir(r & "*.xlsx")
Do While f <> ""
    If f <> ThisWorkbook.Name Then
        Set wb = Workbooks.Open(r & f)
        wb.Worksheets("Dossier").Range("f15").Value = "hello"
        ActiveWorkbook.Save
        wb.Close False
        End If
    f = Dir
Loop
End Sub

J'ai déposé mes fichiers au lien suivant qui contient :

- La macro sous Excel nommée Macro_changement masse excel.xlsm

- Un dossier nommé "ici" avec 5 fichiers exemples contenant les 2 cellules citées au dessus

- Une macro supplémentaire pour imprimer en masse nommée Macro_Impression multi fichiers d'une feuille.xlsm

https://drive.google.com/drive/folders/1z8w14_2l8jtD9O07fR2Lmb8FfENmn0LL?usp=sharing

Je recherche désespérément la solution mais sans succès. Appel aux génies car je ne suis pas Black Belt en VBA !

Merci d'avance,

5 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     

    Bonjour,

    je ne fais que la partie remplacement car on ne peut boucler sur les fichiers de ton cloud

    Sub test()
        Dim r As String, f As String, wb As Workbook
        Dim c As Range, erreur(1 To 1000, 1 To 1), nbErr As Long
        Set wb = Workbooks("dhj.xls.xlsx") 'remplacer par l'ouverture d'un fichier
        With wb.Worksheets("Dossier")
            Set c = .Cells.Find("Documents clients", , xlValues, xlWhole)
            If Not c Is Nothing Then
                c.Offset(, 1) = "N/A"
            Else
                nbErr = nbErr + 1
                erreur(nbErr, 1) = wb.Name
            End If
        End With
    '    If nbErr > 0 Then [C2].Resize(1000) = erreur ' ecriture erreurs, choisir feuille et colonne
        '            ActiveWorkbook.Save
        '            wb.Close False
    End Sub

    et tu devrais remplacer f = Dir(r & "*.xlsx") par f = Dir(r & "*.xls*")
    eric


    0
    1. Basjero0044 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
       

      Bonjour Eric,

      Merci beaucoup mais... ça ne fonctionne pas. Je pense que ça vient de moi. Je ne maîtrise rien à VBA.

      0
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     

    Il faut l'intégrer à ton code qui ouvre les fichiers du répertoire.
    Tu vois que le nom du fichier que j'ai utilisé pour les tests est écrit en dur


    0
    1. Basjero0044 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
       

      Ca y est ça fonctionne. Je l'avais intégré mais pas dans les règles de l'art. Un grand merci à toi Eric.

      Pour ceux qui souhaite s'inspirer de cette macro la voici...

      Option Explicit
      Sub test()
      Dim r As String, f As String, wb As Workbook
      Dim c As Range, erreur(1 To 1000, 1 To 1), nbErr As Long
      r = ThisWorkbook.Path & "\ici\"
      f = Dir(r & "*.xls") 'Remplacer par l'extension ".xls" par ".xlsx" si nécessaire
      Do While f <> ""
          If f <> ThisWorkbook.Name Then
              Set wb = Workbooks.Open(r & f)
              With wb.Worksheets("Dossier")
                  Set c = .Cells.Find("Documents clients", , xlValues, xlWhole)
                  If Not c Is Nothing Then
                      c.Offset(, 1) = "N/A"
                  Else
                      nbErr = nbErr + 1
                      erreur(nbErr, 1) = wb.Name
                  End If
              End With
                  ActiveWorkbook.Save
                  wb.Close False
          End If
          f = Dir
      Loop
      End Sub

      0
  3. Basjero0044 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
     

    Je souhaiterai faire maintenant la même chose avec un logo positionné sur toutes les feuilles des 1000 fichiers Excel. Je souhaiterai changer ce logo (image) par un nouveau (image).

    Est-ce possible ?

    0
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     

    Bonjour,

    je t'avais d'essayer avec :

    Dir(r & "*.xls*")

    avec une * pour traiter *.xls et *.xlsm

    Pour ta nouvelle question tu dois démarrer un nouveau topic avec plus de détails.
    Et déposer un fichier de travail sur cjoint.com et coller le lien fourni dans ton post.
    eric
     


    0
    1. Basjero0044 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
       

      Bonjour Eric, bon ma macro fonctionne parfaitement et je te remercie de ton aide. Cependant, je souhaiterai l'améliorer car bien évidemment, je viens de m'apercevoir de quelque problème à son exécution :

      1/ la feuille Excel que j'appelle dans cette macro n'a pas toujours le même nom. Parfois, elle s'appelle "Dossier", parfois "Dossier " (avec un espace après le r) et parfois même " Dossier" (avec un espace avant le D). Du coup, j'ai un message d'erreur lorsque j'exécute la macro. Comment faire en sorte qu'elle fonctionne qu'elle que soit la syntaxe de la feuille ?

      If f <> ThisWorkbook.Name Then
              Set wb = Workbooks.Open(r & f)
              With wb.Worksheets("Dossier")
                  Set c = .Cells.Find("Documents clients", , xlValues, xlWhole)

      2/ Je souhaiterai que la macro s'exécute dans des fichier contenus dans des sous-dossier au dossier "ici".

      Sub test()
      Dim r As String, f As String, wb As Workbook
      Dim c As Range, erreur(1 To 1000, 1 To 1), nbErr As Long
      r = ThisWorkbook.Path & "\ici\"
      f = Dir(r & "*.xls") 'Remplacer par l'extension ".xls" par ".xlsx" si nécessaire

      Le plus important serait de résoudre le 1/ car pour le 2/ j'ai une solution (un peu chiante) qui consiste à extraire chaque fichier de son dossier en les plaçant la racine.

      cdlt,

      Jérôme

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     

    Bonjour,

    ce qu'il faut c'est agir à la source et ne pas accepter de telles erreurs.
    Si tu refuses leur fichier en leur demandant de refaire correctement ils apprendront vite.
     

    Renommer les feuilles le temps qu'ils comprennent :

        Dim sh As Worksheet
        For Each sh In wb.Worksheets
            sh.Name = Trim(sh.Name) ' supprime les espaces début et fin de chaine
            ' sh.Name = Application.Trim(sh.Name) ' supprime aussi les espaces multiples entre mots pour n'en laisser q'un
        Next sh

    à toi de voir si tu sauvegarde le fichier corrigé...

    Pour le 2) tu trouveras sans difficulté sur google des exemples de balayage des sous-dossiers
    eric


    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       

      de rien...

      0