Récupération de données VBA
L
Bien le bonjour tout le monde,
Je débute en vba et je souhaite coder un programme qui me permet de retirer que certaines données des fichiers:
PB: il s'arrête au premier fichier et ne fait pas du tout de boucle...
merci d'avance...
Sub CombinerPlusieursFeuilleDansClasseurExistant()
On Error GoTo eh
'Déclaration des variables pour contenir les objets requis
Dim wbDestination As Workbook
Dim wbSource As Workbook
Dim wsDestination As Worksheet
Dim wb As Workbook
Dim sh As Worksheet
Dim strSheetName As String
Dim strDestName As String
Dim iRws As Integer
Dim iCols As Integer
Dim totRws As Integer
Dim rngEnd As String
Dim rngSource As Range
'Défini le classeur actif en tant que classeur de destination
Set wbDestination = ActiveWorkbook
'Récupère le nom du classeur actif
strDestName = wbDestination.Name
'Désactive la mise à jour de l'écran pour accélérer l'exécution
Application.ScreenUpdating = False
'Création d'une nouvelle feuille de destination dans le classeur actif
Application.DisplayAlerts = False
'Ignore les erreurs dans le cas où la feuille n'existerait pas
On Error Resume Next
ActiveWorkbook.Sheets("Consolidation").Delete
'Réinitialise la gestion des erreurs initiale
On Error GoTo eh
Application.DisplayAlerts = True
'Ajoutes une nouvelle feuille au classeur
With ActiveWorkbook
Set wsDestination = .Sheets.Add(After:=.Sheets(.Sheets.Count))
wsDestination.Name = "Consolidation"
End With
'Boucle sur chaque fichier ouvert pour récupérer les données
For Each wb In Application.Workbooks
If wb.Name <> strDestName And wb.Name <> "PERSONAL.XLSB" Then
Set wbSource = wb
For Each sh In wbSource.Worksheets
'Suppression des images
Dim Img As Object
For Each Img In ActiveSheet.Pictures
Img.Delete
Next Img
'Initialisation
Range("A1:A100").UnMerge
Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
'Filtre
With ActiveSheet.UsedRange
For j = .Columns.Count To 1 Step -1
Set C = .Columns(j)
If WorksheetFunction.CountIf(C, "code") + WorksheetFunction.CountIf(C, "qté") = 0 Then .Columns(j).Delete
Next
End With
'Supprime les lignes des cellules vides de la colonne Qté
For i = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
If Cells(i, 2) = "" Then
Cells(i, 2).EntireRow.Delete
End If
Next i
'Supprime les doublons au sein d'une même page
For i = Range("A1").End(xlDown).Row To 2 Step -1
If Range("A" & i).Value > "" Then
If Application.WorksheetFunction.CountIf(Range("A1:A" & Range("A65535").End(xlUp).Row), _
Range("A" & i).Value) > 1 Then Range("A" & i).EntireRow.Delete: i = i + 1
End If
Next i
'Récupère le nombre de rangée dans le feuille
sh.Activate
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Activate
iRws = ActiveCell.Row
iCols = ActiveCell.Column
rngEnd = sh.Cells(iRws, iCols).Address
Set rngSource = sh.Range("A1:" & rngEnd)
'Trouves la dernière rangée dans la feuille de destination
wbDestination.Activate
Set wsDestination = ActiveSheet
wsDestination.Cells.SpecialCells(xlCellTypeLastCell).Select
totRws = ActiveCell.Row
'Vérifie qu'il y a assez de rangée libre dans la feuille de destination pour coller les données
If totRws + rngSource.Rows.Count > wsDestination.Rows.Count Then
MsgBox "There are not enough rows to place the data in the Consolidation worksheet."
GoTo eh
End If
'Ajoute une rangée pour coller les données dans la prochaine rangée vide
If totRws <> 1 Then totRws = totRws + 1
rngSource.Copy Destination:=wsDestination.Range("A" & totRws)
Next sh
End If
Next wb
'Fermeture des classeurs ouverts à l'exception du classeur actif et du classeur personnel
For Each wb In Application.Workbooks
If wb.Name <> strDestName And wb.Name <> "PERSONAL.XLSB" Then
wb.Close False
End If
Next wb
'Nettoyage des objets pour libérer la mémoire
Set wbDestination = Nothing
Set wbSource = Nothing
Set wsDestination = Nothing
Set rngSource = Nothing
Set wb = Nothing
'Active la mise à jour de l'écran
Application.ScreenUpdating = True
Exit Sub
eh:
MsgBox Err.Description
End Subbonjour,
1) la boucle se fait sur les classeurs ouverts et uniquement les classeurs ouverts (et à mon avis correctement)
2) il manque le nom de parent pour certains de tes objets (range, cells et columns), sinon cela fait référence au parent actif (feuille, classeur, ...)
voici une proposition de correction (non testée)
Sub CombinerPlusieursFeuilleDansClasseurExistant()
On Error GoTo eh
'Déclaration des variables pour contenir les objets requis
Dim wbDestination As Workbook
Dim wbSource As Workbook
Dim wsDestination As Worksheet
Dim wb As Workbook
Dim sh As Worksheet
Dim strSheetName As String
Dim strDestName As String
Dim iRws As Integer
Dim iCols As Integer
Dim totRws As Integer
Dim rngEnd As String
Dim rngSource As Range
'Défini le classeur actif en tant que classeur de destination
Set wbDestination = ActiveWorkbook
'Récupère le nom du classeur actif
strDestName = wbDestination.Name
'Désactive la mise à jour de l'écran pour accélérer l'exécution
Application.ScreenUpdating = False
'Création d'une nouvelle feuille de destination dans le classeur actif
Application.DisplayAlerts = False
'Ignore les erreurs dans le cas où la feuille n'existerait pas
On Error Resume Next
ActiveWorkbook.Sheets("Consolidation").Delete
'Réinitialise la gestion des erreurs initiale
On Error GoTo eh
Application.DisplayAlerts = True
'Ajoutes une nouvelle feuille au classeur
With ActiveWorkbook
Set wsDestination = .Sheets.Add(After:=.Sheets(.Sheets.Count))
wsDestination.Name = "Consolidation"
End With
'Boucle sur chaque fichier ouvert pour récupérer les données
For Each wb In Application.Workbooks
If wb.Name <> strDestName And wb.Name <> "PERSONAL.XLSB" Then
Set wbSource = wb
For Each sh In wbSource.Worksheets
'Suppression des images
Dim Img As Object
For Each Img In sh.Pictures
Img.Delete
Next Img
'Initialisation
sh.Range("A1:A100").UnMerge
sh.Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
'Filtre
With sh.UsedRange
For j = .Columns.Count To 1 Step -1
Set C = .Columns(j)
If WorksheetFunction.CountIf(C, "code") + WorksheetFunction.CountIf(C, "qté") = 0 Then .Columns(j).Delete
Next
End With
'Supprime les lignes des cellules vides de la colonne Qté
For i = sh.Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
If sh.Cells(i, 2) = "" Then
sh.Cells(i, 2).EntireRow.Delete
End If
Next i
'Supprime les doublons au sein d'une même page
For i = sh.Range("A1").End(xlDown).Row To 2 Step -1
If sh.Range("A" & i).Value > "" Then
If Application.WorksheetFunction.CountIf(sh.Range("A1:A" & Range("A65535").End(xlUp).Row), _
sh.Range("A" & i).Value) > 1 Then sh.Range("A" & i).EntireRow.Delete: i = i + 1
End If
Next i
'Récupère le nombre de rangée dans le feuille
sh.Activate
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Activate
iRws = ActiveCell.Row
iCols = ActiveCell.Column
rngEnd = sh.Cells(iRws, iCols).Address
Set rngSource = sh.Range("A1:" & rngEnd)
'Trouves la dernière rangée dans la feuille de destination
wbDestination.Activate
Set wsDestination = ActiveSheet
wsDestination.Cells.SpecialCells(xlCellTypeLastCell).Select
totRws = ActiveCell.Row
'Vérifie qu'il y a assez de rangée libre dans la feuille de destination pour coller les données
If totRws + rngSource.Rows.Count > wsDestination.Rows.Count Then
MsgBox "There are not enough rows to place the data in the Consolidation worksheet."
GoTo eh
End If
'Ajoute une rangée pour coller les données dans la prochaine rangée vide
If totRws <> 1 Then totRws = totRws + 1
rngSource.Copy Destination:=wsDestination.Range("A" & totRws)
Next sh
End If
Next wb
'Fermeture des classeurs ouverts à l'exception du classeur actif et du classeur personnel
For Each wb In Application.Workbooks
If wb.Name <> strDestName And wb.Name <> "PERSONAL.XLSB" Then
wb.Close False
End If
Next wb
'Nettoyage des objets pour libérer la mémoire
Set wbDestination = Nothing
Set wbSource = Nothing
Set wsDestination = Nothing
Set rngSource = Nothing
Set wb = Nothing
'Active la mise à jour de l'écran
Application.ScreenUpdating = True
Exit Sub
eh:
MsgBox Err.Description
End Sub