2013-10-25 3 views
0

Я заполняю таблицу из нескольких листов Excel из базы данных Lotus Notes, используя агент LotusScript в Notes. Чтобы оптимизировать код, я сначала создаю все данные в массиве, а затем выгружаю его в Excel, так как гораздо быстрее писать массив за один раз, чем писать каждую ячейку или строку отдельно.Хотите извлечь двумерный массив из трехмерного массива

Поэтому у меня есть трехмерный массив, содержащий данные, определенные

ReDim sheetData(sheets,rows,columns) 

У меня нет никакой проблемы заполнения массива, используя записи навигатора, но когда я пришел, чтобы написать в Excel, я хотел сделать

For c = 0 to sheets 
    With xlSheet(c+1) 
     .Range(.Range.Cells(1,1) , .Range.Cells(rows+1, columns+1).Value = sheetData(c) 
    End With 
Next 

Это не работает, очевидно, потому что мне нужно предоставить три индекса для sheetData.

Итак, каков наилучший способ извлечения данных строк и столбцов?

ответ

2

У вас есть два possibilites: Вы могли бы пройти через все строки и столбцы и присвоить значение непосредственно:

With xlSheet(c+1) 
    For row = 1 to rows + 1 
     For col = 1 to columns + 1 
      .cells(row, col) = sheetData(c,row,col) 
     Next 
    Next 
End With 

Или -если вы можете назначить двумерный массив в диапазоне (то, что я не знаю) вы могли бы работать со списком из двух одномерных массивов:

ReDim sheetData Список (строка, столбец) в качестве варианта

Это будет выглядеть как sheetData(1) = [1,2]

, а затем задание будет выглядеть так:

.Range(.Range.Cells(1,1) , .Range.Cells(rows+1, columns+1).Value = sheetData(c) 

НО: Заполнение этого списка массивов может быть боль (создать временную двухмерного массива с ReDim, заполнить этот массив и присвоить его как `sheetData (лист) = tempArray

+0

Спасибо за предложение, Торстен. Я пробовал этот путь, но не мог понять, как создать список массивов (а поисковая система Google не дает никаких окончательных ответов). Однако я понял, что этот метод не будет очень красивым, так как мои листы не будут иметь одинаковое количество строк, и я бы предпочел не создавать массивы, которые будут иметь множество пробелов (.eg один лист будет имеют 22000 строк, а у другого будет 1700). Поэтому я использую 6, записывая данные по строке за раз, а не по листу за раз. Еще быстрее, чем писать в ячейку за один раз :-) –

+0

Ваш 3D-массив очень растрачивает память. Предложение о списке массивов превосходно. Вы можете сделать это с помощью Dim sheetList List As Variant. Новый лист создается sheetList («имя листа») = массив ... и ссылается как sheetList («имя листа») (i, j) –

Смежные вопросы