Bonjour le Forum ! 🙂
Je découvre un peu VBA depuis quelques semaines mais je suis confronté à un obstacle.
Je vais essayer d'être le plus clair possible car je ne suis pas sur qu'un fichier exemple soit très utile dans mon cas (mais corrigez moi si je me trompe).
Voilà ce que j'essaye de faire : je dispose de plusieurs fichiers clients, tous similaires, avec une feuille "Database" dans laquelle on trouve des intitulés de colonnes et simplement des lignes contenant des données, chaque ligne correspondant à une "visite".
Je souhaite ajouter les unes en dessous des autres toutes ces visites dans un autre fichier Excel, mais contenant cette fois tous les clients.
Ma méthode : Mettre tous les fichiers clients dans un dossier (dont le chemin se trouvera dans la case B1 du fichier-destination) et utiliser une macro pour récupérer les données dans tous les fichiers de ce dossier pour les ajouter les unes en dessous des autres.
J'ai donc bricolé un code avec ce que j'ai trouvé à droite à gauche. Il n'est surement pas élégant du tout mais ce code fonctionne quand tous les fichiers sont fermés. J'ai donc voulu ensuite ajouter une façon de gérer le cas des fichiers qui sont ouverts : je détecte si le fichier est ouvert/fermé, entre le résultat dans une variable Boolean et utilise IF pour gérer les deux cas différemment. Il y a d'autres méthodes que celle que j'ai utilisé mais je n'ai pas réussi à utiliser la gestion d'erreur et GoTo.
Bref, voilà mon code :
	
	
	
	
	
		
Voilà mon problème : La macro fonctionne toujours quand les différents fichiers-source sont fermés, mais parfois, quand l'un d'eux est ouvert, la macro ne me copie dans mon fichier-destination qu'un nombre tronqué de lignes. En utilisant MsgBox j'ai pas voir que l'utilisation du "CopySource.Columns.Count" (et donc probablement la méthode pour trouver la dernière ligne remplie de mes fichiers clients), qui marche bien par ailleurs, déconnait un brin sur les fichiers ouverts.
Je ne comprends pas pourquoi, et j'aimerais bien comprendre... voire trouver une solution! Si certains d'entre vous peuvent m'aider à y voir plus clair...
Merci à vous ! 🙂 N'hésitez pas si vous avez des questions sur le pourquoi de mon code...
Et bien sur, si la méthode vous parait mauvaise, je suis complètement ouvert à d'autres pistes qui me mèneraient vers ce que je voudrais faire !
	
		
			
		
		
	
				
			Je découvre un peu VBA depuis quelques semaines mais je suis confronté à un obstacle.
Je vais essayer d'être le plus clair possible car je ne suis pas sur qu'un fichier exemple soit très utile dans mon cas (mais corrigez moi si je me trompe).
Voilà ce que j'essaye de faire : je dispose de plusieurs fichiers clients, tous similaires, avec une feuille "Database" dans laquelle on trouve des intitulés de colonnes et simplement des lignes contenant des données, chaque ligne correspondant à une "visite".
Je souhaite ajouter les unes en dessous des autres toutes ces visites dans un autre fichier Excel, mais contenant cette fois tous les clients.
Ma méthode : Mettre tous les fichiers clients dans un dossier (dont le chemin se trouvera dans la case B1 du fichier-destination) et utiliser une macro pour récupérer les données dans tous les fichiers de ce dossier pour les ajouter les unes en dessous des autres.
J'ai donc bricolé un code avec ce que j'ai trouvé à droite à gauche. Il n'est surement pas élégant du tout mais ce code fonctionne quand tous les fichiers sont fermés. J'ai donc voulu ensuite ajouter une façon de gérer le cas des fichiers qui sont ouverts : je détecte si le fichier est ouvert/fermé, entre le résultat dans une variable Boolean et utilise IF pour gérer les deux cas différemment. Il y a d'autres méthodes que celle que j'ai utilisé mais je n'ai pas réussi à utiliser la gestion d'erreur et GoTo.
Bref, voilà mon code :
		Code:
	
	
	Sub UPDATING()
    Dim FolderWay As String
    Dim VarFileName As String
    Dim VarFile As Workbook
    Dim CopySource As Range
    
    Dim Flag As Boolean
    Dim Wb As Excel.Workbook
    Dim Appli As Excel.Application
  
   
Application.ScreenUpdating = False
Set Appli = GetObject(, "Excel.Application")
    Range("A8:AH1000").ClearContents
    
'le chemin du dossier à utiliser se trouve dans la case B1
    FolderWay = Range("B1").Value & "\" & "" 
    VarFileName = Dir(FolderWay & "*.xls")
    FileCount = 0
'la boucle s'arrête quand on a utilisé tous les fichiers du dossier
     Do While Not VarFileName = ""     
       
 'la boucle suivante détecte si le fichier est ouvert
            Flag = False
            For Each Wb In Appli.Workbooks
                If Wb.Name = VarFileName Then
                Flag = True
                End If
            Next Wb
            If Flag = True Then       'on passe ici si le fichier est ouvert
                    Set VarFile = Workbooks(VarFileName)
                    Set CopySource = VarFile.Sheets("Database").Range("A8:AH" & Range("F65536").End(xlUp).Row)
        
                    ThisWorkbook.Sheets("List").Range("A" & ThisWorkbook.Sheets("List").Range("F65536").End(xlUp).Offset(1, 0).Row).Resize(CopySource.Rows.Count, CopySource.Columns.Count) _
                        = CopySource.Value
        
            Else                             'ici si le fichier est fermé    
                    Set VarFile = Application.Workbooks.Open(FolderWay & VarFileName)
                    Set CopySource = VarFile.Sheets("Database").Range("A8:AH" & Range("F65536").End(xlUp).Row)
        
                    ThisWorkbook.Sheets("List").Range("A" & ThisWorkbook.Sheets("List").Range("F65536").End(xlUp).Offset(1, 0).Row).Resize(CopySource.Rows.Count, CopySource.Columns.Count) _
                        = CopySource.Value
   
                    VarFile.Close SaveChanges:=False
        
            End If
             
    VarFileName = Dir
    Loop
Application.ScreenUpdating = True
End Sub
	Voilà mon problème : La macro fonctionne toujours quand les différents fichiers-source sont fermés, mais parfois, quand l'un d'eux est ouvert, la macro ne me copie dans mon fichier-destination qu'un nombre tronqué de lignes. En utilisant MsgBox j'ai pas voir que l'utilisation du "CopySource.Columns.Count" (et donc probablement la méthode pour trouver la dernière ligne remplie de mes fichiers clients), qui marche bien par ailleurs, déconnait un brin sur les fichiers ouverts.
Je ne comprends pas pourquoi, et j'aimerais bien comprendre... voire trouver une solution! Si certains d'entre vous peuvent m'aider à y voir plus clair...
Merci à vous ! 🙂 N'hésitez pas si vous avez des questions sur le pourquoi de mon code...
Et bien sur, si la méthode vous parait mauvaise, je suis complètement ouvert à d'autres pistes qui me mèneraient vers ce que je voudrais faire !
			
				Dernière édition: