【问题标题】:How to carry out IF for list of values without using .activecell and .select如何在不使用 .activecell 和 .select 的情况下对值列表执行 IF
【发布时间】:2014-08-28 05:52:48
【问题描述】:

我是 VBA 的初学者,刚开始尝试编写一个宏来自动化 Excel 中的以下过程。

我有 2 个汇率,一个是 BUY RATE(R 栏),一个是 SELL RATE(S 栏)。我要做的是比较 2 个评级并选择更高的评级,除非买入货币(E 列)是美元。 然后我想将所选的相关评级输入到 T 列中。

但是,我尝试在不使用“.Activecell”和“.Select”的情况下为后续行执行此操作。但我不太确定该怎么做。

实际上,我想要完成的还有第二部分。因为我正在尝试一步一步地学习和弄清楚。

无论如何,我有 2 个工作表,在工作表 1 中,我有一个索引号列表(A 列)以及上面 T 列中要计算的评级。

在工作表 2 中,我有另一个索引号列表(但后面有额外的“00”)(A 列)。然后,每个索引号在一个单元格(M 列)中有一个对应的字母,在另一个单元格(I 列)有一个数字。

我需要做的是从工作表 2 中检索匹配的字母和数字,将它们放在一起,然后与工作表 1 中的评分进行比较,看看它们是否匹配。 我已经列出了完成这项任务所要采取的步骤,但我似乎还不知道该怎么做

1)从工作表 1 中检索索引号并与“00”连接

2)使用上面的值做一个查找函数,以检索相应的索引号和字母。

3) 将上述“字母”和“数字”连接在一起(在工作表 1 中输入新单元格(C 列)

4) 将风险等级与从步骤 3 中获得的值进行比较

5)如果 Risk Rating

6) 对工作表 1 中的每个索引号重复。(工作表 1 中的索引号数量每周变化)

按照提供的链接,我想出了以下语法。

子比较() 将 sht2 调暗为工作表 将 last_row 调暗为整数 将 row_no 暗淡为整数 Dim buyccy As String 将 selccy 调暗为字符串 将buyrate作为字符串 将 selrate 变暗为字符串 Dim y As String

Set sht2 = Sheets("sheet2")
    last_row = sht2.Cells.Find(What:="*", After:=[A1], LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    For row_no = 2 To last_row
 If IsError(sht2.Range("R" & row_no)) Or IsError(sht2.Range("S" & row_no)) Then
    y = "#N/A"
   Else
   buyrate = sht2.Range("R" & row_no)
   selrate = sht2.Range("S" & row_no)
   buyccy = sht2.Range("E" & row_no)
   selccy = sht2.Range("G" & row_no)

    If buyrate >= selrate And buyccy = "USD" Then
            y = selrate
        ElseIf buyrate >= selrate And buyccy <> "USD" Then y = buyrate
        ElseIf buyrate < selrate And selccy = "USD" Then y = buyrate
        Else: y = selrate
    End If

sht2.Range("T" & row_no).Value = y
Next

Set sht2 = Nothing

End Sub

虽然我不太确定我哪里出错了。抱歉,但我对 VBA 真的非常陌生。真诚地感谢您对此提供的任何见解。

【问题讨论】:

  • 我们将避免识别Selectthis link 可能会让你开始
  • 你为什么要通过 VBA 来做这个?你能不能只在 T2 中放一个工作表公式并将其复制到你的范围内? (=IF(R2=S2,R2,IF(AND(R2&gt;S2,E2="USD"),R2,S2)))
  • @Captain 实际上我想要完成任务的第二部分。仍然是新事物,因此试图弄清楚并一次学习一步。我实际上已经用整个工作过程编辑了上面的问题。如果你能提供一些关于我如何去做的见解,我将不胜感激。谢谢

标签: excel vba


【解决方案1】:

我对您的代码做了一些小调整,看起来还不错...

  1. Set sht2=Application.ActiveWorkbook.Sheets("Sheet1") 最后Set sht2 = Nothing
  2. 取出ReDim array_b(row_no - 1, 3) 没有被使用并且正在使用一个你没有设置的变量
  3. 更改了查找last_row的机制...各种奇怪的行为都有不同的方法发生,但我一直使用的是last_row = sht2.Cells.Find(What:="*", After:=[A1], LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

也可以使用sht2.Cells(rownum,colnum) 替代寻址,而不是制作单元地址的字符串...

最后 - 我认为你上面提到的所有内容都可以通过工作表函数轻松实现 - 但可能不那么有趣;-)

完整代码:

Sub Comparison()

 Dim sht2 As Worksheet
 Dim array_b()
 Dim last_row As Integer
 Dim row_no As Integer
 Dim buyccy As String
 Dim buyrate As String
 Dim selrate As String
 Dim y As String

 Set sht2 = Application.ActiveWorkbook.Sheets("Sheet1")

 'last_row = sht2.Range("A1").End(xlDown).Row
 last_row = sht2.Cells.Find(What:="*", After:=[A1], LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

 'ReDim array_b(row_no - 1, 3)

 For row_no = 2 To last_row
   If IsError(sht2.Range("R" & row_no)) Or IsError(sht2.Range("S" & row_no)) Then
     y = "#N/A"
   Else
     buyrate = sht2.Range("R" & row_no)
     selrate = sht2.Range("S" & row_no)
     buyccy = sht2.Range("E" & row_no)

     If buyrate >= selrate And buyccy <> "USD" Then y = buyrate Else y = selrate
   End If
   sht2.Range("T" & row_no).Value = y
 Next

 Set sht2 = Nothing

End Sub

【讨论】:

  • 感谢您的帮助。我实际上只是在尝试同时学习 VB。无论如何,buyrate 和 selrate 是从公式中得出的,因此可能是错误值。如果它是一个错误值,我如何将“#N/A”设置为变量 y?我尝试使用IF iserror(),但似乎无法解决。
  • 如果一个/两个速率都出错,你希望它做什么?
  • 如果其中一个是错误,我希望 T 列中的相应单元格(同一行)也显示错误。我按照IF iserror(buyrate) Or iserror(selrate) then &lt;y="#N/A"&gt; else 的思路思考并继续上面的公式。
  • 沿着正确的路线 - 不幸的是,带有错误的buyrate设置破坏了它 - 所以我们在设置值之前进行测试(直接引用范围)......我已经更新了代码.. .
  • 感谢您迄今为止的帮助。实际上,我已经更改了原来的 If 标准,并且它以前有效。但是,当我包含您包含的新测试时,我收到一个错误“NEXT WITHOUT FOR”。我已经更新了原始帖子中的代码。非常感谢您的帮助
猜你喜欢
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2014-05-01
  • 2016-05-27
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多