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