我遇到了以下问题。
我需要使用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 | | | |
+---+--------+-------+---+--------+------------+
现在,我想认识到,用户在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"> </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>
答案 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的回答,我现在得出以下解决方案。
=SUMIF($E:$E;B2;$F:$F)
如果我事先知道在Excel工作表中使用VB会变得多么复杂,我早些时候就会想到这样一个简单的解决方案。我只是认为这样会更轻松,更方便。
无论如何,感谢大家的努力和时间!很抱歉,我无法应用其中一种VB解决方案。至少我对VB有一个很小的了解,现在我要查找VB和VBA的区别;)