Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Excel VBA中的值_Excel_Comparison_Vba - Fatal编程技术网

比较Excel VBA中的值

比较Excel VBA中的值,excel,comparison,vba,Excel,Comparison,Vba,我试图比较单元格A1和B1,如果是真的,则用A1值填充单元格F1。但不管我的输入值是多少,如果条件变为真 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.C

我试图比较单元格A1和B1,如果是真的,则用A1值填充单元格F1。但不管我的输入值是多少,如果条件变为真

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

您可以比较单元格的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

把这看作是对尼克回答的一种恭维(如果你觉得他的回答有效,就接受他,这是你应该接受的)。我想帮助您解释代码中的一些错误

修复前:

修复后

要点:

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

    =IF(A1=B1,A1,"")
    

    在F1中,将公式向下拖动以获得类似的结果。

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

  • 如果A和B相同,则更新F值
  • 如果A单元格为空,则跳过更新
  • 如果为AB,则保留现有的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
    

    谢谢你的建议。。我遇到的主要问题是“如果范围(“A”和“i”)。值=范围(“B”和“i”)。值“无论A和B中的值如何,此条件都会失败column@Venkat-你是说即使值相同,也没有匹配?有些事情不是你想象的那样…@tim williams:-是的,以前是这样的……但现在效果很好……问题解决了……我已经完成了代码……现在问题在于性能,我使用两张纸来执行任务。这里,我将excel 1的每一行与excel 2的所有活动行进行比较。因此,我陷入了for循环中……由于行数很高,excel崩溃。我是否可以得到任何改进性能的建议使用要调整为活动工作表的工作表运行代码?A1和B1中哪些值不相同,但会触发真实情况?为什么不做一个简单的IF测试呢?:)
    =IF(A1=B1,A1,"")
    
        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