【问题标题】:VBA: action based on multiple rangesVBA:基于多个范围的操作
【发布时间】:2015-11-29 10:16:58
【问题描述】:

我对 VBA 非常陌生,在此处发布之前我尝试了几次谷歌搜索。如果这样的问题已经被询问和回答,我深表歉意。

我在表 1 的 A 列中有 A3:A22 中的数字列表,我正在尝试根据表 2 的 A7:A26 中的 A7:A26 列 A 表 1 中的每个数字的值来分配等级。

我尝试使用的示例逻辑是

If value < 10 Then Grade = 'A'
Else If 10 <= value < 20 then Grade = 'B'
Else If 20 <= value < 50 then Grade = 'C'
Else If 50 <= value < 70 then Grade = 'D'
Else Grade = 'E'

我怎样才能做到这一点?我不想使用 excel 公式,因为我有几个这样的逻辑和 excel 嵌套 if 函数会变得很麻烦。

感谢您的帮助。

【问题讨论】:

  • 这个问题有点像“如何在 VBA 中编写这个 VBA 代码?” :]

标签: excel if-statement range vba


【解决方案1】:

我不会使用 VBA,而是在单元格中使用一个公式。单元格 A7 中的类似内容(要复制下来):

=if(Sheet1!A3>70,"E",if(Sheet1!A3>50,"D",if(Sheet1!A3>20,"C",if(Sheet1!A3>10,"B","A"))))

如果您必须在 VBA 中制作,这应该可以:

Dim SourceStart As Long, DestinationStart As Long, SourceEnd As Long
Dim Grade As String, CurrentRow As Long
Dim SourceSheet As Worksheet, DestinationSheet As Worksheet

SourceStart = 3
SourceEnd = 22
DestinationStart = 7
Set SourceSheet = ActiveWorkbook.Worksheets(1)
Set DestinationSheet = ActiveWorkbook.Worksheets(2)

For CurrentRow = SourceStart To SourceEnd
    Select Case SourceSheet.Cells(CurrentRow, 1).Value
        Case Is > 70
            Grade = "E"
        Case Is > 50
            Grade = "D"
        Case Is > 20
            Grade = "C"
        Case Is > 10
            Grade = "B"
        Case Else
            Grade = "A"
    End Select
    DestinationSheet.Cells(CurrentRow + DestinationStart - SourceStart, 1).Value = Grade
Next

这不是如何编写可重用性的好例子。例如,成绩应该做成某种数据格式,这样就可以在不同的地方使用不同的评分尺度。源和目的地不应该是硬编码的。工作表不应该是硬编码的。但如果不了解用例,就无法正确编码以考虑这些变量。

【讨论】:

  • 谢谢迈克尔。抱歉,我忘了在我的 cmets 中提到我在样本中发布的内容。我有几个这样的条件会使使用 excel 公式不可行。
  • 如果它变得笨重,它必须是一个相当大的工作表。数字会根据其他数据而变化吗?这也都可以合并到一个公式中。使用 VBA 意味着(通常)用户必须启动一些操作才能进行计算,因此公式更好。
  • 是的,我发布的只是一个开始。但在此基础上还会有更多内容。用户必须单击一个按钮来启动逻辑的运行。
  • 然后似乎缺少一些信息。看起来你只有一个范围,A7:A26,应该保存成绩,A3:A22 保存源数据。您可以编写 VBA 来遍历这些范围,但我还不明白为什么它应该是 VBA 而不是公式。您能否提供任何其他变量,例如需要计算的其他范围?
【解决方案2】:

如果嵌套 IF 使公式变得相当复杂,并且体积/频率不需要 VBA 之类的东西,标准解决方案是应用查找表。说下面是一个命名范围cTable

0   A
10  B
20  C
50  D
69  E  

那么对于 A7 中的查找值,可以使用以下公式:

=VLOOKUP(A7,gTable,2)  

并且可以复制到合适的位置(即在本例中为A26)。

通过排除第四个(可选)参数并对gTable 升序排序,VLOOKUP 将搜索下一个未找到完全匹配的较低值。例如,如果查找9 的成绩,而不是因为9 不在gTable 中而“放弃”,它将下降到下一个级别(0)并返回匹配项(@987654331 @) 为了那个原因。

由于表格是一个命名范围,它不需要在同一张纸上(例如可能会被隐藏)。

VLOOKUP 公式是@Michael Foster 的答案中提供的公式长度的四分之一,如果需要,gTable 可能比嵌套 IF 公式或 VBA 更容易更新。

【讨论】:

    【解决方案3】:

    Excel 公式为:

    =Lookup(A3,{0,10,20,50,70;"A","B","C","D","E"})
    

    =MID("ABCCCDDEEEE",A3/10+1,1)
    

    在 VBA 中将是

    ['Sheet 2'!A7:A26] = [MID("ABCCCDDEEEE",'Sheet 1'!A3:A22/10+1,1)] 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多