2009-05-11 10 views
5

Con esta función muy simple:En VBA, ¿cómo devolver una matriz/o escribir a las celdas usando una función?

Function WriteArray() as Variant 
Dim array(0 To 2) 
array(0) = "A" 
array(1) = "B" 
array(2) = "C" 
WriteArray = array 
End Function 

Yo estaba esperando a ver en el resultado de toda la matriz en una hoja de cálculo de Excel, pero ese no es el caso: tengo sólo la primera cadena. Sé que hay un truco para mostrar todo el conjunto en la hoja de cálculo (seleccionando un rango de celdas con la fórmula + F2 + CTRL + MAYÚS + INTRO), pero preferiría que VBA manejara todo.

También traté de usar la variable Application.Caller para escribir directamente en el rango "Caller" pero el código se rompe.

¡Muchas gracias por su ayuda!

EDIT: Aquí es otro código Traté de usar:

Function WriteArray() As Variant 
    Dim arr(0 To 2) 
    arr(0) = "A" 
    arr(1) = "B" 
    arr(2) = "C" 
    WriteArray = arr 
    Dim StartRow, i As Integer 
    For i = 0 To UBound(arr) 
     Range("A" & i).Value = arr(i) 
    Next 
End Function 

Se rompe en la línea de "Range (" A "& i) .Value = arr (i)". ¿Mi Excel está roto?

Respuesta

6

El siguiente código escribe la matriz a un rango de celdas muy bien:

Function WriteArray() As Variant 
    Dim AbcList(0 To 2) as Variant 
    AbcList(0) = "A" 
    AbcList(1) = "B" 
    AbcList(2) = "C" 
    WriteArray = AbcList 
End Function 

Function WriteArrayToSpreadsheet() 
    Dim MyArray As Variant 
    MyArray = WriteArray() 

    Dim StartRow, i As Integer 
    StartRow = 1 
    For i = 0 To UBound(MyArray) 
     Range("A" & i + StartRow).Value = MyArray(i) 
    Next 
End Function 

Dicho esto, me gustaría ver la parte del código en el que en realidad está tratando de conseguir que en el hoja de cálculo, no donde construye la matriz. ¡Entonces puedo ayudarte!

+0

De hecho, esto no funciona, el código de VBA se rompe en "Rango (" A "& i + StartRow) .Value = MyArray (i)" ... ese es mi problema también. ¿Este código funciona en tu Excel? Yo uso Excel 2003. –

+0

Funcionó perfectamente en Excel 2003. Cambie cada "matriz" en su código de inicio a otro nombre de variable que NO sea una palabra reservada, como AbcList o algo por el estilo. – Eric

+0

Aún así, se rompe ... utilizo exactamente este código: WriteArray Función() como variante Dim arr (0 a 2) arr (0) = "A" arr (1) = "B" arr (2) = "C" WriteArray = arr Dim StartRow, i como número entero Para i = 0 Para UBound (arr) Range ("A" + i) .Value = arr (i) Siguiente End Function En "Range (" A "& i) .Value = arr (i)", simplemente sale del código, incluso sin lanzar ningún error ... no tiene sentido para mí :( –

3

No tiene permiso para escribir en celdas que no llaman directamente desde una función de hoja de cálculo en Excel.

Si desea utilizar una función de matriz (utilizando las teclas Shift + Ctrl + Enter) necesita cambiar su código para:

Function WriteArray() As Variant 
    Dim arr(0 To 2, 0 To 1) 
    arr(0, 0) = "A" 
    arr(1, 0) = "B" 
    arr(2, 0) = "C" 
    WriteArray = arr 
End Function 

Si desea escribir fuera de las células llamadas que tendría que implementar alguna forma de devolución de llamada que usaría la automatización para escribir en las otras celdas. ¡Esto es mucho más complicado y mucho más probable de romper!

0

La mejor solución que hice hasta ahora fue la creación de un procedimiento de la referencia obtener su rango y su matriz y utilizarlo como un punto de inicio para mostrar sus datos horizontalmente o verticalmente ...

En la siguiente manera:

Sub LoadArray(ByRef oRange, ByRef vArray) 
    Dim I 
    For I = 0 To UBound(vArray) 
     oRange.Offset(I, 0).Value = vArray(I) 
    Next 
End Sub 

'How to call: 
Dim anyArray 
anyArray = Array(1,2,3) 

Call LoadArray(Range("anyRange"), anyArray) 

Espero que ayude.

1

El secreto es definir una matriz bidimensional. Las dos dimensiones de la matriz son simplemente el rango que necesita definirse para un conjunto de datos. La primera dimensión de matriz es la compensación de fila y la segunda dimensión es la compensación de columna.

En ti ejemplo, la segunda dimensión es simplemente no "usado":

Sub Ente() 

    Dim myArray(0 To 3, 0) As String 
    myArray(0, 0) = "A" 
    myArray(1, 0) = "B" 
    myArray(2, 0) = "C" 

    Range("B7:B" & UBound(myArray) + 6) = myArray 

End Sub 

lo tanto, no es necesario bucles! Simple y rápido.

Cuestiones relacionadas