2017-01-03 6 views
0

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

Столбцы A-Q (данные) Столбец R (вставленные значения из массива, 17 целых чисел) Столбец S (вставить формулы на основе значения в столбце R). Обратите внимание, что эти данные простираются вниз между 150k-250k строк, поэтому, если возможно, желательно что-то эффективное. Я чувствую, что цикл займет годы.

Будет ли это просто двумерным массивом? или какой-то vlookup, закодированный в vba? Просто ищем удар в правильном направлении. Благодарю.

ответ

0

Если вы правильно поняли, у вас есть массив данных (расположенный в столбцах A-R), а столбец R - единственное, от которого напрямую зависит формула в столбце S.

Этот макрос должен сделать трюк. Предполагая, что вы не планируете делать что-либо вычислительно интенсивным, чтобы определить формулу, это также будет очень быстро. На моем компьютере эти два, поскольку они написаны письменными, выполняются через 1-2 секунды на 1 миллион строк.

Макрос предполагает, что вы выберете часть таблицы данных, которую хотите обработать. Важно только, чтобы ваш столбец R был последним столбцом. Также было бы легко переписать его так, чтобы он всегда принимал столбец R, и он сам определяет, сколько строк у них, в случае, если это ваше желаемое поведение.

макросъемки:

Sub MyMacro() 

Dim DataRange As Excel.Range 
Dim InputRange As Excel.Range 
Dim OutputRange As Excel.Range 

Dim InputData() As Variant 
Dim OutputData() As Variant 

Dim RowNumber As Long 
Dim ColumnNumber As Long 

Dim i As Long 

Set DataRange = Excel.Selection 

RowNumber = DataRange.Rows.Count 
ColumnNumber = DataRange.Columns.Count 

'this sets the input as the last column in the data range and 
'the output range exactly next to your array of inputs, 
'regardless of whether it ends on column R, S, or wherever 
Set InputRange = DataRange.Columns(ColumnNumber) 
Set OutputRange = InputRange.Offset(0, 1) 

'this stores the values from the input range into an array, 
'and initializes the output array (it will be a 2D array - (Row, Column)  
InputData = InputRange.Value 
OutputData = OutputRange.Value 

'you populate the value array inside VBA and only output to excel once - 
'this is MUCH faster than interating through the cells directly 
For i = 1 To RowNumber 
    OutputData(i, 1) = FunctionThatReturnsFormulasFromInputs(InputData(i, 1)) 
Next i 

OutputRange.Formula = OutputData 

End Sub 

Пример функции:

Function FunctionThatReturnsFormulasFromInputs(InputValue As Variant) As String 

Select Case InputValue 
    Case 1 
     FunctionThatReturnsFormulasFromInputs = "aaa" 
    Case Else 
     FunctionThatReturnsFormulasFromInputs = "bbb" 
End Select 

End Function