比较Excel VBA中的值

时间:2011-10-26 05:36:04

标签: excel excel-vba comparison vba

我正在尝试将单元格A1与B1进行比较,如果为真,则使用A1值填充单元格F1。但无论我的输入值如何,if条件都成立。

Sub Macro3()
    Dim i As Integer
    i = 1
    For i = 1 To 10
        If (Range("A" & i).Select = Range("B" & i).Select) Then
            Range("A" & i).Select
            Selection.Copy
            Range("F" & i).Select
            ActiveSheet.Paste
        End If
    Next i      
End Sub

3 个答案:

答案 0 :(得分:3)

您可以比较单元格的Value属性,然后相应地设置F列值,而不是选择,复制和粘贴:

Dim i As Integer
For i = 1 To 10
    If Range("A" & i).Value = Range("B" & i).Value Then
        Range("F" & i).Value = Range("A" & i).Value
    End If
Next

答案 1 :(得分:0)

认为这是对尼克答案的赞美(接受他,如果你发现它可以工作,你应该这样做)。我想帮助解释代码中的一些错误。

在FIX之前:

Sub Macro3()
    Dim i As Integer
    i = 1
    For i = 1 To 10
        If (Range("A" & i).Select = Range("B" & i).Select) Then
            Range("A" & i).Select
            Selection.Copy
            Range("F" & i).Select
            ActiveSheet.Paste
        End If
    Next i
End Sub

AFIX FIX

Sub Macro4()
    Dim i As Long
    For i = 1 To 10
        If Range("A" & i).Value = Range("B" & i).Value Then
            Range("F" & i).Value = Range("A" & i).Value
        End If
    Next
End Sub

点数:

  1. 使用Long而不是Integer(小优化,因为VBA会将int转换为long)
  2. 无需连续两次声明i = 1
  3. 您应该比较值,而不是简单地选择单元格。很少(如果有的话)需要使用.Select关键字。您可以直接访问所有对象的属性。
  4. 复制和粘贴是一项繁重的操作。既然您在VBA中,也可以将A中的值分配给B列中的单元格。它更快,更有效。
  5. 我希望这会有所帮助。顺便说一下,你可以简单输入:

    =IF(A1=B1,A1,"")
    
    在F1中

    并向下拖动公式以获得类似的结果。

答案 2 :(得分:0)

您可以使用变体数组来解决上面提到的性能问题。此代码将与Nicks运行相同,但它将跳过空白单元格,即它将

  1. 如果A和B相同,则更新F值
  2. 如果A单元格为空白则跳过更新
  3. 如果A<> B
  4. ,则保留现有的F值

    我不清楚你如何比较两张纸上的行,你可以对此进行扩展吗?

        Sub MyArray()
        Dim X As Variant
        Dim Y As Variant
        Dim lngrow As Long
        X = Range([a1], Cells(Rows.Count, "B").End(xlUp))
        Y = Range([f1], [f1].Offset(UBound(X, 1) - 1, 0))
        For lngrow = 1 To UBound(X, 1)
           If Len(X(lngrow, 1)) > 0 Then
           If X(lngrow, 1) = X(lngrow, 2) Then Y(lngrow, 1) = X(lngrow, 1)
           End If
        Next
        Range([f1], [f1].Offset(UBound(X, 1) - 1, 0)) = Y
        End Sub