我在 Excel 中有一个六列表,我正在将其与条形码扫描仪一起使用。我们正在扫描自定义二维码,这些二维码会在每个单元格中显示文本。扫描从扫描员工徽章上的二维码开始,然后扫描正在签出或签入的特定项目。表格的范围是B2:G2
。列标记B
为员工编号,列C-F
标记为ITEM #1-4
,第 6 列和最后一列标记为IN/OUT
。在扫描自定义文本并将其输入到每个单元格后,我们使用的扫描仪会在每个单元格中制表。
我想根据特定文本IN
或剪切整个单元格OUT
,并将其粘贴到新单元格中。例如,如果D-F
条形码扫描仪在 列 中输入IN
或OUT
,我想从单元格中剪切IN
或值并将其粘贴到 列 中,并在粘贴后自动跳转到下表的行和 列 中的单元格。列和 列中不应包含包含或 的文本。OUT
G
B
B
C
IN
OUT
这可能吗?我发现一个类似的问题涉及多个工作簿并剪切整行而不是单元格,所以我认为这也可能实现。
我尝试了不同的 VBA、宏和 Excel 公式方法,但都无法满足我们的需求。我们的目标是限制所需的扫描次数。如果一个人进来并扫描出所有 4 件物品,则无需剪切和粘贴IN
或OUT
。扫描 4 件物品后,扫描仪将扫描带有文本IN
或的二维码OUT
进入列G
并自动跳转到列B
。但是,我们的大多数人只签出 1、2 或 3 件物品,我们希望消除任何额外的“空白”扫描或必须走到电脑前按下 Tab 或单击新单元格。发生这种情况的列将始终是,B-G
但需要为每一行继续(B2:G2
,,)我们将为大约 300 人使用至少 600 行B3:G3
。B4:G4
我编写代码的经验非常有限。任何代码建议或建议都将不胜感激。
答案1
您可以编写一个触发“OnEnter”或“OnTab”(使用)的宏Application.OnKey "{ENTER}" (or "{TAB}", whichever), "ThisMacro"
- 每次Enter
出于任何原因按下时都会运行 - 它会检查当前选定单元格所在的列,如果不是列 DF 单元格,它将结束。当列 DF 单元格是当前选定的单元格时,它会评估该单元格的内容。如果不是“In”或“Out”,它将结束。但如果是“In”或“Out”,它会剪切该值并移动到行的 G 列单元格,然后粘贴剪切的值。最后,它会选择下一行的 B 列单元格,让您准备好扫描下一个员工 ID。
我自己不写这些宏,从来没有需要。因此可能会出现各种不太明显的问题,需要解决。例如,在上面我轻率地说了几次“将结束”。也许它在执行Enter
通常执行的操作之前中断。也许不是。如果不是,轻率的“将结束”就是结束。但如果是这样,那么Enter
的正常效果就不会发生,您必须在宏中插入一行才能执行正常操作,即移动到单元格,或向下移动一行并返回到 B 列。(目前尚不清楚您如何实现这一目标,向下移动一行并返回到 B 列...一种想法是这些数据在正式的 Excel 表中,因此到达右边缘 G 列时,TAB
向下移动一行并移到左边缘,或者可能是老式的,宏选择(并维持此选择)范围,以便TAB
(或Enter
)将按照表格提供的方式运行。)因此,也有这种程度的考虑,即这将如何与所述宏交互。还可能出现其他事情。但是,所有这些都应该相当简单。当然,很乏味,而且需要详细的工作,但仍然很简单,特别是因为您已经熟悉了宏。
由于所涉及的工作不会涉及大量使用,因此每次按下或“按下”所选键时宏都会运行这一事实不应成为最令人担忧的问题。这与在电子表格中使用此类事件捕获器略有不同,在电子表格中,您Enter
每天会按下 2,000 次。
(但也许甚至也不是那样。它会很短,而且 VBA 在运行代码时速度非常快,而不是循环执行几百、几千或几万个“读取这个单元格,执行这些操作,写入那个单元格”操作。)
(如果我不时写这些,我会提供示例代码来修改。但我不会,所以我可能只会误导你。如果我还没有(!),虽然我已经看到了一些例子,这些例子做了我上面提到的所有事情。但看到它们和(成功地)做它们是两件非常不同的事情。写作和拼凑各个部分应该很简单,如果你还不了解每一部分,可以很容易地在互联网上找到每一部分的例子,所以我觉得我不是在用一个想法来戏弄你,却没有提供任何实质内容。)
答案2
这是发送给我的代码,它完全按照我的需求工作。粘贴它作为答案,供其他正在寻找类似内容的人参考。
Private Sub Worksheet_Change(ByVal Target As Range)
'check if only one cell is changed
If Target.CountLarge > 1 Then Exit Sub
'check if target is in columns D, E, or F
If Intersect(Target, Range("D:F")) Is Nothing Then Exit Sub
'check if target value is capital "IN" or "OUT"
If Target.Value <> "IN" And Target.Value <> "OUT" Then Exit Sub
Application.EnableEvents = False 'prevent triggering another change event
Target.Cut Destination:=Cells(Target.Row, 7) 'cut and paste in column G
Cells(Target.Row + 1, 2).Activate 'move active cell to next row, column B
Application.EnableEvents = True 'reenable events
End Sub