Как переписать входные данные (диапазон) функции с новой переменной (вариант)? - PullRequest
0 голосов
/ 07 мая 2019

Я хотел бы дать новое значение входным данным в моей функции: пусть data (range) будет data2 (option). Как мне этого добиться?

Вот мой код:

Function test(data As Range)

Dim i As Integer
Dim data2() As Variant

ReDim data2(data.Columns.Count * 4)

For i = 1 To (4 * data.Columns.Count)
data2(1 + (i - 1) * 4, 1) = 0
data2(2 + (i - 1) * 4, 1) = 0
data2(3 + (i - 1) * 4, 1) = 0
data2(4 + (i - 1) * 4, 1) = data(i)
Next i

data = data2 'this is where it fails
' ...
'50 rows of code
' ...

тест Конечная функция

Это данные :

enter image description here

Я определяю data2 = [0,0,0,1,0,0,0,4,0,0,0,3]. Затем я хотел бы дать новые значения для data :

данные = данные2

(я не хочу вводить эти data2 значения, мне просто нужно data2 для моих расчетов.)

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Допустим, следующие данные

enter image description here

И следующая тестовая функция, вызывающая вашу процедуру MyProcedure.

Option Explicit    

Public Sub test()
    MyProcedure Range("A1:C1")
End Sub

Дело в том, что диапазон всегда состоит из rows и columns, даже если у вас есть только одна строка, такая как Range("A1:J1") ваш массив NewData должен отражать это по своим измерениям NewData(rows, columns).

Public Sub MyProcedure(ByRef InputData As Range)
    Dim NewData() As Variant
    ReDim NewData(1 To InputData.Rows.Count, 1 To InputData.Columns.Count * 4)

    Dim iCol As Long
    For iCol = 1 To InputData.Columns.Count * 4
        If iCol Mod 4 = 0 Then
            NewData(1, iCol) = InputData(1, iCol / 4)
        Else
            NewData(1, iCol) = 0
        End If
    Next iCol

    'InputData data needs to be resized otherwise it cannot take all data from NewData!
    InputData.Resize(ColumnSize:=InputData.Columns.Count * 4).Value = NewData
End Sub

Результат будет:

enter image description here

Я рекомендую всегда активировать Option Explicit: в редакторе VBA перейдите на Инструменты Параметры Требуется объявление переменной .

1 голос
/ 07 мая 2019

Функции предназначены для того, чтобы вернуть вам что-то, значение, строку или что-то еще. Когда вы изменяете что-то из другой процедуры, просто используйте Sub:

Option Explicit
Sub test(data As Range)

    Dim C As Range

     For Each C In data
        C = 1
     Next C

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...