Как установить формулу из VBA, чтобы назначить значение ячейки? - PullRequest
0 голосов
/ 11 июня 2019

Я устанавливаю значение ячейки в Sheet1 по формуле, включающей ячейки из Sheet1 и Sheet2. Есть ли способ установить такую ​​формулу из VBA?

Вот что у меня есть:

Я заполняю некоторую информацию от B11 до M11 по всей строке № 29, например, заполняя форму по строкам. Иногда это будет только одна строка с информацией, а также могут быть все таблицы с данными.

В столбце G у меня есть раскрывающийся список, и в соответствии со значением из этого раскрывающегося списка соответствующая ячейка H заполняется.

Мне удается установить формулу для этого, но из-за безопасности я хочу установить его из VBA.

=IFERROR(VLOOKUP(G11;Data!B2:D13;3;FALSE);0)

Ответы [ 4 ]

2 голосов
/ 11 июня 2019

WorksheetFunction.Vlookup() работает довольно хорошо, если вы правильно используете диапазоны и параметры:

Public Function SomeFormula() As Variant

    On Error GoTo SomeFormula_Error

    Dim result As Variant
    result = WorksheetFunction.VLookup(Range("G11"), Worksheets("Data").Range("B2:D13"), 3, False)
    SomeFormula = result

    On Error GoTo 0
    Exit Function

SomeFormula_Error:

    SomeFormula = 0

End Function
2 голосов
/ 11 июня 2019

Вы можете просто сохранить формулу в столбце G и защитить этот диапазон, чтобы пользователь не мог ее изменить.

В качестве альтернативы, используя обработчик событий Worksheet_Change:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cl As Range
Dim val as Variant
' In case the change is NOT in column G, then Exit.
If Intersect(Target, Columns("G")) Is Nothing Then Exit Sub
For Each cl in Intersect(Target, Columns("G"))
    val = Application.Vlookup(cl.Value, ThisWorkbook.Worksheets("Data").Range("B2:D13"), 3, False)
    If IsError(val) Then
        cl.Offset(0, 1).Value = 0
    Else
        cl.offset(0, 1).Value = val
    End If
Next
End Sub

Если вам нужно выполнить одно и то же с несколькими столбцами, это немного сложнее, потому что вы можете иметь только один обработчик Worksheet_Change на данном листе. Так что вам нужно изменить его, как показано ниже. Это может быть немного упрощено, чтобы уменьшить избыточность, но это упражнение для другого вопроса :)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cl As Range
Dim val as Variant
' Handles column G
If Not Intersect(Target, Columns("G")) Is Nothing Then 

    For Each cl in Intersect(Target, Columns("G"))
        val = Application.Vlookup(cl.Value, ThisWorkbook.Worksheets("Data").Range("B2:D13"), 3, False)
        If IsError(val) Then
            cl.Offset(0, 1).Value = 0
        Else
            cl.offset(0, 1).Value = val
        End If
    Next
End If
If Not Intersect(Target, Columns("J") Is Nothing Then
    For Each cl in Intersect(Target, Columns("J"))
        val = { your formula used for populating column J }  '## UPDATE THIS WITH YOUR PROPER FORMULA/FUNCTION
        If IsError(val) Then
            cl.Offset(0, 3).Value = 0
        Else
            cl.offset(0, 3).Value = val
        End If
    Next
End Sub
0 голосов
/ 11 июня 2019

это макрос, который я придумал.Он будет циклически проходить через указанный вами диапазон и применять запрашиваемый vlookup.Он будет работать только тогда, когда вы действительно запустите макрос.

Sub Macro1()
Dim startRow as Integer
Dim endRow as Integer
Dim wsData as Worksheet

'just edit the Sheet2 name to the actual sheet name
Set wsData as ActiveWorkbook.Worksheets("Sheet2")
'this is the starting row of your B11 and the end row of your M29
startRow = 11
endRow = 29


'For loop to look at each row in your range on sheet1 that you want to populate
For startRow To endRow
    'This assign the value returned by the vlookup to the cell H of whatever row it is now checking
    wsData.Cells(startRow, 8).Value = Iferror(vlookup(startRow, 7;wsData.Range(Cells(2, 2), Cells(13, 4));3;False);0)
Next startRow

End sub

Сообщите мне, если у вас возникнут какие-либо проблемы или у вас возникнут вопросы.

0 голосов
/ 11 июня 2019

Вы можете использовать средство записи макросов: перейдите на вкладку разработчика на ленте, затем запишите макрос, затем нажмите на ячейку с формулой, затем нажмите «Остановить запись на ленте», затем откройте VBA, и Excel уже сгенерирует макрос для вас.

Когда я делаю это, я получаю следующее:

    Sub Macro1()
        Range("A1").Select
    'I have entered my formula in cell A1
        ActiveCell.FormulaR1C1 = _
            "=IFERROR(VLOOKUP(R[10]C[6],Data!R[1]C[1]:R[12]C[3],3,FALSE),0)"
    End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...