如何通过Excel中的VB从另一个单元格中减去一个单元格中键入的值?

时间:2018-09-07 10:31:58

标签: excel excel-vba

我遇到了以下问题。

我需要使用Excel创建一个类似于以下内容的“ Inventory Chart”。

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

+---+--------+-------+---+--------+------------+
|   |   A    |   B   | C |   D    |     E      |
+---+--------+-------+---+--------+------------+
| 1 | Item   | Stock |   | Item   | Withdrawel |
| 2 | Item 1 | 32    |   | Item 4 | 5          |
| 3 | Item 2 | 228   |   | Item 3 | 20         |
| 4 | Item 3 | 121   |   | Item 1 | 10         |
| 5 | Item 4 | 93    |   |        |            |
| 6 | Item 5 | 44    |   |        |            |
+---+--------+-------+---+--------+------------+
  • A列包含我们库存中的物品
  • B列包含当前库存。可以手动修改它,也可以由VB修改(如我稍后所述)(
  • C列只是一个空格
  • D列是用户插入他/她从库存中撤出的物品的地方
  • 用户在E列中输入他/她提取的数量
  • D列和E列将无限下降,因此您拥有连续的提款历史记录

现在,我想认识到,用户在E列中插入了数量之后,将从正确项目的B列中的库存值中减去此数量。

但是由于B也可以手动修改(例如,针对广告资源),因此我无法在此处使用公式。

我想补充一点,就是我对VB知之甚少。我在VB上的唯一经历是在学校学习Visual Studio的时候。因此,我尝试对问题进行一些研究,但我真的不知道要搜索什么,也没有找到几乎匹配的东西。

另外,如果您看到或知道另一种更简单的方法来解决此问题,因为我将这些东西完全弄得太复杂了,请告诉我。


编辑:

按照承诺,这是实际图表。我仍将“ Item 1”等用作项目名称。实际的项目名称可以包含特殊字符,例如空格,“-”,“ /”,“(”,“)”和“”。如果重要的话。

请注意,在此图表中,A是以前的另一列。我总是调整您提供的代码以匹配列。

列A包含项目编号的所有可能变体。空单元格可以在这里发生。

D仍然是间隔物。

A,B和C列实际上下降到第46行(包括标题)。 E列至I列无限下降。我只是不想让帖子过大,所以我将其缩短为6行。

<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg .tg-1wig{font-weight:bold;text-align:left;vertical-align:top}
.tg .tg-fymr{font-weight:bold;border-color:inherit;text-align:left;vertical-align:top}
.tg .tg-0lax{text-align:left;vertical-align:top}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
  <tr>
    <th class="tg-1wig">Item Number</th>
    <th class="tg-fymr">Item</th>
    <th class="tg-fymr">Stock</th>
    <th class="tg-fymr">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
    <th class="tg-fymr">Item</th>
    <th class="tg-fymr">Withdrawal</th>
    <th class="tg-1wig">Use</th>
    <th class="tg-1wig">Employee</th>
    <th class="tg-1wig">Date</th>
  </tr>
  <tr>
    <td class="tg-0lax">AAA-AAA-0000</td>
    <td class="tg-0pky">Item 1<br></td>
    <td class="tg-0pky">32</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky">Item 4</td>
    <td class="tg-0pky">5</td>
    <td class="tg-0lax">Usage</td>
    <td class="tg-0lax">Kuraiko</td>
    <td class="tg-0lax">09.09.2018</td>
  </tr>
  <tr>
    <td class="tg-0lax">0AA-AAA-0000</td>
    <td class="tg-0pky">Item 2</td>
    <td class="tg-0pky">228</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky">Item 3</td>
    <td class="tg-0pky">20</td>
    <td class="tg-0lax">Usage</td>
    <td class="tg-0lax">Kuraiko</td>
    <td class="tg-0lax">10.09.2018</td>
  </tr>
  <tr>
    <td class="tg-0lax">AAAA-AAA-0000</td>
    <td class="tg-0pky">Item 3</td>
    <td class="tg-0pky">121</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky">Item 1</td>
    <td class="tg-0pky">10</td>
    <td class="tg-0lax">Usage</td>
    <td class="tg-0lax">Kuraiko</td>
    <td class="tg-0lax">11.09.2018</td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0pky">Item 4</td>
    <td class="tg-0pky">93</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0pky">Item 5</td>
    <td class="tg-0pky">44</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
</table>

4 个答案:

答案 0 :(得分:1)

无法在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列中的值并减去“取款总额”。这将突出显示手动数据输入与交易数据不一致的地方。您还可以将此公式复制到列的下方。

答案 1 :(得分:0)

我想我在这里得到了你的帮助。您可以使用Worksheet_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

答案 2 :(得分:0)

我前一段时间开始回答,但有点误入歧途。看起来就像@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

如果您想在空白列中隐藏新的"x"标记,则可以隐藏整个列,或者保持该间距,只需在其中将字体颜色设置为白色即可。

答案 3 :(得分:0)

过分思考car10ms在我的主要帖子中发表评论,然后再次查看Tedinoz的回答,我现在得出以下解决方案。

  • 我已经在C语言中添加了一个公式:=SUMIF($E:$E;B2;$F:$F)
  • 接下来,我要做的是通过向E填充我们拥有的所有物料并为F填充当前库存来进行库存
  • 现在我要锁定C和其他一些列/单元格,因此其他少数可以访问此工作表的用户无法搞定

如果我事先知道在Excel工作表中使用VB会变得多么复杂,我早些时候就会想到这样一个简单的解决方案。我只是认为这样会更轻松,更方便。

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