2010-12-07 6 views
1

J'essaie de copier une plage de cellules pour lesquelles je ne connais pas la dernière ligne et colonne (bien que je puisse facilement accéder à celles utilisant variables). Malheureusement, la façon dont j'essaie de référencer une plage est de me donner une erreur d'exécution 1004 (Erreur définie par l'application ou définie par l'objet) lorsque j'utilise des variables, et je n'arrive pas à comprendre pourquoi. Voici un exemple du code:Erreur d'exécution '1004' lors de la tentative de copie d'une plage (Excel VBA)

Dim wkbk As Workbook 
Dim copy_rng As Range 
... 
Set copy_rng = wkbk.Worksheets("Payable").Range("A1:Y3500") 
Set copy_rng = wkbk.Worksheets("Payable").Range(Cells(1, 1), Cells(last_row_pay, last_col_pay)) 

La première instruction Set est simplement un exemple, et il fonctionne très bien (donc je sais Wkbk est bien défini et il est de trouver la feuille de calcul « à payer »). Est-ce que quelqu'un sait pourquoi la deuxième instruction Set ne fonctionnerait pas? Y a-t-il un problème de syntaxe? (Pendant le débogage, si je survole les variables last_row_pay et last_col_pay, je peux voir des valeurs valides - 1533 et 25 respectivement.) Merci pour toute aide.

Répondre

4

Utilisez la fonction de redimensionnement, car la fonction Cells() fonctionne pour la feuille de calcul active et peut être confuse.

Dim wkbk As Workbook 
Dim copy_rng As Range 
Dim pay_rows As Integer ,pay_columns As Integer 
... 
pay_rows = 3500 
pay_columns = 23 
Set copy_rng = wkbk.Worksheets("Payable").Range("A1").Resize(pay_rows,pay_columns) 

A1 est la cellule supérieure gauche de vos données.

+0

Très bien taché! Vous pouvez en effet reproduire le problème en activant une feuille autre que "Payable". –

+0

J'ai essayé ceci, et maintenant je reçois une erreur d'exécution '438': L'objet ne supporte pas cette propriété ou cette méthode (sur la ligne Set ci-dessus). Je vais examiner cela, mais laissez-moi savoir si vous avez des idées. Merci!!! – rryanp

+0

J'ai corrigé le post. J'ai oublié de faire référence à la cellule en haut à gauche des données. – ja72

0

Si la plage que vous essayez de copier est un ensemble de cellules contiguës je trouve la meilleure façon d'obtenir la taille de la plage sans coder en dur des comptes de ligne/colonne est d'utiliser CurrentRegion

Sub GetCurrentRange 

Dim rng as range 
Set rng = Worksheets("Payable").Range("A1").CurrentRegion 

End Sub 

L'avantage ici est que même si vous ajoutez des lignes/colonnes à votre ensemble de données que vous n'avez pas besoin de se soucier de travailler sur la nouvelle colonne et les limites que CurrentRegion ligne fait pour vous

Exemple:

 A  B  C 
1 10 20 30 
2 40 50 60 
3 70 80 90 

Sub GetCurrentRange 

Dim rng as range 
Set rng = Worksheets("Payable").Range("A1").CurrentRegion 

Debug.Print rng.Address //Prints $A$1:$C$3 

End Sub 
0
with Worksheets("Payable") 
    copy_rng = .Range(.Cells(1, 1), .Cells(last_row_pay, last_col_pay)).Value 
end with 

plus de lignes, mais le travail ..

0

J'ai eu les mêmes problèmes. Vous devez qualifier les propriétés de cellule et de plage.

Questions connexes