2013-06-07 6 views
0

Я пытаюсь проанализировать файл Excel с помощью Excel VBA.Excel VBA Добавление данных в один массив

Вот пример шат enter image description here

Я сделал некоторые исследования и обнаружил, вы можете назначить диапазон в массив как

Arrayname = Range("A1:D200") 

Но я ищете некоторые вещи более динамичных, как добавить следующие несколько диапазонов к одному массиву. , а мой последний массив будет единственным массивом/таблицей, где n - количество строк из всех диапазонов и 4 столбца.

Может ли кто-нибудь пожелать мне пример. Спасибо в adavance.

ответ

1

Я думаю, что вы запрашиваете дополнительную информацию о перемещении данных между диапазонами и переменными, так что это вопрос, на который я попытаюсь ответить.

Создайте новую книгу. Оставить лист1 пустым; набор клетки В3 Лист2 в «а» и установить ячейки C4-F6 в Лист3 к = «R» & ROW() & «C» & COLUMN()

Откройте VB Editor, создать модуль и скопировать последующий код к нему. Запустить макрос Demo01().

Option Explicit 
Sub Demo01() 

    Dim ColURV As Long 
    Dim InxWkSht As Long 
    Dim RowURV As Long 
    Dim UsedRangeValue As Variant 

    ' For each worksheet in the workbook 
    For InxWkSht = 1 To Worksheets.Count 
    With Worksheets(InxWkSht) 
     Debug.Print .Name 
     If .UsedRange Is Nothing Then 
     Debug.Print " Empty sheet" 
     Else 
     Debug.Print " Row range: " & .UsedRange.Row & " to " & _ 
          .UsedRange.Row + .UsedRange.Rows.Count - 1 
     Debug.Print " Col range: " & .UsedRange.Column & " to " & _ 
          .UsedRange.Column + .UsedRange.Columns.Count - 1 
     End If 
     UsedRangeValue = .UsedRange.Value 
     If IsEmpty(UsedRangeValue) Then 
     Debug.Print " Empty sheet" 
     ElseIf VarType(UsedRangeValue) > vbArray Then 
     ' More than one cell used 
     Debug.Print " Values:" 
     For RowURV = 1 To UBound(UsedRangeValue, 1) 
      Debug.Print " "; 
      For ColURV = 1 To UBound(UsedRangeValue, 2) 
      Debug.Print " " & UsedRangeValue(RowURV, ColURV); 
      Next 
      Debug.Print 
     Next 
     Else 
     ' Must be single cell worksheet 
     Debug.Print " Value = " & UsedRangeValue 
     End If 

    End With 
    Next 

End Sub 

Следующая появится в окне Immediate:

Sheet1 
    Row range: 1 to 1 
    Col range: 1 to 1 
    Empty sheet 
Sheet2 
    Row range: 3 to 3 
    Col range: 2 to 2 
    Value = abc 
Sheet3 
    Row range: 4 to 6 
    Col range: 3 to 5 
    Values: 
    R4C3 R4C4 R4C5 
    R5C3 R5C4 R5C5 
    R6C3 R6C4 R6C5 

Если вы работаете через макрос и изучить вывод вы получите представление о загрузке диапазона к варианту. В частности, я хочу отметить следующие моменты:

  • Переменная, на которую загружен диапазон, имеет тип Variant. Я никогда не пробовал загружать один диапазон в массив Variant, так как результатом может быть не массив. Даже если это сработает, я смущаю это.
  • Лист1 пуст, но используемый диапазон говорит вам, что используется ячейка A1. Однако вариант, в который я загрузил лист, пуст.
  • Вариант только становится массивом, если диапазон содержит более одной ячейки. Примечание: массив ВСЕГДА будет двухмерным, даже если диапазон представляет собой одну строку или один столбец.
  • Нижние границы массива ВСЕГДА 1.
  • столбцов и строк размеры не являются стандартными со строками как размерности 1 и столбцов как размерности 2.
  • Если есть какие-либо сомнения по поводу природы используемого диапазон, загружаемый, вы должны использовать IsEmpty и VarType для проверки его природы.

Вы также можете посмотреть: https://stackoverflow.com/a/16607070/973283. Объясните объяснения макросов Demo01() и Demo02(), которые не относятся к вам, но задают контекст. Макро Demo03() показывает усовершенствованную технику загрузки нескольких листов в неровный массив.

Теперь создайте новый рабочий лист и оставьте его с именем по умолчанию Sheet4.

Добавить код в модуль.Запустить макрос Demo02().

Sub Demo02() 

    Dim ColOut As Long 
    Dim OutputValue() As String 
    Dim Rng As Range 
    Dim RowOut As Long 
    Dim Stg As String 

    ReDim OutputValue(5 To 10, 3 To 6) 

    For RowOut = LBound(OutputValue, 1) To UBound(OutputValue, 1) 
    For ColOut = LBound(OutputValue, 2) To UBound(OutputValue, 2) 
     OutputValue(RowOut, ColOut) = RowOut + ColOut 
    Next 
    Next 

    With Worksheets("Sheet4") 
    Set Rng = .Range("A1:D6") 
    End With 
    Rng.Value = OutputValue 

    With Worksheets("Sheet4") 
    Set Rng = .Range(.Cells(8, 2), .Cells(12, 4)) 
    End With 
    Rng.Value = OutputValue 

    With Worksheets("Sheet4") 
    Stg = "C" & 14 & ":G" & 20 
    Set Rng = .Range(Stg) 
    End With 
    Rng.Value = OutputValue 

End Sub 

Хотя этот макрос пишет массив на листе, многие точки применяются в противоположном направлении. Точки я особенно хочу вам заметить, являются:

  • Для вывода, массив не должен быть Variant и не нижние границы должны быть 1. Я сделал OutputValue массив строк, поэтому вывод значения строк , Измените OutputValue на массив Variant и запустите макрос, чтобы увидеть эффект.
  • Я использовал три разных способа создания диапазона, чтобы продемонстрировать некоторые из ваших вариантов.
  • Если вы укажете диапазон, который у меня есть, рабочий лист является одним из свойств диапазона. Вот почему я могу взять Rng.Value = OutputValue за пределами With ... End With и все еще иметь данные, записанные на правильный рабочий лист.
  • При копировании из диапазона в вариант, Excel устанавливает размеры варианта по мере необходимости. При копировании из массива в диапазон, вы несете ответственность за правильность размера диапазона. Во втором диапазоне я потерял данные. С третьим диапазоном я получил N/As.

Надеюсь, что вышеизложенное дает вам представление о ваших вариантах. Если я правильно понимаю ваши требования правильно, вы должны:

  • погрузить весь рабочий лист с вариантом
  • Создать новый массив соответствующего размера
  • Выборочное копирование данных из Variant в массив.

Возвращайтесь с вопросами, если что-то неясно.

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