从两张纸上减去不同位置的值

时间:2012-03-08 20:56:24

标签: vba excel-vba excel-2003 excel

理想的解决方案是在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列。

我认为最好的办法是重新开始,以确保我不会因错误的方向开始而搞砸。有谁知道从哪里开始?

3 个答案:

答案 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

<强>快照

enter image description here

<强>后续

您目前正在进行的清洁操作不正确。如果我手动进行清洁,表格应如下所示?

enter image description here

此外,如果您注意到数字存储为文本或具有空格。在这些情况下,Vlookup将失败。

enter image description here

在这种情况下,我建议以下

1)您需要在可以更有效地清理数据的地方放置一个宏

2)您可以在“QTY”之前移动“SKU”,然后使用Vlookup OR 使用替代方法。

3)如果您对其他方法感兴趣,请参阅此链接中的第4节

http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/

答案 1 :(得分:0)

公式方法:

  1. 在C2中的sheet2上放了这个公式

    = IF(ISNUMBER(匹配(A2,Sheet1!A:A,0)),B2 - VLOOKUP(A2,Sheet1!A:B,2,0),B2)

  2. 将该公式复制到数据集
  3. 复制C2中的新数据集:C ???
  4. 点击B2并选择修改&gt;选择性粘贴&gt;值
  5. 清除C栏......您已完成
  6. 宏观方法(相同方法)

    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语句

扣除库存