Я думаю, что вы запрашиваете дополнительную информацию о перемещении данных между диапазонами и переменными, так что это вопрос, на который я попытаюсь ответить.
Создайте новую книгу. Оставить лист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 в массив.
Возвращайтесь с вопросами, если что-то неясно.