Я начинаю изучать VBA
программирование в Excel, поэтому мой вопрос может быть довольно простым.
Все, что я пытаюсь сделать, это:
1) Получить мой код для установки некоторого диапазона (строка или столбец) 2) Получить мой код для создания массива со значениями этого диапазона
Представьте, что у меня есть некоторые числа в column A, from A1 to A50
.Если я выберу ячейку F7
(rng1
в приведенном ниже коде) и запусту код, я хотел бы получить данные A1:A7
(rng2
), Z5
даст мне A1:A5
и так далее.
Первое, что я попробовал, было следующее:
Sub getdata()
Dim rng1 As Range 'This will be the selected cell
Dim rng2 As Range 'This will contain the data I want to retrieve
Dim data() As Variant 'And this will be the data
' Define the ranges
Set rng1 = Selection
Set rng2 = Range(Cells(1, 1), Cells(rng1.Row, 1))
'Get data
data = rng2.Value
Stop
End Sub
, который по какой-то причине создает древовидную структуру вместо одномерного массива.
Я бы хотел комфортно работать с данными, поэтому я посмотрел и нашел обходной путь в Интернете с помощью этой процедуры:
Sub SubValuesFromRange()
Dim someRange As Range
Dim someValues As Variant
Set someRange = Selection
With someRange
If .Cells.Count = 1 Then
ReDim someValues(1 To 1)
someValues(1) = someRange.Value
ElseIf .Rows.Count = 1 Then
someValues = Application.Transpose(Application.Transpose(someRange.Value))
ElseIf .Columns.Count = 1 Then
someValues = Application.Transpose(someRange.Value)
Else
MsgBox "someRange is multi-dimensional"
End If
End With
Stop
End Sub
Эта процедура сама по себе работает нормально.Если я выбираю A1:A5
и запускаю его, он получает данные.Если я попробую сделать это со строкой, она тоже будет работать.
Поэтому я попытался создать из нее функцию, которую я мог бы использовать в своей основной процедуре, и это было бы очень полезно для моих будущих программ.
Вот код и функции:
Sub getdata()
Dim rng1 As Range 'This will be the selected cell
Dim rng2 As Range 'This will contain the data I want to retrieve
Dim data() As Variant 'And this will be the data
' Define the ranges
Set rng1 = Selection
Set rng2 = Range(Cells(1, 1), Cells(rng1.Row, 1))
'Get data, this time throug the function
data = ValuesFromRange(rng2)
Stop
End Sub
Function ValuesFromRange(someRange)
Dim someValues As Variant
With someRange
If .Cells.Count = 1 Then
ReDim someValues(1 To 1)
someValues(1) = someRange.Value
ElseIf .Rows.Count = 1 Then
someValues = Application.Transpose(Application.Transpose(someRange.Value))
ElseIf .Columns.Count = 1 Then
someValues = Application.Transpose(someRange.Value)
Else
MsgBox "someRange is multi-dimensional"
End If
End With
End Function
И ... Я получаю сообщение об ошибке:
Номер 13, несоответствие типов
Есть идеи почему?
Может ли быть более простой способ получить данные Excel в VBA
?