我是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嵌套,如果函数可以变得麻烦。
感谢您的帮助。
答案 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)]