如何在不使用.activecell和.select的情况下为值列表执行IF

时间:2014-08-28 05:52:48

标签: excel excel-vba vba

我是VBA的初学者,刚刚开始尝试使用宏来自动执行excel中的以下过程。

我有2个差价,一个买入率(R列)和一个卖出率(S列)。我要做的是比较2个评级并选择更高的评级,除非买入货币(E栏)是美元。 然后我想输入选择到T列的相关评级。

但是,我正在尝试为后续行而不使用' .Activecell'和'。选择'。但我不太确定如何解决这个问题。

实际上,我想要实现的目标还有第二部分。因为我正在努力学习并一步一步地弄明白。

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

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

我需要做的是从工作表2中检索匹配的字母和数字,将它们放在一起,然后与工作表1中的评级进行比较,看它们是否匹配。 我列出了完成此任务所需采取的步骤,但我似乎无法弄清楚如何做到这一点

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

2)使用上面的值执行查找功能,以检索相应的索引号和字母。

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

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

5)如果风险等级<步骤3中的值,在新单元格中输入不匹配,工作表1,列D

6)对工作表1中的每个索引号重复一次。(工作表中索引号的数量每周不同)

根据提供的链接,我想出了以下语法。

子比较()   Dim sht2 As Worksheet     Dim last_row As Integer     Dim row_no As Integer     Dim buyccy As String     Dim selccy As String     Dim buyrate As String     Dim selrate As String     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来说真的很新。真诚地感谢能够提供的任何见解。

1 个答案:

答案 0 :(得分:0)

我对你的代码做了一些小调整,看起来很好......

  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
  4. 使用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