首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VBA:基于多个范围的操作

VBA:基于多个范围的操作
EN

Stack Overflow用户
提问于 2015-09-03 22:10:10
回答 3查看 184关注 0票数 0

我对VBA非常陌生,在这里发帖之前,我尝试了几次谷歌搜索。如果已经有人问过和回答过这样的问题,我向您道歉。

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

我尝试使用的示例逻辑是

代码语言:javascript
运行
复制
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嵌套如果函数可以变得繁琐。

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2015-09-03 22:32:36

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

代码语言:javascript
运行
复制
=if(Sheet1!A3>70,"E",if(Sheet1!A3>50,"D",if(Sheet1!A3>20,"C",if(Sheet1!A3>10,"B","A"))))

如果您必须在VBA中使用它,则应该可以:

代码语言:javascript
运行
复制
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

对于如何编写代码以实现可重用性,这不是一个很好的例子。例如,评分应该转换为某种数据格式,这样您就可以在不同的地方使用不同的评分标准。源和目标不应该是硬编码的。工作表不应该是硬编码的。但是如果不知道用例,就不能正确地编码来考虑这些变量。

票数 0
EN

Stack Overflow用户

发布于 2016-08-31 08:51:51

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

代码语言:javascript
运行
复制
0   A
10  B
20  C
50  D
69  E  

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

代码语言:javascript
运行
复制
=VLOOKUP(A7,gTable,2)  

并且可以复制下来以适合(即在这种情况下复制到A26)。

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

因为表是一个命名范围,所以它不需要在同一张表上(例如,可能是隐藏的)。

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

票数 0
EN

Stack Overflow用户

发布于 2016-08-31 09:21:28

Excel公式为:

代码语言:javascript
运行
复制
=Lookup(A3,{0,10,20,50,70;"A","B","C","D","E"})

代码语言:javascript
运行
复制
=MID("ABCCCDDEEEE",A3/10+1,1)

它在VBA中将是

代码语言:javascript
运行
复制
['Sheet 2'!A7:A26] = [MID("ABCCCDDEEEE",'Sheet 1'!A3:A22/10+1,1)] 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32378002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档