如何通过Excel中的VB减去从另一个单元格中键入的值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过Excel中的VB减去从另一个单元格中键入的值?相关的知识,希望对你有一定的参考价值。
我有以下问题。
我需要使用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几乎一无所知。当我们不得不使用Visual Studio时,我唯一的VB体验就是来自学校。所以我试着对我的问题做一些研究,但我真的不知道要搜索什么,也没有找到任何匹配的东西。
另外,如果你看到或知道另一个更简单的方法我可以解决这个问题,因为我完全过于复杂,请告诉我。
编辑:
正如这里承诺的那样是实际的图表。我仍然会使用“第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"> </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>
无法在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列中的值并扣除“取款总额”。这将突出显示手动数据输入与交易数据不一致的位置。您还可以在列中复制此公式。
我想我在这之后得到的是你。您可以使用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
过度思考汽车10毫秒评论我的主要帖子,并再次调查Tedinoz回答我现在来到以下解决方案。
- 我把一个公式放入C:
=SUMIF($E:$E;B2;$F:$F)
- 接下来我做的是通过向E填充我们拥有的所有物品和使用当前库存的F来制作库存
- 现在我要锁定C和其他一些列/单元格,因此可以访问此工作表的少数其他用户无法搞砸
如果我事先知道在Excel表格中使用VB会有多复杂,我早就想到了这么简单的解决方案。我只是觉得它会更简单,更方便。
无论如何,非常感谢大家的努力和时间!抱歉,我无法应用其中一个VB解决方案。至少我在VB中有一个小小的内部,我现在要查找VB和VBA的区别;)
我刚才开始回答,并且有点偏离。它看起来像@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"
标记,您可以隐藏整个列,或者为了保持该间距,您可以将字体颜色设置为白色。
以上是关于如何通过Excel中的VB减去从另一个单元格中键入的值?的主要内容,如果未能解决你的问题,请参考以下文章
用excel中的VBA,然后根据excel中单元格中内容,批量替换一个word的模板doc中的字符。字符有很多处。