0
votes

Copier une plage dynamique dans une nouvelle feuille de calcul

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   


6 commentaires

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é?


3 Réponses :


0
votes

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 .


0 commentaires

0
votes

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


0 commentaires

0
votes

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)


0 commentaires