Динамически выбрать ячейки для использования в функции VBA - PullRequest
0 голосов
/ 18 января 2019

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

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

Function AddedValue(TabSize As Integer)

Select Case TabSize

    Case 2
        AddedValue = Range("K3") * (Range("N3") * (Range("H3") * 0.001))

    Case 4
        AddedValue = Range("K3") * (Range("O3") * (Range("H3") * 0.001))

    Case 6
        AddedValue = Range("K3") * (Range("P3") * (Range("H3") * 0.001))

    Case 8
        AddedValue = Range("K3") * (Range("Q3") * (Range("H3") * 0.001))

    Case 10
        AddedValue = Range("K3") * (Range("R3") * (Range("H3") * 0.001))

End Select
End Function

Ответы [ 5 ]

0 голосов
/ 18 января 2019

Расчет динамических ячеек

Option Explicit

Function AddedValue(TabSize As Long, row As Long) As Double

    Const cValue As String = "2,4,6,8,10"
    Const cStr1 As String = "K"
    Const cStr2 As String = "N,O,P,Q,R"
    Const cStr3 As String = "H"
    Const cDbl1 As Double = 0.001

    Dim vntV As Variant
    Dim vnt2 As Variant
    Dim i As Long

    vntV = Split(cValue, ",")
    vnt2 = Split(cStr2, ",")

    For i = 0 To UBound(vntV)
        If TabSize = CLng(Trim(vntV(i))) Then
            AddedValue = Range(cStr1 & row) * Range(Trim(vnt2(i)) & row) _
                    * Range(cStr3 & row) * cDbl1
            Exit For
        End If
    Next

End Function
0 голосов
/ 18 января 2019

Вы можете использовать Application.Caller, чтобы обнаружить ячейку, в которой выполняется функция:

Public Function AddedValue(TabSize As Integer)
    Application.Volatile
    r = Application.Caller.Row
    With Application.Caller.Parent.Rows(r)
        firstcell = .Cells(1, 11) ' column K
        Select Case TabSize
            Case 2
                secondcell = .Cells(1, 14) ' column N
            Case 4
                secondcell = .Cells(1, 15) ' column O
            Case 6
                secondcell = .Cells(1, 16) ' column P
            Case 8
                secondcell = .Cells(1, 17) ' column Q
            Case 10
                secondcell = .Cells(1, 18) ' column R
            End Select
        thirdcell = .Cells(8) ' column H
        AddedValue = firstcell * (secondcell * (thirdcell * 0.001))
    End With
End Function

В качестве альтернативы, если TabSize одинаков в соответствии с предложением вашего вопроса - вы также можете «рассчитать», какой столбец изэто:

Public Function AddedValue2(TabSize As Integer)
    Application.Volatile
    r = Application.Caller.Row
    With Application.Caller.Parent.Rows(r)
        firstcell = .Cells(1, 11) ' column K
        secondcell = .Cells(1, 13 + (TabSize / 2)) ' dynamic column from TabSize
        thirdcell = .Cells(8) ' column H
        AddedValue2 = firstcell * (secondcell * (thirdcell * 0.001))
    End With
End Function
0 голосов
/ 18 января 2019

Ну, быстрый и простой способ - передать строку в качестве аргумента функции.

Function AddedValue(TabSize As Integer, row As Long)

Select Case TabSize
    Case 2
        AddedValue = Range("K" & row) * (Range("N" & row) * (Range("H" & row) * 0.001))
    Case 4
        AddedValue = Range("K" & row) * (Range("O" & row) * (Range("H" & row) * 0.001))
    Case 6
        AddedValue = Range("K" & row) * (Range("P" & row) * (Range("H" & row) * 0.001))
    Case 8
        AddedValue = Range("K" & row) * (Range("Q" & row) * (Range("H" & row) * 0.001))
    Case 10
        AddedValue = Range("K" & row) * (Range("R" & row) * (Range("H" & row) * 0.001))
End Select
End Function
0 голосов
/ 18 января 2019

Это должен быть VBA? Это единственное решение должно работать на вас:

=$H3*0.001*$K3*INDEX($N3:$R3,,1)

Последний 1 - это индекс столбца в этом диапазоне (N:R), который вы хотите. Так что 1 = "Использовать столбец N" и 2 = "Использовать столбец O" и т. Д. Вы можете просто скопировать формулу и вставить строки, и она будет автоматически корректировать номера строк, оставляя столбцы одинаковыми.

Кроме того, при желании вы можете использовать ссылку на ячейку вместо жесткого кодирования номера «Selected Column / TabSize», например, так (где номер «Selected Column / TabSize» в ячейке A1 в этом примере):

=$H3*0.001*$K3*INDEX($N3:$R3,,A1)
0 голосов
/ 18 января 2019

Вы можете добавить входные данные для строки и затем объединить строку в строки диапазона.Вот так:

Function AddedValue(TabSize As Integer, iRow as Long)

Select Case TabSize

    Case 2
        AddedValue = Range("K" & iRow) * (Range("N" & iRow) * (Range("H" & iRow) * 0.001))

    Case 4
        AddedValue = Range("K" & iRow) * (Range("O" & iRow) * (Range("H" & iRow) * 0.001))

    Case 6
        AddedValue = Range("K" & iRow) * (Range("P" & iRow) * (Range("H" & iRow) * 0.001))

    Case 8
        AddedValue = Range("K" & iRow) * (Range("Q" & iRow) * (Range("H" & iRow) * 0.001))

    Case 10
        AddedValue = Range("K" & iRow) * (Range("R" & iRow) * (Range("H" & iRow) * 0.001))

End Select
End Function
...