VBA в Excel - изменение формулы VLOOKUP в столбце для вставки имени листа на основе значения ячейки stati c - PullRequest
0 голосов
/ 12 марта 2020

У меня есть рабочая книга с несколькими листами, и новые листы будут регулярно добавляться в формате [мммм гг]. На моем главном листе («ContactList») у меня есть формула IF с «вложенной» формулой VLOOKUP в трех столбцах, чтобы извлечь соответствующие числа из соответствующего листа, и у меня есть ячейка с датой в желаемом формате. Я хочу, чтобы мой скрипт смотрел на ячейку с датой в ней и использовал значение этой ячейки, чтобы обновить столбцы формул VLOOKUP, чтобы они соответствовали этому. Например, в феврале ячейка на моем главном листе будет отображать «20 февраля», поэтому мои формулы VLOOKUP будут выглядеть на листе с заголовком «20 февраля». В марте эта ячейка будет обновлена, и я хочу, чтобы мой сценарий (желательно автоматически, но с кнопкой был в порядке) обновил все функции VLOOKUP, которые теперь отображаются на листе «20 марта».

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

        Sub Update_Counts()
        Dim rng As Range
        Dim cellnum As Integer
        Dim curr As Object
        Dim v1 As String, v2 As String, v3 As String, v4 As String, v5a As String, v5b As String, v5c As String
        Dim v6a As String, v6b As String, v6c As String, strFormC As String, strFormMR As String, strFormMD As String

        v1 = "=IF(VLOOKUP("
        v2 = Cells(cell.Row, "A")
        v3 = ",'"
        v4 = Cells(1, 6).Value
        v5a = "'!B7:F50, 2, FALSE) = 0, 'EMPTY', VLOOKUP("
        v5b = "'!B7:F50, 3, FALSE) = 0, 'EMPTY', VLOOKUP("
        v5c = "'!B7:F50, 4, FALSE) = 0, 'EMPTY', VLOOKUP("
        v6a = "'!B7:F50, 2, FALSE))"
        v6b = "'!B7:F50, 3, FALSE))"
        v6c = "'!B7:F50, 4, FALSE))"

        strFormC = v1 & v2 & v3 & v4 & v5a & v2 & v3 & v4 & v6a
        strFormMR = v1 & v2 & v3 & v4 & v5b & v2 & v3 & v4 & v6b
        strFormMD = v1 & v2 & v3 & v4 & v5c & v2 & v3 & v4 & v6c

        Set curr = Worksheets("ContactList").Cells(cellnum, 6)
        Set rng = Sheets("ContactList").Range("F3:H55")

            For cellnum = 3 To 55
                If Cells(2, 6).Value = "Commercial Total" Then
                 curr.Value = strFormC
                ElseIf Cells(2, 7).Value = "Medicare" Then
                 curr.Value = strFormMR
                ElseIf Cells(2, 8).Value = "Medicaid" Then
                 curr.Value = strFormMD
                End If
            Next cellnum
    End Sub

Это то, что я имею до сих пор. В настоящее время я получаю «Ошибка времени выполнения 424; Требуется объект». Я думал, что наличие curr в качестве объекта позволит мне пройти через него, но я думаю, что мое значение cellnum является частью «необходимо быть объектом» оператора For. Однако я не уверен, как получить значения ячеек там без того, как это настроено. Я попробовал «Для каждого» * ​​1010 *, но у меня там тоже было множество проблем. Я не смог найти ни одного примера людей, желающих обновить формулы своих ячеек, включая значение ячейки, но, возможно, я просто не смотрел в правильном месте. Любой совет очень ценится!

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Я понял это из ответа @CLR, спасибо! Я боролся с трудностями, потому что я выяснил значение даты, чтобы остановить попытку сценария импортировать новый документ, но критерии If / ElseIf стали немного неясными. Поскольку все заголовки существовали всегда, он вводил последнее условие по всем направлениям, то есть я получал данные столбца 3 для всех трех столбцов. Я уверен, что есть более аккуратный способ сделать это, но по крайней мере для меня, я счастлив разделить три функции и иметь кнопку, запускающую все три.

Private Sub CommandButton1_Click()
Update_Counts_COM
Update_Counts_MR
Update_Counts_MD
End Sub

