Excel 如何减去一个单元格中键入的值?

Excel 如何减去一个单元格中键入的值?,excel,vba,Excel,Vba,我需要创建一个“库存图表” 实际的图表包含更多的信息,但这些是重要的信息 A. B C D E 1. 项目 股票 项目 撤回 2. 项目1 32 项目4 5. 3. 项目2 228 项目3 20 4. 项目3 121 项目1 10 5. 项目4 93 6. 项目5 44 我想我明白你的意思了。您可以使用工作表\u Change()事件检测列E中的值是否已更改,并进行计算以更新B: Private Sub Worksheet_Change(ByVal Target As Range) If

我需要创建一个“库存图表”

实际的图表包含更多的信息,但这些是重要的信息

A. B C D E 1. 项目 股票 项目 撤回 2. 项目1 32 项目4 5. 3. 项目2 228 项目3 20 4. 项目3 121 项目1 10 5. 项目4 93 6. 项目5 44
我想我明白你的意思了。您可以使用
工作表\u Change()
事件检测列E中的值是否已更改,并进行计算以更新B:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5 And Target.Cells.Count = 1 Then  'A cell in Column E was changed
        Dim withdrawal As Long
        Dim item As String

        withdrawal = Target.value
        item = Target.Offset(,-1).value

        Dim foundItem as String
        Set foundItem = Range("A:A").Find(item)

        foundItem.Offset(,1).value = foundItem.Offset(,1).value - withdrawal
    End If
End Sub

无法将公式放入C列是一种挫折,但也存在手动调整不准确的风险

我建议创建两个新专栏。第一个=“W/Drawl Total”(假设这是F列)和第二个=“W/Drawal-Proof”(假设是G列)

F2中的公式如下:

=SUMIF($D$2:$D$6,A2,$E$2:$E$6)
这将汇总该行所列库存项目的所有提款。
请注意,“范围”和“总和范围”表示为绝对值。这非常重要。
在本例中,范围仅从第2行到第6行,但实际上,您需要编辑范围实际底部行的行号,并按行向下复制公式

G2中的公式如下:

=+C2-F2

很简单。它取C列中的值并扣除“取款总额”。这将突出显示手动数据输入与交易数据不一致的地方。你也可以把这个公式抄下来。

我刚才开始回答,有点偏离了方向。看起来@JNevill和我的想法非常相似

基本上,如果您在第二个项目栏或取款栏中进行更改,它将检查相邻的空栏,如果没有
“x”
,它将尝试从库存栏中的总额中减去该记录的取款,最后标记
“x”成功后,在空列中输入

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim colItems1 As String: colItems1 = "B"
    Dim colStock As String: colStock = "C"
    Dim colEmpty As String: colEmpty = "D"
    Dim colItems2 As String: colItems2 = "E"
    Dim colWithdrawal As String: colWithdrawal = "F"

    If Not Intersect(Target, Range(colItems2 & ":" & colWithdrawal)) Is Nothing Then

        Dim rowLast As Long
        rowLast = Range(colWithdrawal & Rows.Count).End(xlUp).Row

        'Uncomment this for it to only attempt to subtract when there isn't an "x" in each row
'        If WorksheetFunction.CountA(Range(colEmpty & "2:" & colEmpty & rowLast)) <> rowLast - 1 Then

            Dim vals As Variant
            vals = Range(colEmpty & "2:" & colWithdrawal & rowLast).Value2

            Dim i As Long
            For i = LBound(vals) To UBound(vals)
                If Len(vals(i, 1)) = 0 And Len(vals(i, 2)) > 0 And Len(vals(i, 3)) > 0 Then

                    Dim itemMatch As Range
                    Set itemMatch = Range(colItems1 & ":" & colItems1).Find(vals(i, 2))

                    If Not itemMatch Is Nothing Then
                        itemMatch.Offset(0, 1).Value2 = itemMatch.Offset(0, 1).Value2 - vals(i, 3)
                        Range(colEmpty & 2 + i - 1).Value2 = "x"
                    End If
                End If
            Next i

'        End If

    End If

End Sub
选项显式
私有子工作表_更改(ByVal目标作为范围)
将colItems1标注为字符串:colItems1=“B”
Dim colStock作为字符串:colStock=“C”
Dim colEmpty作为字符串:colEmpty=“D”
将colItems2标注为字符串:colItems2=“E”
将COLDECUTION设置为字符串:COLDECUTION=“F”
如果不相交(目标、范围(colItems2&“:”&coldrawing))则为零
它能持续多久
rowLast=范围(coldrawing&Rows.Count).End(xlUp).Row
'取消对此的注释,使其仅在每行中没有“x”时尝试减法
'如果工作表function.CountA(范围(colEmpty&“2:&colEmpty&rowLast))rowLast-1,则
作为变量的Dim VAL
VAL=范围(colEmpty和“2:”&coldrawing和rowLast)。值2
我想我会坚持多久
对于i=LBound(VAL)到UBound(VAL)
如果Len(vals(i,1))=0且Len(vals(i,2))>0且Len(vals(i,3))>0,则
Dim itemMatch作为范围
Set itemMatch=Range(colItems1&“:”&colItems1)。查找(vals(i,2))
如果没有,那么itemMatch什么都不是
itemMatch.Offset(0,1).Value2=itemMatch.Offset(0,1).Value2-VAL(i,3)
范围(colEmpty&2+i-1)。值2=“x”
如果结束
如果结束
接下来我
"完"
如果结束
端接头

如果你想在空白栏中隐藏新的
“x”
标记,你可以隐藏整个栏,或者保持间距,你只需将字体颜色设置为白色即可。

在我的主要帖子中过度思考cars10ms注释,再次查看Tedinoz答案,我现在找到了以下解决方案

  • 我在C:
    =SUMIF($E:$E;B2;$F:$F)
  • 接下来我做了一个清单,用我们所有的物品填E,用现在的存货填F
  • 现在我要锁定C和其他一些列/单元格,这样其他几个可以访问此表的用户就不会搞砸了
如果我事先知道在Excel表格中使用VB有多复杂,我早就想到了这样一个简单的解决方案。我只是觉得这样会更简单更方便


无论如何,非常感谢大家的努力和时间!很抱歉,我无法应用其中一个VB解决方案。至少我对VB有了一点了解,现在我要查找VB和VBA的区别;)

您介意我在C列中输入一个值,以便检查取款是否已被减去吗?您可以将字体更改为白色,这样就不会有人注意到您是否正在尝试使用本机excel vba或visual basic?它们是两种不同的技术。在您的公告点中,您注意到列
B
将由VBA逻辑(或用户)更改,但在底部的粗体注释中,您引用了空白列
C
。是哪一个?这很难理解。我很抱歉把这里和C栏混淆了。我实际上是指B栏,编辑了我的主要帖子@我想,我想我的国家是Excel VBA。。。但我不知道有什么不同。也许这就解释了为什么我在理解Excel中VB的用法时遇到如此多的困难:/另一种方法是锁定B列,并添加G列和H列以说明库存的增加。然后,您可以简单地将B列作为两个
Sumif()
的区别。您好,JNevill,谢谢您的回答:代码工作正常,但并不像我想象的那样。根据我的理解,“Target.Offset(,-3).Value”从目标列之前的三列获取值。因此,如果目标列为5,则target.Offset(,-3)将获取列2中的值。问题是,用户在D中添加的项目可能与A中的项目不匹配。代码需要首先检查D中的项目,然后在A中找到该项目,并在B中更改相应的值。我希望您理解我的意思--我明白了。我认为您的列
a:B
D:E
之间在行级别存在关系。我将进行编辑。我已将答案更新为