tipos - rango en excel formula
¿Qué hace el rango Excel. La propiedad Rows realmente funciona? (9)
De acuerdo, estoy terminando un proyecto complementario para una aplicación heredada de Excel-VBA, y una vez más me he encontrado con el enigma del misterioso rango.Rows (?) Y hoja de cálculo. Propiedades de Rows.
¿Alguien sabe lo que estas propiedades realmente hacen y lo que se supone que deben proporcionarme? (nota: todo esto probablemente se aplica a las propiedades correspondientes *. Columnas también).
Lo que realmente me gustaría poder usar es devolver un rango de filas, como este:
SET rng = wks.Rows(iStartRow, iEndRow)
Pero nunca he sido capaz de hacerlo, aunque el Intellisense muestra dos argumentos para ello. En cambio, tengo que usar una de las dos o tres otras técnicas (muy kludgy).
La ayuda es muy poco útil (normalmente para Office VBA), y Google para "Filas" no es muy útil, no importa cuántos otros términos le agregue.
Las únicas cosas para las que he podido usarlo son 1) devolver una sola fila como un rango ( rng.Rows (i) ) y 2) devolver un recuento de las filas en un rango ( rng.Rows.Count ). ¿Es asi? ¿Realmente no hay nada más para lo que sea bueno?
Aclaración: sé que devuelve un rango y que hay otras maneras de obtener un rango de filas. Lo que estoy pidiendo es específicamente ¿qué obtenemos de .Rows () que aún no obtenemos de .Cells () y .Range ()? Las dos cosas que sé son 1) una forma más fácil de devolver un rango de una sola fila y 2) una manera de contar el número de filas en un rango.
¿Hay algo mas?
Dado que el resultado .Rows está marcado como compuesto por filas, puede "For Each" para tratar cada fila individualmente, así:
Set rng = wks.Range(wks.Rows(iStartRow), wks.Rows(iEndRow)).Rows
Utilizo esto para verificar la asistencia en cualquiera de las categorías (columnas diferentes) para una lista de personas (filas diferentes).
(Y por supuesto, podría usar .Columns para hacer un "For Each" sobre las columnas en el rango).
Es quizás un poco complicado, pero el siguiente código hace lo que parece querer hacer:
Dim sr As String
sr = "6:10"
Rows(sr).Select
Hay otra manera, toma esto como ejemplo
Dim sr As String sr = "6:10" Rows(sr).Select
Todo lo que necesita hacer es convertir sus variables iStartRow
, iEndRow
en una cadena.
He encontrado que esto funciona:
Rows(CStr(iVar1) & ":" & CStr(iVar2)).Select
Me encontré usando range.Rows para sus efectos en el método Copy. Copia la altura de las filas desde el origen hasta el destino, que es el comportamiento que quiero.
Rows(CStr(iVar1) & ":" & CStr(iVar2)).Select
Si hubiera usado rngLastRecord.Copy en lugar de rngLastRecord.Rows.Copy, las alturas de las filas serían las que haya antes de la copia.
No estoy seguro, pero creo que el segundo parámetro es una pista falsa.
Tanto .Rows como .columnas toman dos parámetros opcionales: RowIndex y ColumnIndex. Intenta usar ColumnIndex, por ejemplo, Rows(ColumnIndex:=2)
, genera un error para ambos .Rows y . Columnas .
Mi sensación es que heredó en cierto sentido de la Cells(RowIndex,ColumnIndex)
pero solo el primer parámetro es apropiado.
Range.Rows, Range.Columns y Range.Cells son objetos Excel.Range, de acuerdo con las funciones de VBA Type ():
Dim myRange as Range
Set myRange = Sheet1.Range(Cells(2,2),Cells(8,8))
myRange.Rows(3).Select
Sin embargo, esa no es la historia completa: esos objetos devueltos son tipos extendidos que heredan todas las propiedades y métodos de Excel :: Rango, pero. Columnas y .Rows tienen un For ... especial para cada iterador y una propiedad .Count especial que aren No es lo mismo que el iterador y el recuento del objeto principal de rango.
Entonces .Cells se itera y se cuenta como una colección de rangos de celda única, al igual que el iterador predeterminado del rango principal.
Pero. Columns se itera y cuenta como una colección de subrangos verticales, cada uno de ellos de una sola columna de ancho;
... Y .Rows se itera y cuenta como una colección de subrangos horizontales, cada uno de ellos con una sola fila de altura.
La forma más fácil de entender esto es recorrer este código y ver lo que se seleccionó:
Dim interestingRows as Range
Set interestingRows = Sheet1.Range(startRow & ":" & endRow)
Disfrutar. Y pruébalo con un par de celdas combinadas, solo para ver cuán extraños pueden ser los rangos combinados.
Sus dos ejemplos son las únicas cosas para las que he usado las propiedades Rows
y Columns
, pero en teoría podría hacer cualquier cosa con ellas que se pueda hacer con un objeto Range
.
El tipo de devolución de esas propiedades es en sí mismo un Range
, por lo que puede hacer cosas como:
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))
Que seleccionará la tercera fila en myRange
(Celdas B4: H4 en Sheet1).
actualización: para hacer lo que quiere hacer, puede usar:
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
actualización # 2: O, para obtener un subconjunto de filas dentro de otro rango:
rngLastRecord.Rows.Copy Destination:=Sheets("Availability").Range("a" & insertRow)
Range.Rows
y Range.Columns
devuelven esencialmente el mismo Rango, excepto por el hecho de que el nuevo Rango tiene una bandera que indica que representa Filas o Columnas. Esto es necesario para algunas propiedades de Excel como Range.Count y Range.Hidden y para algunos métodos como Range.AutoFit()
:
-
Range.Rows.Count
devuelve el número de filas en Rango. -
Range.Columns.Count
devuelve el número de columnas en Rango. -
Range.Rows.AutoFit()
define automáticamente las filas en Rango. -
Range.Columns.AutoFit()
ajusta automáticamente las columnas en Rango.
Puede encontrar que Range.EntireRow
y Range.EntireColumn
son útiles, aunque todavía no son exactamente lo que está buscando. EntireRow
todas las columnas posibles para EntireRow
y todas las filas posibles para EntireColumn
para el rango representado.
Lo sé porque SpreadsheetGear for .NET viene con API .NET que son muy similares a las API de Excel. La API SpreadsheetGear incluye varias sobrecargas fuertemente tipadas para el indexador de IRange, incluida la que probablemente desee que tenga Excel:
-
IRange this[int row1, int column1, int row2, int column2];
Descargo de responsabilidad: soy dueño de SpreadsheetGear LLC