首页 > 解决方案 > Excel VBA 逻辑不起作用

问题描述

第一列有两张公司名称,第一行是商品价格。现在我需要公司名称是否匹配,而不是检查行并更新值

Sub addition()
    Dim j As Integer
    Dim i As Integer
    Dim a As Integer
    Dim b As Integer

    For i = 2 To 15
        For j = 2 To 15
            If Sheet1.Cells(i, 1) = Sheet1.Cells(j, 1) Then
                For a = 2 To 5
                    For b = 2 To 5
                        If Sheet1.Cells(1, a) = Sheet2.Cells(1, b) Then
                                Sheet1.Cells(i, a) = Sheet2.Cells(j, b) + Sheet1.Cells(i, a)

                        End If
                     Next b
                Next a

            End If
        Next j
    Next i

End Sub

但在某些行逻辑中,其他行逻辑不起作用。

标签: vbaexcelms-office

解决方案


For i = 2 To 15
    For j = 2 To 15
        If Sheet1.Cells(i, 1) = Sheet1.Cells(j, 1) Then
            ...

上面的代码将找到 14 个匹配项,因为 i 和 j 有 14 次相同的值,并且它们都引用同一个工作表,同一列。

由于您稍后在代码中使用 j 来引用 Sheet2 上的一行,因此上面的内容很可能更接近于此。

For i = 2 To 15
    For j = 2 To 15
        If Sheet1.Cells(i, 1) = Sheet2.Cells(j, 1) Then
            ...

但是,即使切换到 Sheet2.Cells(j, 1) 修复了逻辑,为其他所有事情做所有事情都是非常低效的。您可以使用 Exit For 语句减少循环,这些语句在找到匹配项后不会继续寻找匹配项。除了一次匹配并完成之外,还有对列值的匹配,它完全否定了内部循环。

Sub addition()
    Dim i As long, a As long
    Dim j As variant, b as variant

    For i = 2 To 15
        i = application.match(Sheet1.Cells(i, 1), Sheet2.Cells(2, 1).resize(14, 1), 0)
        if not iserror(i) then
            For a = 2 To 5
                b = application.match(Sheet1.Cells(1, a), Sheet2.Cells(1, 2).resize(1, 4), 0)
                if not iserror(b) then
                    Sheet1.Cells(i, a) = Sheet2.Cells(j, b) + Sheet1.Cells(i, a)
                End If
            Next a
        End If
    Next i

End Sub

推荐阅读