VBA:基于多个范围的操作

时间:2015-09-03 14:10:10

标签: excel-vba if-statement range vba excel

我是VBA的新手,在发布此处之前我曾尝试使用Google搜索几次。如果已经有人问过并回答了这样的话,我很抱歉。

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

我尝试使用的示例逻辑是

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嵌套,如果函数可以变得麻烦。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

我会,而不是使用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

这不是如何编写可重用性代码的好例子。例如,成绩应该是某种数据格式,因此您可以在不同的地方使用不同的评分等级。源和目的地不应该是硬编码的。工作表不应该是硬编码的。但是在不知道用例的情况下,它无法正确编码以考虑这些变量。

答案 1 :(得分:0)

如果嵌套的IF使公式变得相当复杂,并且VBA不像卷或频率那样需要标准解决方案就是应用查找表。假设以下是命名范围cTable

0   A
10  B
20  C
50  D
69  E  

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

=VLOOKUP(A7,gTable,2)  

并且可能会被复制以适应(即在这种情况下为A26)。

通过排除第四个(可选)参数并对gTable升序进行排序,VLOOKUP将搜索未找到完全匹配的下一个较低值。例如,如果查找9的成绩,而不是放弃&#39;因为9不在gTable中,它会下拉到下一个级别(0)并返回匹配(A)。

由于表格是命名范围,因此它不必位于同一张纸上(例如可能隐藏)。

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

答案 2 :(得分:0)

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)]