2009-05-11 14 views
5

Stosując tę ​​bardzo prostą funkcję:W języku VBA, jak zwrócić tablicę/lub pisać do komórek za pomocą funkcji?

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

Spodziewałem się zobaczyć w wyniku całą tablicę w arkuszu kalkulacyjnym Excel, ale nie o to chodzi: mam tylko pierwszy łańcuch. Wiem, że jest trick, aby pokazać całą tablicę w arkuszu kalkulacyjnym (wybierając zakres komórek z formułą + F2 + CTRL + SHIFT + ENTER), ale wolałbym, aby VBA poradził sobie z tym wszystkim.

Próbowałem również użyć zmiennej Application.Caller, aby pisać bezpośrednio w zasięgu "Caller", ale kod zepsuje się.

Bardzo dziękuję za pomoc!

EDIT: Oto kolejny kod próbowałem użyć:

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 

Łamie w wierszu "Range (" A "& i) .Value = arr (i)". Czy mój Excel jest zepsuty ?!

Odpowiedz

6

Poniższy kod zapisuje tablicy do zakresu komórek pięknie:

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 

Mając na uwadze powyższe, chciałbym, aby zobaczyć tę część kodu, gdzie jesteś rzeczywiście próbuje dostać się na arkusz kalkulacyjny, a nie miejsce, w którym tworzysz tablicę. Wtedy mogę ci pomóc!

+0

W rzeczywistości to nie działa, kod VBA dzieli się na "Zakres (" A "i i + StartRow). Wartość = Mój obszar (i)" ... to także mój problem. Czy ten kod działa na twoim Excelu !? Korzystam z programu Excel 2003. –

+0

Wszystko działało doskonale w programie Excel 2003. Zmień każdą "tablicę" w kodzie początkowym na inną nazwę zmiennej, która NIE jest słowem zastrzeżonym, takim jak AbcList lub czymś w tym rodzaju. – Eric

+0

Mimo to łamie ... Używam dokładnie ten kod: Funkcja WriteArray() As Variant Dim ARR (0 do 2) arr (0) = "A" arr (1) = "B" ARR (2) = "C" WriteArray = arr Dim StartRow, i As Integer dla i = 0 Aby Ubound (ARR) Range ("A" & i) .Value = arr (i) Następny End Function W "Zasięgu (" A "i.) .Value = arr (i)", po prostu wychodzi z kodu, nawet bez rzucania błędów ... nie ma sensu dla mnie :( –

3

Nie można pisać do komórek, które nie wywołują, bezpośrednio z funkcji arkusza kalkulacyjnego w programie Excel.

Jeśli chcesz użyć funkcji array (za pomocą Shift-Ctrl-Enter) trzeba zmienić swój kod do:

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 

Jeśli chcesz napisać poza dzwoniących komórek będzie trzeba zaimplementować jakąś formę wywołania zwrotnego, która wykorzystywałaby automatyzację do zapisywania w innych komórkach. Jest to o wiele bardziej skomplikowane i znacznie bardziej podatne na złamanie!

0

Najlepszym obejście zrobiłem do tej pory było stworzenie procedury uzyskać odwołanie do zakresu i swoją tablicę i użyć go jako punktu początkowego, aby pokazać swoje dane poziomo lub pionowo ...

W następujący sposób:

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) 

Mam nadzieję, że to pomaga.

1

Sekretem jest zdefiniowanie dwuwymiarowej tablicy. Dwa wymiary tablicy to po prostu zakres, który należy zdefiniować dla zbioru danych. Pierwszy wymiar tablicy to przesunięcie wiersza, a drugi wymiar to przesunięcie kolumny.

w was przykład drugi wymiar jest nie tylko „używane”:

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 

Tak, nie pętle konieczne! Prosto i szybko.

Powiązane problemy