60 votes

Qu'est-ce que la propriété VBA range.Rows Excel fait vraiment?

OK, je suis en train de finir un projet supplémentaire pour un héritage Excel-VBA application, et j'ai de nouveau aller à l'encontre de l'énigme du mystérieux gamme.Lignes(?) et la feuille de calcul.Les lignes de propriétés. Personne ne sait ce que ces propriétés vraiment faire et ce qu'ils sont censés fournir à moi? (remarque: cela s'applique probablement à la correspondante *.Propriétés de colonnes également).

Ce que je voudrais vraiment comme être en mesure de l'utiliser pour est de retour d'une plage de lignes, comme ceci:

   SET rng = wks.Rows(iStartRow, iEndRow)

Mais je n'ai jamais été en mesure de l'obtenir pour le faire, même si l'Intellisense affiche deux arguments. Au lieu de cela, je dois utiliser l'un des deux ou trois autres (très encombrants) techniques. L'aide est très peu utile (généralement pour pour Office VBA), et à googler pour les "Lignes" n'est pas très utile, peu importe combien d'autres termes-je ajouter.

Les seules choses que j'ai été en mesure de l'utiliser pour sont 1) le retour d'une seule ligne comme une fourchette ( rng.Lignes(i) ) et 2) de retour d'un nombre de lignes dans une gamme ( rng.Les lignes.Le comte ). Est ce que c'est? Il n'y a vraiment rien d'autre que c'est bon?

Précisions: je sais qu'il retourne à une plage et qu'il y a d'autres façons d'obtenir une plage de lignes. Ce que je demande c'est précisément ce que nous apporte le .Lignes() que nous n'avons pas déjà obtenir de .Les cellules() et .Range()? Les deux choses que je connais sont: 1) un moyen plus facile de retourner une plage d'une seule ligne et 2) un moyen de compter le nombre de lignes dans une gamme. Est-il autre chose?

53voto

Joe Erickson Points 4571

Gamme.Des lignes et de la Plage.Colonnes renvoient essentiellement la même Gamme, sauf pour le fait que la nouvelle Gamme est un indicateur qui indique qu'il représente des Lignes ou des Colonnes. Cela est nécessaire pour certaines Excel propriétés telles que la Plage.Comte et de la Plage.Caché et pour certaines méthodes telles que la Plage.Ajustement automatique():

  • Gamme.Les lignes.Count retourne le nombre de lignes dans la Gamme.
  • Gamme.Les colonnes.Count retourne le nombre de colonnes dans la Gamme.
  • Gamme.Les lignes.Ajustement automatique() autofits les lignes de Gamme.
  • Gamme.Les colonnes.Ajustement automatique() autofits les colonnes de Gamme.

Vous trouverez peut-être que Gamme.EntireRow et de la Plage.EntireColumn sont utiles, même si elles ne sont toujours pas exactement ce que vous cherchez. Elles retournent toutes les colonnes possibles pour EntireRow et toutes les lignes possibles pour EntireColumn pour l'représenté gamme.

Je le sais parce que SpreadsheetGear pour .NET est livré avec .NET Api qui sont très similaires à Excel de l'Api. Le SpreadsheetGear API est livré avec plusieurs fortement typé surcharges à l'IRange indexeur, y compris celui que vous avez probablement Excel:

  • IRange ce[int row1, int colonne1, int row2, int colonne2];

Avertissement: je possède SpreadsheetGear LLC

11voto

Nile Points 903

Gamme.Les Lignes, La Gamme.Des colonnes et de la Plage.Les cellules sont Excel.La gamme des objets, selon le Type VBA() fonctions:

?TypeName(La Sélection.les lignes)
Gamme
Cependant, ce n'est pas toute l'histoire: ces objets retournés sont étendues types d'hériter de tous les biens et de la méthode à partir d'Excel::Gamme - mais .Les colonnes et les .Les lignes ont une spéciale Pour... à Chaque itération, et un de spécial .Le comte de propriété qui ne sont pas tout à fait le même que le parent de l'objet de la Plage de l'itérateur et à compter.

.Cellules est itéré et compté comme une collection d'une seule cellule varie, tout comme le défaut d'itérateur de la société mère de gamme.

Mais .Colonnes est itéré et compté comme une collection de verticale sous-plages, chacun d'entre eux une seule colonne de large;

...Et .Lignes est itéré et compté comme une collection de horizontale sous-plages, chacun d'entre eux d'une seule rangée de haut.

La meilleure façon de comprendre ce qui est à l'étape par le biais de ce code et de regarder ce qui est sélectionné:

Public Sub Test()

Dim Sous-Groupe Que Dim ParentRange Que

Ensemble ParentRange = ActiveSheet.Range("B2:E5")

Pour Chaque Sous-Intervalle Dans ParentRange.Les cellules Sous-intervalle.Sélectionnez Prochaine

Pour Chaque Sous-Intervalle Dans ParentRange.Les lignes Sous-intervalle.Sélectionnez Prochaine

Pour Chaque Sous-Intervalle Dans ParentRange.Les colonnes Sous-intervalle.Sélectionnez Prochaine

Pour Chaque Sous-Intervalle Dans ParentRange Sous-intervalle.Sélectionnez Prochaine

End Sub

Profitez de. Et l'essayer avec un couple de cellules fusionnées, juste pour voir comment impair fusionné les plages peuvent être.

7voto

e.James Points 51680

Tes deux exemples sont les seules choses que je n'ai jamais utilisé l' Rows et Columns des propriétés, mais en théorie, vous pourriez faire quelque chose qui peut être fait avec un Range objet.

Le type de retour de ces propriétés est lui-même un Range, de sorte que vous pouvez faire des choses comme:

Dim myRange as Range
Set myRange = Sheet1.Range(Cells(2,2),Cells(8,8))
myRange.Rows(3).Select

Qui va choisir la troisième rangée, en myRange (Cellules B4:H4 dans la feuille "Sheet1").

mise à jour: 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 gamme:

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))

2voto

Joel Goodwin Points 3477

Je ne suis pas sûr, mais je pense que le deuxième paramètre est un leurre.

Les deux .Les lignes et les .Les colonnes de prendre deux paramètres optionnels: RowIndex et ColumnIndex. Essayez d'utiliser ColumnIndex, par exemple, Rows(ColumnIndex:=2), génère une erreur pour les deux .Les lignes et les .Les colonnes.

Mon sentiment c'est héritée dans un certain sens de l' Cells(RowIndex,ColumnIndex) de la Propriété, mais seul le premier paramètre est approprié.

2voto

Nick Mellor Points 21

J'ai trouvé moi-même à l'aide de gamme.Les lignes de ses effets dans la méthode de Copie. Il copie la hauteur des lignes à partir de l'origine à la destination, qui est le comportement que je veux.

rngLastRecord.Rows.Copy Destination:=Sheets("Availability").Range("a" & insertRow)

Si j'avais utilisé rngLastRecord.Copie au lieu de rngLastRecord.Les lignes.La copie, les hauteurs de ligne serait tout ce qui était là avant la copie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X