Sub Update_Counts_COM()

    Dim rng As Range

    With Sheets("ContactList")

        Set rng = .Range("F3:F21,F24:F27,F30:F51")

        lookupformula = "=IFERROR(IF(VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)=0,""EMPTY"",VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)), ""Not Found"")"

        For Each c In rng.Cells

            sheetname = .Cells(1, 6).Value
            thisrow = c.Row

            If .Cells(2, 6).Value = "Commercial Total" Then
                colnum = 2

            End If

                finalformula = Replace(Replace(Replace(lookupformula, "<rownum>", thisrow), "<sheetname>", sheetname), "<colnum>", colnum)
                c.Formula = finalformula
        Next
    End With

End Sub

Sub Update_Counts_MR()

    Dim rng As Range

    With Sheets("ContactList")

        Set rng = .Range("G3:G21,G24:G27,G30:G51")

        lookupformula = "=IFERROR(IF(VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)=0,""EMPTY"",VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)), ""Not Found"")"

        For Each c In rng.Cells

            sheetname = .Cells(1, 6).Value
            thisrow = c.Row

            If .Cells(2, 7).Value = "Medicare" Then
                colnum = 3

            End If

                finalformula = Replace(Replace(Replace(lookupformula, "<rownum>", thisrow), "<sheetname>", sheetname), "<colnum>", colnum)
                c.Formula = finalformula
        Next
    End With

End Sub

Sub Update_Counts_MD()

    Dim rng As Range

    With Sheets("ContactList")

        Set rng = .Range("H3:H21,H24:H27,H30:H51")

        lookupformula = "=IFERROR(IF(VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)=0,""EMPTY"",VLOOKUP(A<rownum>,'<sheetname>'!B7:F59,<colnum>,FALSE)), ""Not Found"")"

        For Each c In rng.Cells

            sheetname = .Cells(1, 6).Value
            thisrow = c.Row

            If .Cells(2, 8).Value = "Medicaid" Then
                colnum = 4

            End If

                finalformula = Replace(Replace(Replace(lookupformula, "<rownum>", thisrow), "<sheetname>", sheetname), "<colnum>", colnum)
                c.Formula = finalformula
        Next
    End With

End Sub

- вот что сработало для меня! Спасибо всем:)

0 голосов
/ 12 марта 2020

Как я добавил в своем комментарии, вам не нужно использовать VBA для этого.

Если я правильно читаю ваш код , я думаю, что вам просто нужна следующая формула в ячейке A3 и скопируйте ее:

=IF(VLOOKUP($A3,INDIRECT("'"&$F$1&"'!B7:F50"),IF($F$2="Commercial Total",2,IF($G$2="Medicare",3,IF($H$2="Medicaid",4,1))),FALSE)=0,"EMPTY",VLOOKUP($A3,INDIRECT("'"&$F$1&"'!B7:F50"),IF($F$2="Commercial Total",2,IF($G$2="Medicare",3,IF($H$2="Medicaid",4,1))),FALSE))

Это из предположений, которые я сделал, прочитав ваш код:

Ячейка F1 содержит имя листа, с которого вы хотите получить данные.

Один из ячеек F2, G2 и H2 будет содержать ключевые слова Commercial Total, Medicare и Medicaid соответственно.


Если вы хотите, чтобы некоторые код, однако, вот как я мог бы гибко построить LOOKUP:

Sub Update_Counts()

    Dim rng As Range

    With Sheets("ContactList")

        Set rng = .Range("F3:F55")

        lookupformula = "=IF(VLOOKUP(A<rownum>,'<sheetname>'!B7:F50,<colnum>,FALSE)=0,""EMPTY"",VLOOKUP(A<rownum>,'<sheetname>'!B7:F50,<colnum>,FALSE))"

        For Each c In rng.Cells

            sheetname = .Cells(1, 6).Value
            thisrow = c.Row

            If .Cells(2, 6).Value = "Commercial Total" Then
                colnum = 2
            ElseIf .Cells(2, 7).Value = "Medicare" Then
                colnum = 3
            ElseIf .Cells(2, 8).Value = "Medicaid" Then
                colnum = 4
            End If

            finalformula = Replace(Replace(Replace(lookupformula, "<rownum>", thisrow), "<sheetname>", sheetname), "<colnum>", colnum)

            c.Formula = finalformula

        Next

    End With

End Sub
...