В VBA, как вернуть массив / или записать в ячейки с помощью функции? - PullRequest
5 голосов
/ 11 мая 2009

Используя эту очень простую функцию:

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

Я ожидал увидеть в результате весь массив в моей электронной таблице Excel, но это не так: я получаю только первую строку. Я знаю, что есть хитрость, чтобы показать весь массив в электронной таблице (выбрав диапазон ячеек с формулой + F2 + CTRL + SHIFT + ENTER), но я бы предпочел, чтобы VBA обрабатывал все это.

Я также пытался использовать переменную Application.Caller для прямой записи в диапазон «Caller», но код прерывался.

Большое спасибо за вашу помощь!

EDIT: Вот еще один код, который я пытался использовать:

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

Разрывается на строке «Range (« A »& i) .Value = arr (i)». Мой Excel сломан?!

Ответы [ 4 ]

6 голосов
/ 11 мая 2009

Следующий код прекрасно записывает массив в диапазон ячеек:

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

При этом я хотел бы видеть ту часть кода, где вы на самом деле пытаетесь поместить ее в электронную таблицу, а не там, где вы строите массив. Тогда я могу вам помочь!

3 голосов
/ 14 мая 2009

Вы не можете писать в ячейки не вызывающих абонентов непосредственно из функции рабочего листа в Excel.

Если вы хотите использовать функцию массива (используя Shift-Ctrl-Enter), вам нужно изменить код на:

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

Если вы хотите писать вне вызывающих ячеек, вам нужно будет реализовать некоторую форму обратного вызова, которая будет использовать автоматизацию для записи в другие ячейки. Это намного сложнее и гораздо чаще ломается!

1 голос
/ 12 мая 2015

Секрет в том, чтобы определить двумерный массив. Два измерения массива - это просто диапазон, который необходимо определить для набора данных. Первое измерение массива - это смещение строки, а второе измерение - смещение столбца.

В вашем примере второе измерение просто не используется:

 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

Итак, петли не нужны! Просто и быстро.

0 голосов
/ 25 июля 2013

Лучший обходной путь, который я сделал до сих пор, - это создание процедуры, которая получит вашу ссылку на диапазон и ваш массив и использует ее в качестве начальной точки для отображения ваших данных по горизонтали или по вертикали ...

следующим образом:

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)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...