J'essaie de définir une plage dynamique sur une variable pour copier la plage sur une autre feuille.
Sur la dernière ligne, j'obtiens
"Erreur d'exécution '91', variable objet ou avec variable de bloc non définie"
Tout le reste fonctionne. Les lignes et colonnes de fin sont trouvées.
Sub AutoFilter() Dim shWorkBook As Worksheet Dim shPivotTable As Worksheet Dim shCarrierRates As Worksheet Dim shWholesaleLocation As Worksheet Dim shPWLocation As Worksheet Dim wkb As Workbook Dim shSegmentation As Worksheet Dim MilageMatrix As Worksheet Dim FullYearData As Worksheet Dim StartForm As Worksheet Set wkb = ThisWorkbook With wkb Set shPivotTable = .Sheets("PivotTable") Set shCarrierRates = .Sheets("CarrierRates") Set shWholesaleLocation = .Sheets("WholesalerLocation") Set shPWLocation = .Sheets("PWLocation") Set shSegmentation = .Sheets("Segmentation") Set shMilageMatrix = .Sheets("MilageMatrix") Set shFullYearData = .Sheets("FullYearData") Set shStartForm = .Sheets("StartForm") set shWorkBook = .sheets("WorkBook") End With Dim DataRange As Range Dim PWSelection As Integer Dim LastRow As Long Dim LastColumn As Long Set StartCell = shFullYearData.Range("A1") 'Find Last Row and Column LastRow = shFullYearData.Cells(shFullYearData.Rows.Count, StartCell.Column).End(xlUp).Row LastColumn = shFullYearData.Cells(StartCell.Row, shFullYearData.Columns.Count).End(xlToLeft).Column 'Select Range shFullYearData.Range(StartCell, shFullYearData.Cells(LastRow, LastColumn)).Select Set DataRange = Selection PWSelection = shStartForm.Cells(1, 1).Value shFullYearData.Range(DataRange).Copy Destination:=shWorkBook.Range("A1") End Sub
3 Réponses :
Il n'y a aucune raison de trouver la dernière ligne et colonne. Utilisez simplement Range().CurrentRegion
.
ThisWorkbook.Sheets("FullYearData").Range("A1").CurrentRegion.Copy ThisWorkbook.Sheets("WorkBook").Range("A1")
Je recommande fortement d'utiliser les noms de code de feuille de calcul, lire: Explication des noms de code VBA .
Essayez ceci. Cependant, j'ai remarqué que vous utilisez xlup et que vous êtes parti lorsque votre point de départ est la cellule a1. J'étais un peu confus par cela. Mais j'ai pu faire passer les erreurs qui apparaissent lorsque vous exécutez votre code.
Sub AutoFilter() Dim shWorkBook As Worksheet Dim shPivotTable As Worksheet Dim shCarrierRates As Worksheet Dim shWholesaleLocation As Worksheet Dim shPWLocation As Worksheet Dim wkb As Workbook Dim shSegmentation As Worksheet Dim MilageMatrix As Worksheet Dim FullYearData As Worksheet Dim StartForm As Worksheet Set wkb = ThisWorkbook With wkb Set shPivotTable = .Sheets("PivotTable") Set shCarrierRates = .Sheets("CarrierRates") Set shWholesaleLocation = .Sheets("WholesalerLocation") Set shPWLocation = .Sheets("PWLocation") Set shSegmentation = .Sheets("Segmentation") Set shMilageMatrix = .Sheets("MilageMatrix") Set shFullYearData = .Sheets("FullYearData") Set shStartForm = .Sheets("StartForm") Set shWorkBook = .Sheets("WorkBook") End With Dim DataRange As Range Dim PWSelection As Integer Dim LastRow As Long Dim LastColumn As Long Set StartCell = shFullYearData.Range("A1") 'Find Last Row and Column ''I cant figure out why you want to start at a1 and then do xlup and xlleft. that only ''gets you to a1. LastRow = shFullYearData.Cells(shFullYearData.Rows.Count, StartCell.Column).End(xlUp).Row LastColumn = shFullYearData.Cells(StartCell.Row, shFullYearData.Columns.Count).End(xlToLeft).Column 'Select Range ''**here is where i made a change** shFullYearData.Select Range(StartCell, shFullYearData.Cells(LastRow, LastColumn)).Select Set DataRange = Selection PWSelection = shStartForm.Cells(1, 1).Value ''**I also made a change here** shFullYearData.Select DataRange.Copy Destination:=shWorkBook.Range("A1") End Sub
Je soupçonne maintenant que vous n'avez pas Option Explicit
en haut de votre module de code. En conséquence, vous n'êtes pas alerté de la déclaration manquante de StartCell
. En fait, StartCell
est une plage plutôt inutile, mais si elle n'est pas définie, votre sélection échoue et cela ferait en sorte que DataRange
soit Nothing, bien que cette erreur se produise avant le dernière rangée. Bien sûr, la sélection est également tout à fait inutile et peut causer des problèmes en elle-même car vous ne contrôlez pas ActiveSheet et il ne peut pas y avoir de Selection
sur une feuille qui n'est pas active. Pour couper court, je vous recommande de réécrire toute la fin de votre code. Ce code devrait fonctionner.
Dim DataRange As Range Dim PWSelection As Integer Dim LastRow As Long Dim LastColumn As Long With shFullYearData LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row LastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column Set DataRange = .Range(.Cells(1, 1), .Cells(.Cells(LastRow, LastColumn))) End With Range(DataRange).Copy Destination:=shWorkBook.Cells(1, 1)
shFullYearData.Range (DataRange)
c'est le coupable. shFullYearData n'est pas une feuille de calcul. C'est une variable.DataRange
identifie complètement l'emplacement (feuille de calcul). Il n'est pas nécessaire de préciser où il se trouve. C'est donc tout ce dont vous avez besoin:Range (DataRange)
J'ai apporté les modifications recommandées et je rencontre toujours l'erreur. La raison pour laquelle j'avais le shFullYearData avant la plage était parce que je voulais spécifier où dans le classeur vba devait regarder. Des idées sur d'autres raisons de l'erreur?
sWorkbook
semble non seulement mal nommé, car ce n'est pas un livre mais une feuille, mais également non spécifié nulle part.Désolé, je n'ai pas semblé recopier lors de la rédaction de cette question, mais je l'ai définie et il s'agit d'une feuille de calcul appelée "Workbook" (probablement pas le meilleur nom pour plus de clarté lol) dans mon classeur
L'instruction Dim est supprimée.
Regardez-vous la version modifiée où cela a déjà été corrigé?