理想的解决方案是在VBA而不是公式,因为我需要每次重置自己的第一张纸,因此公式会被覆盖。
我有两张纸:
Sheet1 (Subtract Inventory)
Item# Sold
1022 23
1024 56
1025 52
Sheet2 (Count)
Item# Count
1020 1027
1021 99
1022 76
1023 128
1024 57
1025 1023
1026 987
我想要做的是让VBA代码通过从Sheet2
上的“计数”中减去Sheet1
上的“已售出”来更新Sheet2
。结果看起来像这样:
Sheet2 (Count)
Item# Count
1020 1027
1021 99
1022 53
1023 128
1024 1
1025 971
1026 987
我已经能够找出几个代码,但我永远无法让它们适合。 Sheet1
将允许用户从网站粘贴信息,因此必须将搜索基于项目编号,而不是A列。
我认为最好的办法是重新开始,以确保我不会因错误的方向开始而搞砸。有谁知道从哪里开始?
答案 0 :(得分:1)
使用 Vlookup
的另一种方法希望这是你在尝试的?
已经过测试
Option Explicit
Sub Sample()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim ws1LastRow As Long, ws2LastRow As Long, i As Long
Dim SearchRange As Range
Set ws1 = Sheets("Sheet1")
ws1LastRow = ws1.Range("A" & ws1.Rows.Count).End(xlUp).Row
Set SearchRange = ws1.Range("A1:B" & ws1LastRow)
Set ws2 = Sheets("Sheet2")
With ws2
ws2LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
For i = 2 To ws2LastRow
On Error Resume Next
If Not IsError(Application.WorksheetFunction.VLookup(.Range("A" & i).Value, SearchRange, 2, False)) Then
.Range("B" & i).Value = .Range("B" & i).Value - _
Application.WorksheetFunction.VLookup(.Range("A" & i).Value, SearchRange, 2, False)
End If
On Error GoTo 0
Next i
End With
'~~> Clear Sheet1 for next input
ws1.Cells.ClearContents
'~~> Clean Up
Set SearchRange = Nothing
Set ws1 = Nothing
Set ws2 = Nothing
End Sub
<强>快照强>
<强>后续强>
您目前正在进行的清洁操作不正确。如果我手动进行清洁,表格应如下所示?
此外,如果您注意到数字存储为文本或具有空格。在这些情况下,Vlookup将失败。
在这种情况下,我建议以下
1)您需要在可以更有效地清理数据的地方放置一个宏
2)您可以在“QTY”之前移动“SKU”,然后使用Vlookup OR 使用替代方法。
3)如果您对其他方法感兴趣,请参阅此链接中的第4节
http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/
答案 1 :(得分:0)
公式方法:
在C2中的sheet2上放了这个公式
= IF(ISNUMBER(匹配(A2,Sheet1!A:A,0)),B2 - VLOOKUP(A2,Sheet1!A:B,2,0),B2)
宏观方法(相同方法)
Sub UpdateSheet2()
Dim LR As Long
With Sheets("Sheet2")
LR = .Range("A" & .Rows.Count).End(xlUp).Row
With .Range("C2:C" & LR)
.Formula = "=IF(ISNUMBER(MATCH(A2, Sheet1!A:A, 0)), B2 - VLOOKUP(A2, Sheet1!A:B, 2, 0), B2)"
.Offset(, -1).Value = .Value
.Value = ""
End With
End With
End Sub
答案 2 :(得分:0)
问题可以通过简单的代码解决,如下所示:
For sht2 = 2 To 8 ' Sheet2 rows
For sht1 = 2 To 4 ' Sheet1 rows
If Cells(sht2, 1).Value = Sheet1.Cells(sht1, 1).Value Then
Cells(sht2, 2).Value = Cells(sht2, 2).Value - Sheet1.Cells(sht1, 2).Value
End If
Next
Next
Sheet2中的2到8行和Sheet1中的2到4行基于引用的示例。但是,可以使用Cells.End方法捕获每个工作表中的行数,即销售数据表和库存数据表,如下所示:
For sht2 = 2 to sheet2.Cells(2,2).End(XlDown).Row +1 ' for Sheet2 rows
For sht1 = 2 to Sheet1.Cells(2,2).End(XlDown).Row +1 ' for Sheet1 rows
上面的循环遍历所有具有数据的单元格,并通过If语句
扣除库存