我对VBA非常陌生,在这里发帖之前,我尝试了几次谷歌搜索。如果已经有人问过和回答过这样的问题,我向您道歉。
我在表1的A栏中有一个A3:A22的数字列表,我正在尝试根据表1的A7:A26中A列的每个数字的值来分配分数。
我尝试使用的示例逻辑是
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嵌套如果函数可以变得繁琐。
谢谢你的帮助。
发布于 2015-09-03 22:32:36
我会在单元格中使用公式,而不是使用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对于如何编写代码以实现可重用性,这不是一个很好的例子。例如,评分应该转换为某种数据格式,这样您就可以在不同的地方使用不同的评分标准。源和目标不应该是硬编码的。工作表不应该是硬编码的。但是如果不知道用例,就不能正确地编码来考虑这些变量。
发布于 2016-08-31 08:51:51
如果嵌套的IFs使公式变得相当复杂,并且卷/频率不需要VBA之类的东西,则标准的解决方案是应用查找表。假设下面是一个命名范围cTable:
0 A
10 B
20 C
50 D
69 E 然后,对于A7中的查找值,可以使用以下公式:
=VLOOKUP(A7,gTable,2) 并且可以复制下来以适合(即在这种情况下复制到A26)。
通过排除第四个(可选)参数并按升序对gTable进行排序,VLOOKUP将在未找到完全匹配的情况下搜索下一个较低的值。例如,如果查找9的成绩,而不是因为9不在gTable中而“放弃”,它将下降到下一级别(0)并返回该级别的匹配(A)。
因为表是一个命名范围,所以它不需要在同一张表上(例如,可能是隐藏的)。
VLOOKUP公式是@Michael Foster的答案中提供的公式长度的四分之一,如果需要,gTable可能比嵌套if公式或VBA更容易更新。
发布于 2016-08-31 09:21:28
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)] https://stackoverflow.com/questions/32378002
复制相似问题