OK, je termine un projet complémentaire pour une application Excel-VBA héritée et je me suis une nouvelle fois heurté à l'énigme des mystérieuses propriétés range.Rows
(?) Et worksheet.Rows
.
Est-ce que quelqu'un sait ce que font ces propriétés et ce qu'elles sont censées me fournir? (Remarque: tout cela s'applique probablement aux propriétés *.Columns
Correspondantes également).
Ce que je voudrais vraiment aimer pour pouvoir l'utiliser est de renvoyer une plage de lignes, comme celle-ci:
SET rng = wks.Rows(iStartRow, iEndRow)
Mais je n’ai jamais réussi à le faire, même si l’Intellisense présente deux arguments. Au lieu de cela, je dois utiliser l'une des deux ou trois autres techniques (très compliquées).
L'aide est très inutile (généralement pour Office VBA), et googler pour "Rows" n'est pas très utile, quel que soit le nombre de termes que j'y ajoute.
Les seules choses pour lesquelles j'ai pu l'utiliser sont 1) renvoyer une seule ligne sous la forme d'une plage (rng.Rows(i)
) et 2) renvoyer le nombre de lignes d'une plage (rng.Rows.Count
) Est-ce que c'est ça? N'y a-t-il vraiment rien d'autre pour lequel c'est bon?
Clarification: Je sais qu'il renvoie une plage et qu'il existe d'autres méthodes pour obtenir une plage de lignes. Ce que je demande, c’est précisément ce que nous obtenons de .Rows()
que nous n’obtenons pas déjà de .Cells()
et .Range()
? Les deux choses que je connais sont 1) un moyen plus facile de renvoyer une plage d'une seule ligne et 2) un moyen de compter le nombre de lignes d'une plage.
Y a-t-il autre chose?
Range.Rows
Et Range.Columns
Renvoient essentiellement la même plage, à l'exception du fait que la nouvelle plage a un indicateur indiquant qu'elle représente des lignes ou des colonnes. Cela est nécessaire pour certaines propriétés Excel telles que Range.Count et Range.Hidden et pour certaines méthodes telles que Range.AutoFit()
:
Range.Rows.Count
Renvoie le nombre de lignes dans Range.Range.Columns.Count
Renvoie le nombre de colonnes dans Range.Range.Rows.AutoFit()
ajuste automatiquement les lignes de la plage.Range.Columns.AutoFit()
ajuste automatiquement les colonnes dans Range.Vous trouverez peut-être que Range.EntireRow
Et Range.EntireColumn
Sont utiles, bien qu'ils ne correspondent toujours pas exactement à ce que vous recherchez. Ils renvoient toutes les colonnes possibles pour EntireRow
et toutes les lignes possibles pour EntireColumn
pour la plage représentée.
Je le sais parce que SpreadsheetGear for .NET est fourni avec des API .NET très similaires aux API d'Excel. L'API SpreadsheetGear contient plusieurs surcharges fortement typées pour l'indexeur IRange, y compris celle que vous souhaiteriez probablement qu'Excel ait:
IRange this[int row1, int column1, int row2, int column2];
Disclaimer: Je possède SpreadsheetGear LLC
Vos deux exemples sont les seules choses pour lesquelles j'ai utilisé les propriétés Rows
et Columns
, mais en théorie, vous pouvez faire n'importe quoi avec un objet Range
.
Le type de retour de ces propriétés est lui-même un Range
, vous pouvez donc faire les choses suivantes:
Dim myRange as Range
Set myRange = Sheet1.Range(Cells(2,2),Cells(8,8))
myRange.Rows(3).Select
Ce qui sélectionnera la troisième ligne dans myRange
(cellules B4: H4 dans la feuille Sheet1).
pdate: Pour faire ce que vous voulez faire, vous pouvez utiliser:
Dim interestingRows as Range
Set interestingRows = Sheet1.Range(startRow & ":" & endRow)
mise à jour # 2: Ou, pour obtenir un sous-ensemble de lignes dans une autre plage:
Dim someRange As Range
Dim interestingRows As Range
Set myRange = Sheet1.Range(Cells(2, 2), Cells(8, 8))
startRow = 3
endRow = 6
Set interestingRows = Range(myRange.Rows(startRow), myRange.Rows(endRow))
Etant donné que le résultat .Rows est marqué comme composé de lignes, vous pouvez "Pour chaque" traiter individuellement chaque ligne, comme ceci:
Function Attendance(rng As Range) As Long
Attendance = 0
For Each rRow In rng.Rows
If WorksheetFunction.Sum(rRow) > 0 Then
Attendance = Attendance + 1
End If
Next
End Function
J'utilise ceci pour vérifier la présence dans quelques catégories (différentes colonnes) pour une liste de personnes (différentes lignes).
(Et bien sûr, vous pouvez utiliser .Columns pour créer un "Pour chaque" sur les colonnes de la plage.)
Je me suis trouvé en utilisant range.Rows pour ses effets dans la méthode Copy. Il copie la hauteur des lignes de l’origine à la destination, ce qui correspond au comportement que je souhaite.
rngLastRecord.Rows.Copy Destination:=Sheets("Availability").Range("a" & insertRow)
Si j'avais utilisé rngLastRecord.Copy au lieu de rngLastRecord.Rows.Copy, la hauteur des lignes serait celle qui existait avant la copie.
Je ne suis pas sûr, mais je pense que le deuxième paramètre est un hareng rouge.
.Rows et .Columns acceptent deux paramètres facultatifs: RowIndex et ColumnIndex. Essayez d’utiliser ColumnIndex, par exemple. Rows(ColumnIndex:=2)
, génère une erreur pour à la fois .Rows et .Columns.
Mon sentiment est hérité d'une certaine manière de la propriété Cells(RowIndex,ColumnIndex)
, mais seul le premier paramètre est approprié.
J'ai trouvé ça marche:
Rows(CStr(iVar1) & ":" & CStr(iVar2)).Select
C'est peut-être un peu un kludge, mais le code suivant fait ce que vous semblez vouloir faire:
Set rng = wks.Range(wks.Rows(iStartRow), wks.Rows(iEndRow)).Rows
Il y a une autre façon, prenez ceci comme exemple
Dim sr As String
sr = "6:10"
Rows(sr).Select
Tout ce que vous avez à faire est de convertir vos variables iStartRow
, iEndRow
en chaîne.