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

Vba 从两张图纸上的不同位置减去值,vba,excel,excel-2003,Vba,Excel,Excel 2003,理想的解决方案是在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中,而不是在公式中,因为我每次都需要第一张图纸重置自己,因此公式将被覆盖

我有两张纸:

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
,方法是从
Sheet2
上的“计数”中减去
Sheet1
上的“售出”。结果如下所示:

Sheet2 (Count)

Item#   Count
1020    1027
1021    99
1022    53
1023    128
1024    1
1025    971
1026    987
我已经能够找出几个代码,但我永远无法使它们适合。而
Sheet1
将让用户从网站粘贴信息,因此它必须根据项目编号而不是列a进行搜索

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

公式法:

  • 在C2中的表2上,输入以下公式

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

  • 将该公式复制到数据集中
  • 复制C2:C中的新数据集
  • 单击B2并选择编辑>粘贴特殊>值
  • 清除C列…完成了
  • 宏方法(相同方法)


    使用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)要么将“SKU”移到“数量”之前,然后使用Vlookup或者使用另一种方法

    3)如果您对另一种方法感兴趣,请参阅此链接中的(第4节)


    该问题可通过以下简单代码解决:

    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
    
    表2中的2至8行和表1中的2至4行基于引用的示例。但是,可以使用单元格捕获每张表(即销售数据表和库存数据表)中的行数。结束方法如所示:

    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语句扣除库存

    感谢您的帮助,但它对我不起作用。。。我做了一次编辑,并将名称更改为程序中的名称。我现在有一个问题,一个盒子在最后弹出。我认为它正在试图保存我的文件,但它没有改变我第二张工作表“计数”上的计数。有什么办法吗?什么盒子?你改变了什么?我看不见的东西我帮不了你。你应该先用公式版。手动输入并编辑,直到显示第一个值。然后发布公式,我可以帮助调整上面的宏版本以使用正确的公式。对不起,Jerry,我更改了工作表的名称,因为我对措辞感到困惑。请容忍我,我是新手。杰瑞,我试着用你建议的公式,它说它不允许“循环引用”。请告知。我有Excel 2003。它可以满足我的所有需求,但由于某些原因,它无法与第二张工作表交互。你的excel是哪一年?我的是2003年。。。你认为这会把事情搞砸吗?我从2003年开始就有所有版本的Excel。问题不在于版本。当你说“它不与第二张纸互动”时,你是什么意思?首先我想说,我打字的时候太不得体了。我向你保证,我非常感谢你的帮助。第二我在你输入代码时输入了代码,它完成了所有需要的操作,只是没有为我更新第二页的单元格。不管我试了多少次,它们都是一样的。请告知。我已经有一段时间没有上VBA课程了,我可能已经忘记了一些基础知识。你会要求我提供什么信息?为了快速解决问题,你能在wikisend.com上上传你的工作簿样本,然后在这里共享链接吗?好的,我以前从未使用过该引用,因此我需要几分钟的时间使用此引用两件事。首先,这是一个示例,因此我的实际工作表比4行和8行长。遗憾的是,4行表格每次都必须更改。第二,我是否在我的子行后面加上“sht2=工作表(“计数”)?
    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