【问题标题】:Tables and loops VBA表和循环 VBA
【发布时间】:2018-07-01 14:25:01
【问题描述】:

我是编码新手,并且已经编写了一些代码来在表格中进行一些计算并填写列。我让它为表中的第一行工作,但我在弄清楚如何循环它以完成表中每一行的计算时遇到了一些麻烦。任何帮助和建议将不胜感激!

更新:

感谢您的帮助!该代码非常适合此处提供的第一部分,我尝试将其应用于其他 2 部分,但出现错误。我认为是因为我试图使用字符串作为输入?我试过不带引号,但它返回的只是“#NAME?”。

Sub CommandButton1_Click()

Dim tbl As ListObject
Set tbl = ThisWorkbook.Sheets("Data").ListObjects("Table1")

Dim formulaText As String
formulaText = 
"=IF([@Reach]>=100000,5,IF([@Reach]>=50000,3,IF([@Reach]>=10000,2,1)))"
tbl.ListColumns("Media Significance").DataBodyRange.Formula = formulaText


Dim formulaText1 As String
formulaText1 = "=IF([@Headline Mentions]>="Yes",5,IF([@Exclusive 
Mentions]>="Yes",3,1))"
tbl.ListColumns("Prominence Score").DataBodyRange.Formula = formulaText1


Dim formulaText2 As String
formulaText2 = "=IF([@Sentiment]>="Very Positive",2,IF([@Sentiment]>="Very 
Negative",2,1))"
tbl.ListColumns("Very Positive/ Very Negative").DataBodyRange.Formula = 
formulaText2


End Sub

【问题讨论】:

  • 使用F8 逐步完成此操作,您将能够逐行跟进。这应该可以帮助您了解逻辑在哪里没有按照您的预期进行,并从那里进行调整。请注意,当您在线时,您可以将鼠标悬停在一个变量上,它会有一个漂亮的小工具提示类型的东西,显示该变量当前是什么。
  • 你有一个好的开始。以下是一些循环帮助:[excel-easy.com/vba/loop.html] 尝试一下,让我们知道它是如何工作的。
  • 通常,您会为重要列选择起始行和终止行,并使用该系列行号来访问其他列中的单元格。是否有一列的值比其他列更重要,或者任何列的值与上述相比是否可以作为下限?

标签: excel vba loops if-statement


【解决方案1】:

循环遍历区域中的每个单元格非常慢,因此您要么先将数据加载到数组中,要么使用常规 Excel 公式 + FillDown 函数。

在这种特殊情况下,我建议使用第二个选项,它允许您将公式添加到单个单元格中,并将其填充到该列的其余部分。这样的事情应该可以工作:

Dim colNum As Long
With ThisWorkbook.Sheets("Example Sheet")
    'Find last row in sheet
    Dim lastRow As Long
    lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

    'Add first formula
    colNum = .Range("V2").Column
    .Cells(2, colNum).Formula = "=IF(T2>=100000,5,IF(T2>=50000,3,IF(T2>=10000,2,1)))"
    .Range(.Cells(2, colNum), .Cells(lastRow, colNum)).FillDown
End With

您当前代码的一个问题是列字母是硬编码的。 IE,您希望在 L 列中找到名为“Reach”的内容,并假设始终如此。但是,如果您在“Reach”左侧添加另一列,则会破坏您的代码。

这就是为什么我可能会建议将您的范围转换为具有描述性列名的table object 的原因之一。这应该使您的代码更易于阅读和维护,如下所示:

Dim tbl As ListObject
Set tbl = ThisWorkbook.Sheets("Example Sheet").ListObjects("YourTable")

Dim formulaText As String
formulaText = "=IF([@Reach]>=100000,5,IF([@Reach]>=50000,3,IF([@Reach]>=10000,2,1)))"
tbl.ListColumns("Reach Analysis").DataBodyRange.Formula = formulaText

【讨论】:

  • CommandButton1_Click 子过程通常位于工作表的私有代码表上。虽然在处理公共模块代码表中的单元格时提供父工作表引用很重要,但您可以在工作表的私有代码表中遵循默认父工作表而不会受到不当惩罚。
  • 如果这个宏实际上总是要从命令按钮调用——或者如果它肯定在私有代码表中——当然,你可以默认使用 ActiveSheet。但我不知道是否真的是这样,所以我没有假设。老实说,根据宏实际在做什么,将它分配给一个按钮(或让它成为一个私有子)会很奇怪。而且由于 OP 对 VBA 来说似乎相对较新,我不想让他们养成使用不合格范围的习惯。
  • 您好,感谢您的帮助!如果你能看一下我的更新,我将不胜感激。
  • 每当您的公式中包含 " 字符时,您都需要添加一个额外的字符。因此,请输入“是”而不是“是”。
【解决方案2】:

首先,您的第一个 If/ElseIf/End If 语句中有多余的条件。

这个,

If Reach >= 100000 Then
    Result = 5
ElseIf Reach < 100000 And Reach >= 50000 Then
    Result = 3
ElseIf Reach < 50000 And Reach >= 10000 Then
    Result = 2
ElseIf Reach < 10000 Then
    Result = 1
End If

...可以更简洁地写成,

If Reach >= 100000 Then
    Result = 5
ElseIf Reach >= 50000 Then
    Result = 3
ElseIf Reach >= 10000 Then
    Result = 2
Else
    Result = 1
End If

这些 If/ElseIf/Else/End If 条件按顺序解决。由于除非 Reach 小于 100000,否则您不会进入第二个标准,因此无需将该规范放入第二个标准中。其余条件也可以应用相同的逻辑。

您的第二个 If/ElseIf/End If 语法错误。

ElseIf Headline = "No" And Exclusive = Yes Then

这里的Yes应该被引用,否则条件将寻找一个名为Yes的变量。将 Option Explicit 放在声明区域中模块代码表的顶部将快速捕获这些错误。您还可以访问 VBE 的工具、选项命令并在 Require Variable Declaration 旁边打勾,Option Explicit 将自动放入您创建的每个新代码表的声明区域.

【讨论】:

    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2014-04-04
    • 2017-06-19
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多