Je travaille avec trois feuilles de lignes 500K + sur cinq classurs différents et je suis en train d'extraire datatables dont j'ai besoin J'ai trouvé le code suivant:
Sub Macro3() Dim lngFirstRow As Long, lngLastRow As Long, cRow As Long, lngNextDestRow As Long Dim jbs As Date Dim shSrc As Worksheet, shDest As Worksheet Set shDest = ActiveWorkbook.Sheets("Sheeet1") '''Feuille de destination (sheetDestination) lngNextDestRow = 2 For Each shSrc In ThisWorkbook.Worksheets Nom = shSrc.Name If Nom <> "Sheeet2" Then With shSrc lngFirstRow = 2 lngLastRow = .Cells.Find(What:="*", after:=.Cells.Cells(1), LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row For cRow = lngFirstRow To lngLastRow Step 1 jbs = .Cells(cRow, 2) If jbs <> .Cells(cRow - 1, 2).Value Then .Range("B" & cRow).Copy Destination:=shDest.Range("A" & lngNextDestRow) .Range("D" & cRow).Copy Destination:=shDest.Range("B" & lngNextDestRow) .Range("D" & cRow + 1).Copy Destination:=shDest.Range("C" & lngNextDestRow) .Range("E" & cRow).Copy Destination:=shDest.Range("D" & lngNextDestRow) .Range("E" & cRow + 1).Copy Destination:=shDest.Range("E" & lngNextDestRow) .Range("F" & cRow).Copy Destination:=shDest.Range("F" & lngNextDestRow) .Range("F" & cRow + 1).Copy Destination:=shDest.Range("G" & lngNextDestRow) lngNextDestRow = lngNextDestRow + 1 End If Next cRow End With End If Next shSrc End Sub
Cela fait ce dont j'ai besoin. Je le modifie peu à peu pour rendre plus rapide le traitement des cinq classurs. Ici, je extrayons datatables dans une nouvelle feuille sur le même classur.
1) Cela semble fonctionner, mais après que tout le process est terminé, je continue à get "jbs = .Cells (cRow, 2)" en surbrillance et un type d'erreur 13. Une idée de la façon de résoudre ce problème?
2) Quelqu'un m'a fourni cette ligne:
lngLastRow = .Cells.Find(What:="*", after:=.Cells.Cells(1), LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
Existe-t-il un moyen de find le nombre de la dernière ligne remplie dans une list de données?
jbs
est déclaré Date
. Lorsque vous obtenez votre erreur, .Cells(cRow,2)
fait reference à une cellule qui ne contient pas de date ou de point flottant pouvant être converti en date. En supposant que vous ne vous occupez pas du type de valeurs que vous regardez dans la colonne 2, replace:
jbs = .Cells(cRow, 2) If jbs <> .Cells(cRow - 1, 2).Value Then
Avec:
If .Cells(cRow, 2) <> .Cells(cRow - 1, 2) Then
Cela élimine la déclaration de jbs
et le typage tout à fait.
lngLastRow = .UsedRange.Rows.Count
Le code de lngLastRow
vous utilisez, renverra une ligne de la dernière cellule utilisée sur la feuille. Pas nécessairement la dernière cellule utilisée dans la colonne "B" que vous comparez plus tard dans votre code, par exemple ici: If jbs <> .Cells(cRow - 1, 2).Value Then...
Si vous souhaitez find la dernière ligne utilisée dans la colonne "B" avec cette méthode, utilisez: lngLastRow = .columns(2).Find(What:="*", LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
Cela devrait se débarrasser de l'erreur de la boucle, car elle s'arrêtera correctement quand elle devrait.
Sources :