【问题标题】:Converting formula to VBA将公式转换为 VBA
【发布时间】:2017-11-30 08:04:31
【问题描述】:

我对 VBA 很陌生,我有一个公式,我想在宏中使用它。

我使用宏录制来获得 vba,但问题是它为每一行生成,使 vba 代码复杂。此外,它在公式栏中显示公式。 我有两张表格,表格 1(BW)和表格 2(CW)。我想要工作表 1 中的代码。它在工作表 2 中查找 ID 并将值从 Ad 复制到工作表 1 的 Au。

我已经尝试过,在某种程度上将我的公式实现为代码。

=IF(IFERROR(VLOOKUP($B2;CW!$B$2:$AU591;30;FALSE);"0")=0;" ";IFERROR(VLOOKUP($B2;CW!$B$2: $AU591;30;FALSE);""))

Sub lookupo()

Dim totalrows As Long
Dim totalrowssh2 As Long
 totalrows = Sheets("BW").Cells(Rows.Count, "A").End(xlUp).Row
    totalrowsSht2 = Sheets("CW").Cells(Rows.Count, "A").End(xlUp).Row
  sheets("BW").Range("AD2:AD" & Totalrows).formula = Application.WorksheetFunction.If(Iferror(Apllication.Vlookup(sheets("BW").Range("B2:B" &totalrowssht2), Sheets("CW").Range("$A:$AU"),29,False),"0"))=0,"")
End Sub

我很惊讶我应该如何实现第二个公式。有人可以帮助我克服 VBA 代码。

【问题讨论】:

  • 除了 Siddharth 所说的之外,我还要补充一点,一致的拼写在编码中至关重要:totalrowssh2/totalrowsSht2。每个模块顶部的Option Explicit 指出了这些错误。

标签: vba excel


【解决方案1】:

无需使用Application.WorksheetFunction。您可以直接将公式字符串分配给单元格。

这是你正在尝试的吗?

Sub lookupo()
    Dim BWlRow As Long, CWlRow As Long
    Dim Sformula As String
    Dim wsBW As Worksheet, wsCW As Worksheet

    Set wsBW = Sheets("BW"): Set wsCW = Sheets("CW")

    BWlRow = wsBW.Cells(wsBW.Rows.Count, "A").End(xlUp).Row
    CWlRow = wsCW.Cells(wsCW.Rows.Count, "A").End(xlUp).Row

    Sformula = "=IF(IFERROR(VLOOKUP($B2;CW!$B$2:$AU" & _
               CWlRow & _
               ";30;FALSE);""0"")=0;"" "";IFERROR(VLOOKUP($B2;CW!$B$2:$AU" & _
               CWlRow & _
               ";30;FALSE);""""))"

    wsBW.Range("AD2:AD" & BWlRow).Formula = Sformula
End Sub

如果; 不是您的分隔符,请使用此选项。

    Sformula = "=IF(IFERROR(VLOOKUP($B2,CW!$B$2:$AU" & _
               CWlRow & _
               ",30,FALSE),""0"")=0,"" "",IFERROR(VLOOKUP($B2,CW!$B$2:$AU" & _
               CWlRow & _
               ",30,FALSE),""""))"

如何将相同的内容扩展到 AU 列。 ? – Mikz 4 分钟前

在应用之前,您必须遍历列并修改公式。

Sub lookupo()
    Dim BWlRow As Long, CWlRow As Long, i As Long
    Dim Sformula As String
    Dim wsBW As Worksheet, wsCW As Worksheet

    Set wsBW = Sheets("BW"): Set wsCW = Sheets("CW")

    BWlRow = wsBW.Cells(wsBW.Rows.Count, "A").End(xlUp).Row
    CWlRow = wsCW.Cells(wsCW.Rows.Count, "A").End(xlUp).Row

    For i = 30 To 47 '~~> Col AD to AU
        Sformula = "=IF(IFERROR(VLOOKUP($B2,CW!$B$2:$AU" & _
                   CWlRow & _
                   "," & _
                   i & _
                   ",FALSE),""0"")=0,"" "",IFERROR(VLOOKUP($B2,CW!$B$2:$AU" & _
                   CWlRow & _
                   "," & _
                   i & _
                   ",FALSE),""""))"

        With wsBW
            .Range(.Cells(2, i), .Cells(BWlRow, i)).Formula = Sformula
        End With
    Next i
End Sub

【讨论】:

  • 最后一行出现应用程序定义错误。 wsBW.Range("AD2:AD" & BWlRow).Formula = Sformula
  • 那么这意味着;不是你的分隔符。它是,Sformula = "=IF... 中的所有; 替换为,
  • 我已经更新了上面的帖子。您可能需要刷新页面才能看到它
  • 它有效。但是,如果我是正确的,它只适用于 AD 列。我怎样才能将相同的内容扩展到 AU 列。 ?
  • 所以在 Col AE 中,30 变成了31?
【解决方案2】:

Application.WorksheetFunction 是个好主意,如果您认为有一天您的 Excel 会在英语国家以外的地方使用。此外,您不必担心这种方式的公式分隔符,Excel 会自动设置它们。

话虽如此,请尝试在文件顶部使用 Option Explicit(这会立即突出显示变量定义错误),然后更正您的代码,然后像这样修复它:

  • totalrowssh2 - 确保 totalrowssht2 相同 到处。
  • Apllication.Vlookup - 看看这里并修正语法错误。

然后尝试下面的代码并稍微修复一下:

Sub lookupo()

    Dim totalrows       As Long
    Dim totalrowssh2    As Long

    totalrows = Worksheets("BW").Cells(Rows.Count, "A").End(xlUp).Row
    totalrowssh2 = Worksheets("CW").Cells(Rows.Count, "A").End(xlUp).Row
    Worksheets(1).Range("AD2:AD" & totalrows).Formula = Application.WorksheetFunction.If(WorksheetFunction.IfError(Application.VLookup(Sheets(1).Range("B2:B" & totalrowssh2), Sheets("CW").Range("$A:$AU"), 29, False), "0") = 0, "")

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多