VBA error 13 type missmatch

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?

  1. 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.

  1. lngLastRow = .UsedRange.Rows.Count

Trouvez la rangée de la dernière cellule utilisée sur la feuille

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...

Trouvez la rangée de la dernière cellule utilisée dans la colonne "B"

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 :

  1. Propriété Application.Columns
  2. Méthode Range.Find