web-dev-qa-db-fra.com

VBA: Sélection d'une plage par variables

Je souhaite sélectionner la plage formatée d'une feuille Excel ..__ Pour définir la dernière et la première ligne, j'utilise les fonctions suivantes:

lastColumn = ActiveSheet.UsedRange.Column - 1 + ActiveSheet.UsedRange.Columns.Count
lastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row

Dans l'étape suivante, je souhaite sélectionner cette zone: La formule devrait ressembler à ceci:

Range(cells(1, 1), cells(lastRow, lastColumn).Select

Cependant, cela ne fonctionne pas. Peut-être que quelqu'un a une idée de ce qui ne va pas. Merci beaucoup!

10
Fabian Stolz

J'ai enregistré une macro avec 'Références relatives' et voici ce que j'ai obtenu:

Range("F10").Select
ActiveCell.Offset(0, 3).Range("A1:D11").Select

Voici ce que je pensais: Si la sélection de plage est entre guillemets, VBA souhaite vraiment une chaîne et interprète les cellules à partir de celle-ci.

Dim MyRange as String
MyRange = "A1:D11"
Range(MyRange).Select

Et cela a fonctionné :) c'est-à-dire qu'il suffit de créer une chaîne à l'aide de vos variables, assurez-vous de la dimensionner en tant que variable STRING et Excel le lira immédiatement;)

Après avoir testé et trouvé efficace:

Sub Macro04()

Dim Copyrange As String

Startrow = 1
Lastrow = 11
Let Copyrange = "A" & Startrow & ":" & "D" & Lastrow
Range(Copyrange).Select
End Sub
27
Nikesh Rastogi

J'ai rencontré quelque chose de similaire - je voulais créer une plage basée sur certaines variables. L'utilisation de la feuille de calcul.Les cellules ne fonctionnaient pas directement, car je pense que les valeurs de la cellule ont été transmises à Range.

Cela a bien fonctionné:

Range(Cells(1, 1).Address(), Cells(lastRow, lastColumn).Address()).Select

Cela a permis de convertir l'emplacement numérique de la cellule en ce que Range attend, à savoir le format A1.

8
Daver

Si vous voulez juste sélectionner la plage utilisée, utilisez

ActiveSheet.UsedRange.Select

Si vous souhaitez sélectionner A1 à la fin de la plage utilisée, vous pouvez utiliser la méthode SpecialCells comme celle-ci.

With ActiveSheet
    .Range(.Cells(1, 1), .Cells.SpecialCells(xlCellTypeLastCell)).Select
End With

Parfois, Excel est confus sur la dernière cellule. Ce n'est jamais une plage plus petite que la plage réellement utilisée, mais elle peut être plus grande si certaines cellules ont été supprimées. Pour éviter cela, vous pouvez utiliser la recherche et le caractère générique astérisque pour rechercher la dernière cellule réelle.

Dim rLastCell As Range

With Sheet1
    Set rLastCell = .Cells.Find("*", .Cells(1, 1), xlValues, xlPart, , xlPrevious)

    .Range(.Cells(1, 1), rLastCell).Select
End With

Enfin, assurez-vous de ne sélectionner que si vous en avez vraiment besoin. La plupart de ce que vous devez faire dans Excel VBA peut être fait directement dans la plage plutôt que de le sélectionner au préalable. Au lieu de

.Range(.Cells(1, 1), rLastCell).Select
Selection.Font.Bold = True

Vous pouvez

.Range(.Cells(1,1), rLastCells).Font.Bold = True
7
Dick Kusleika

Vous manquez une parenthèse proche, I.E. vous ne fermez pas Range()

Essayez ceci Range(cells(1, 1), cells(lastRow, lastColumn)).Select 

Mais vous devriez vraiment regarder l'autre réponse de Dick Kusleika pour des alternatives possibles qui pourraient mieux vous servir. Plus précisément, ActiveSheet.UsedRange.Select qui a le même résultat final que votre code.

4
Daniel

vous les transformez en adresse mais Cells (#, #) utilise des entrées entières et non des adresses; utilisez donc simplement lastRow = ActiveSheet.UsedRange.Rows.count et lastColumn = ActiveSheet.UsedRange.Columns.Count

1
273K Kool

J'ai essayé d'utiliser:

Range(cells(1, 1), cells(lastRow, lastColumn)).Select 

lastRow et lastColumn sont des entiers, mais ont reçu l'erreur d'exécution 1004. J'utilise un ancien VB (6.5).

Ce qui a fonctionné était d'utiliser ce qui suit: 

Range(Chr(64 + firstColumn) & firstRow & ":" & Chr(64 + lastColumn) & firstColumn).Select.  
1
Chris Bates