Как мне заполнить столбец из массива? - PullRequest
0 голосов
/ 20 декабря 2018

Использование Excel VBA Я пытаюсь заполнить небольшой набор ячеек в только что созданном рабочем листе.Когда я использую следующий код:

Sub CreateFormulaDataSheet()
    Dim currentWs As Worksheet
    Dim formWs As Worksheet
    Dim titles As String
    Dim valuesArr As Variant

    If Not SheetExists("FormulaData") Then
    'create new sheet
    Set currentWs = ActiveWorkbook.ActiveSheet
    With ActiveWorkbook
        Set formWs = .Sheets.Add(After:=.Sheets(.Sheets.Count))
        formWs.Name = "FormulaData"

        formWs.Activate

        'populate with default values
        valuesArr = Array(1, 3, 6)

        Range(Cells(4, 1), Cells(6, 1)).Value = valuesArr

    End With
End Sub

Что я получаю, это:

enter image description here

Что я хочу это:

enter image description here

Почему функция Range заполняет только первый элемент в массиве?

Я знаю, что нужно обновить только несколько ячеектак что я мог легко установить значение каждого из них по отдельности, но я хочу понять, почему мой код не работает и каково решение, чтобы в следующий раз, когда у меня было 50 ячеек для обновления, мне не понадобилось50 индивидуальных ячеек.; -)

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

В случаях, когда Transpose является ограничением, заполняйте 2D-массив впереди и выполняйте непосредственный сброс на лист.

Sub test()

  ReDim valuesArr(0 To 2, 0 To 0)

  valuesArr(0, 0) = 1
  valuesArr(1, 0) = 3
  valuesArr(2, 0) = 6

  Range("A4:A" & UBound(valuesArr, 1) + 4) = valuesArr

End Sub
0 голосов
/ 20 декабря 2018

Вы ищете метод транспонирования:

Sub CreateFormulaDataSheet()
    Dim currentWs As Worksheet
    Dim formWs As Worksheet
    Dim titles As String
    Dim valuesArr As Variant

    If Not SheetExists("FormulaData") Then
    'create new sheet
    Set currentWs = ActiveWorkbook.ActiveSheet
    With ActiveWorkbook
        Set formWs = .Sheets.Add(After:=.Sheets(.Sheets.Count))
        formWs.Name = "FormulaData"

        formWs.Activate

        'populate with default values
        valuesArr = Array(1, 3, 6)

        Range("A4").Resize(UBound(valuesArr) + 1, 1).Value = Application.Transpose(valuesArr)

    End With
    End If
End Sub  

Для простоты представьте, что массивы 1-мерного размера хранятся горизонтально.Так же, как и для данных на рабочем листе, если вы хотите присвоить их вертикальному диапазону, вы должны сначала перенести их.

Второе, что я использовал, это метод Resize () , которыйбудет удобно расширять ваш целевой диапазон в соответствии с вашим размером массива.

...