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: