Excel VBA代码,用于从另一张图纸中减去数量

Excel VBA代码,用于从另一张图纸中减去数量,excel,vba,Excel,Vba,我有三张纸,分别是Sheet1、Sheet2和Sheet3。所有图纸都有相同的列。我一直在Sheet2.Range(“C2”)中使用SUMIFS公式: 我准备了以下代码,通过将列A、B和D与表2匹配,获取表1列C的值,并将结果粘贴到表2列C 我一直在寻找一种方法,通过匹配列a、B和D从表1列C中减去表3列C的数量,然后将其结果粘贴到表2列C 文件和数据附于此处: Dim dict As Object Dim searchrange As Range With Sh

我有三张纸,分别是
Sheet1
Sheet2
Sheet3
。所有图纸都有相同的列。我一直在
Sheet2.Range(“C2”)
中使用
SUMIFS
公式:

我准备了以下代码,通过将
列A
B
D
表2
匹配,获取
表1
列C
的值,并将结果粘贴到
表2
列C

我一直在寻找一种方法,通过匹配
列a、
B和
D
从表1
列C
中减去
表3
列C
的数量,然后将其结果粘贴到
表2
列C

文件和数据附于此处:

Dim dict As Object
    Dim searchrange As Range        
    With Sheet1
        Dim last_y As Long
        Dim i As Long
        Set dict = CreateObject("Scripting.Dictionary")
        last_y = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To last_y    
        dict(.Cells(i, 1).Value & .Cells(i, 2).Value & .Cells(i, 4).Value) = _
            dict(.Cells(i, 1).Value & .Cells(i, 2).Value & .Cells(i, 4).Value) + _
           .Cells(i, 3).Value                    
        Next i
    End With
    
    With Sheet3
        last_y = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To last_y
        .Cells(i, 3).Value = dict(.Cells(i, 1).Value & .Cells(i, 2).Value & _
            .Cells(i, 4).Value)
        Next i
    End With

如果你只需要直接比较,那么使用字典可能不是最好的方法。我只需遍历所有3张图纸,只要它的行数在100k以下。您可能会喜欢.Find和.FindNext,但最简单的就是一个很好的旧For循环

如果我理解您的请求,您需要将表1中的所有值减去表3中的相应值(如果存在),然后输出到表2的匹配行(如果存在)。我会这样做:

Sub rowMatch()
    Dim a As String, b As String, c As Double, d As String
    For i = 2 To Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row
        'Grab the Sheet1 values
        a = Sheet1.Cells(i, 1).Text
        b = Sheet1.Cells(i, 2).Text
        c = Sheet1.Cells(i, 3).Value
        d = Sheet1.Cells(i, 4).Text
        
        'Check Sheet3
        For j = 2 To Sheet3.Cells(Sheet3.Rows.Count, 1).End(xlUp).Row
            If Sheet3.Cells(j, 1).Text = a _
               And Sheet3.Cells(j, 2).Text = b _
               And Sheet3.Cells(j, 4).Text = d _
               Then
               c = c - Sheet3.Cells(j, 3).Value
            End If
        Next j
        
        'Put into Sheet2
        For k = 2 To Sheet2.Cells(Sheet2.Rows.Count, 1).End(xlUp).Row
            If Sheet2.Cells(k, 1).Text = a _
               And Sheet2.Cells(k, 2).Text = b _
               And Sheet2.Cells(k, 4).Text = d _
               Then
               Sheet2.Cells(k, 3) = c
            End If
        Next k
    Next i
End Sub

编辑:为了进一步改进这一点,您可能希望在执行UCASE()和TRIM()之类的操作后,只比较字符串,从而使代码更加灵活。如果a、b或d为空,您可能需要添加例外。在这些情况下,您可能希望允许部分匹配。我的例子只是基本的想法。

第二张表应该写些什么?当表1 ABD不在表3中时?当sheet3 ABD不在sheet1中时?感谢您在donPablo处抽出时间,Sheet2中应该包含什么?然后退出Sub什么都不应该发生Hi,非常感谢您的解释,并建议了其他解决方案。但是当我运行代码时,什么都没有发生。我一直在想问题出在哪里,但是没有发现任何东西可以纠正专栏。谢谢。哦,哎哟,我不小心把第三栏和第二栏进行了比较。我会修改一下。好的,谢谢你的帮助。
Sub rowMatch()
    Dim a As String, b As String, c As Double, d As String
    For i = 2 To Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row
        'Grab the Sheet1 values
        a = Sheet1.Cells(i, 1).Text
        b = Sheet1.Cells(i, 2).Text
        c = Sheet1.Cells(i, 3).Value
        d = Sheet1.Cells(i, 4).Text
        
        'Check Sheet3
        For j = 2 To Sheet3.Cells(Sheet3.Rows.Count, 1).End(xlUp).Row
            If Sheet3.Cells(j, 1).Text = a _
               And Sheet3.Cells(j, 2).Text = b _
               And Sheet3.Cells(j, 4).Text = d _
               Then
               c = c - Sheet3.Cells(j, 3).Value
            End If
        Next j
        
        'Put into Sheet2
        For k = 2 To Sheet2.Cells(Sheet2.Rows.Count, 1).End(xlUp).Row
            If Sheet2.Cells(k, 1).Text = a _
               And Sheet2.Cells(k, 2).Text = b _
               And Sheet2.Cells(k, 4).Text = d _
               Then
               Sheet2.Cells(k, 3) = c
            End If
        Next k
    Next i
End Sub