2009-10-10 22 views
7

Bueno, he estado luchando con un poquito de código y parece que no puedo evitarlo ... Estoy tratando de obtener una matriz de un rango de celdas, la matriz sin embargo, muestra hasta 1 elemento de ancho.
Bueno, aquí está el código:Matriz de Rango en Excel VBA

Dim item As Variant 
MsgBox Range("D19:H19").Count  
item = Range("D19:H19").Value 
MsgBox LBound(item) & " " & UBound(item) 

según mi entendimiento elemento debe contener una matriz 2D ... sin embargo yo estoy recibiendo el siguiente resultado impresiones 1st MsgBox 5 2ª impresiones MsgBox 1 1

¿Qué está mal?

+0

No soy experto en VBA, pero teniendo el valor de un rango (o matriz) parece extraño. ¿Devuelve el primer valor del rango? – dave

+0

Generalmente VBA devolvería una matriz 2D con los valores de fila siendo la 1ra dimensión y los valores de columna siendo la 2da dimensión, sin embargo aquí estoy buscando un rango que tenga 5 celdas en una fila, así que no estoy seguro si un 1d o Se devolverá 2d array ... –

+0

@dave: y sí, devuelve solo el primer valor del rango ... ¿Alguna idea de por qué lo está haciendo? –

Respuesta

11

El problema está en LBound y UBound

jtolle era correcta sobre la LBound y UBound.

LBound(item, 2) 

UBound(item, 2) 

Sin embargo, el elemento no se debe oscurecer como una matriz (obtendrá un error).

creo que esto es lo que quiere

Dim item As Variant 
MsgBox Range("D19:H19").Count 
item = Range("D19:H19").Value 

MsgBox LBound(item, 2) & " " & UBound(item, 2) 

For i = LBound(item, 2) To UBound(item, 2) 
    MsgBox item(1, i) 
Next 
+0

Eso es correcto. Mi edición tenía por objeto describir la forma de la matriz devuelta obteniendo la propiedad Value del objeto Range y poniéndola en el elemento. No tenía la intención de sugerir que el artículo se declarara como una matriz, solo que una vez asignado, se vería igual que una variable que se había declarado como tal. – jtolle

+0

@imfrancisd: ¡funciona como un encanto! Todavía no entendía lo que estaba haciendo mal, parece que no entiendo los conceptos de matriz en VBA ... –

1

Correcto como está. Incluso si se selecciona un conjunto de células, todavía tiene la opción de seleccionar una sola celda de la matriz (y el paso, por ejemplo, con la lengüeta a través de los elementos de esta matriz)

.Value 

sólo le toma el contenido del la celda seleccionada actualmente solo.

si desea que la enumeración de la matriz, puede llamar a la .Cells() -method del Range -objeto

Suponiendo que hasta D19 H19 contiene "a" a la "E", respectivamente, llamando

Range("D19:H19").Cells(2) 

le devuelve "b". Tenga en cuenta que esta es una matriz basada en uno y puede ser bidimensional. Cells() toma como máximo 2 parámetros para especificar el desplazamiento interno desde el origen de la selección.

esperanza de que aclara que se refiere a ...

+0

El fragmento de código aquí http://support.microsoft.com/kb/213798 en la sección "Para tomar valores de una hoja de trabajo y completar la matriz" muestra un código similar, por lo que me pregunto por qué mi código no funciona. –

+0

Bueno, probé esto en Excel 2k3. Posiblemente, esto se debe al hecho de que el valor puede ser bidimensional ... 'lbound' toma un segundo parámetro que se expresa como lo que llamamos dimensión. No estoy seguro de qué parámetro corresponde a qué valor. ¿Qué devuelve 'VarType (Range (" D19: H19 "). Value)' return? Debería ser 'vbArray' ... Podría intentar' Ubound (item, 1) 'en lugar de' Ubound (1) ' – Atmocreations

+0

, así que probé Ubound (item, 1) pero fue en vano .. Aún así obtengo el 1 1 desde la segunda salida de MsgBox ... Y con respecto a qué (Rango ("D19: H19"). Valor) debería regresar ... Creo que no estoy realmente seguro ... Estoy trabajando en muestras de código ... –

2

Su artículo debe contener una matriz 2-D como se esperaba. Si coloca un punto de interrupción en su código y mira la pequeña ventana "Locales" en el editor de VBA, debería ver eso. Sus llamadas a LBound y UBound están obteniendo los límites en la primera dimensión. Si llama a Lbound (artículo, 2) y UBound (artículo, 2), debe obtener 1 y 5 como espera.

EDIT: Es decir, una vez que haya tomado la asignación, punto se ve como algo que podría haber declarado como tal:

elemento Dim (1 a 1, 1 a 5)

Uno de la programación Banes de VBA es que las matrices pueden tener límites inferiores arbitrarios. Entonces, todo su código debe ser consciente de eso.

+0

¡Ok comprobará esto y lo mantendrá informado! ... –

0

si quieres una matriz 1D, a unirse a ella por una cláusula IN, por ejemplo, se debe incorporar a su gama. he encontrado que hay que incorporar dos veces para una fila, una por una columna de datos como esto:

Dim rngRow As Range, rngColumn As Range 

Set rngRow = Sheets(1).Range("A1", "Z1") 
Set rngColumn = Sheets(1).Range("A1", "A20") 

Dim arrRowValues, arrColValues 
arrRowValues = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngRow)) 
arrColValues = WorksheetFunction.Transpose(rngColumn) 

Dim numList As String, stringList As String 
numList = Join(arrRowValues, ",") 
stringList = "'" & Join(arrColValues, "','") & "'" 

vale la pena jugar.

1

Prueba esto:

Dim item As Variant 
MsgBox Range("D19:H19").Count 
item = Application.Transpose(Range("D19:H19").Value) 
MsgBox LBound(item) & " " & UBound(item) 
+0

Pensé que "Transpose" era para columnas ... lo verificará de todos modos ... –

+0

FYI , la transposición no está disponible en Excel 2003. – ErikE

+1

Eso es gracioso, porque ahí es donde escribí el código. – JimmyPena

Cuestiones relacionadas