Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2199|回复: 7

[已解决]VBA重覆批号问题

[复制链接]
发表于 2016-12-21 10:23 | 显示全部楼层 |阅读模式
本帖最后由 lkk0063 于 2016-12-21 16:09 编辑

请问如何使用VBA实现以下功能
按下"Add Data"按钮,"In" Sheet G2 栏位会自动与"Out" Sheet A:A 栏位比对是否有相同,若有相同批号,则无法输出至"Out" Sheet,并秀出讯息

最佳答案
2016-12-21 15:27
加了注释。
  1. Function 判断重复() As Boolean      '“判断重复”作为一个逻辑型的函数,如果重复,值为true,否则为false
  2.     Dim d, arr, i, lotno
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheets("Out").Range("a1:a" & Sheets("Out").[a65536].End(3).Row)        '工作表"Out"的A列作为数据源
  5.     For i = 5 To UBound(arr)     '有效数据从第5行开始
  6.         d(arr(i, 1)) = ""     '把LotNo(arr(i,1))放入字典
  7.     Next
  8.     lotno = Left([g2], 13)     '本表的LotNo
  9.     If d.exists(lotno) Then MsgBox "Same LotNo in Out": 判断重复 = True     '如果本表的LotNo在字典中存在,说明有重复,那么函数“判断重复”值为true,并消息框提示。
  10. End Function
复制代码

TEST.zip

27.06 KB, 下载次数: 10

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-12-21 11:22 | 显示全部楼层
  1. Private Sub CommandButton1_Click()
  2.     Set sh = Sheets("In")
  3.     G2 = sh.[G2].Value
  4.     OutCount = Sheets("Out").Range("A" & Rows.Count).End(xlUp).Row
  5.     If OutCount > 5 Then
  6.         OutData = Sheets("Out").Range("A6").Resize(OutCount - 5, 82).Value
  7.         For j = 1 To UBound(OutData, 1)
  8.             If OutData(j, 1) = G2 Then Exit For
  9.         Next j
  10.         If j = UBound(OutData, 1) + 1 Then GoTo Ins
  11.         InData = sh.Range("F4:J18").Value
  12.         Ti = Array("G2", "C1", "E1", "G1", "E2", "C2", "I1", "K1", "C3", "E3")
  13.         For i = 1 To 82
  14.             If i <= 10 Then
  15.                 sh.Range(Ti(i - 1)).Value = OutData(j, i)
  16.             Else
  17.                 InData(Int((i - 11) / 5) + 1, (i - 11) Mod 5 + 1) = OutData(j, i)
  18.             End If
  19.         Next i
  20.         sh.Range("F4:J18").Value = InData
  21.     Else
  22.         OutData = Sheets("Out").Range("A6").Resize(1, 82).Value
  23. Ins:
  24.         InData = sh.Range("F4:J18").Value
  25.         Ti = Array(G2, sh.[C1].Value, sh.[E1].Value, sh.[G1].Value, sh.[E2].Value, sh.[C2].Value, sh.[I1].Value, sh.[K1].Value, sh.[C3].Value, sh.[E3].Value)
  26.         For i = 1 To 82
  27.             If i <= 10 Then
  28.                 OutData(1, i) = Ti(i - 1)
  29.             Else
  30.                 OutData(1, i) = InData(Int((i - 11) / 5) + 1, (i - 11) Mod 5 + 1)
  31.             End If
  32.         Next i
  33.         Sheets("Out").Range("A" & OutCount + 1).Resize(1, 82).Value = OutData
  34.     End If
  35. End Sub
复制代码
回复

使用道具 举报

发表于 2016-12-21 11:23 | 显示全部楼层
回复

使用道具 举报

发表于 2016-12-21 11:25 | 显示全部楼层
考虑到不影响原代码,加个函数判断一下。
  1. Function 判断重复() As Boolean
  2.     Dim d, arr, i, lotno
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheets("Out").Range("a1:a" & Sheets("Out").[a65536].End(3).Row)
  5.     For i = 5 To UBound(arr)
  6.         d(arr(i, 1)) = ""
  7.     Next
  8.     lotno = Left([g2], 13)
  9.     If d.exists(lotno) Then MsgBox "Same LotNo in Out": 判断重复 = True
  10. End Function
复制代码

然后在原代码开头加一句:
If 判断重复 = True Then Exit Sub

TEST.rar

24.39 KB, 下载次数: 5

回复

使用道具 举报

 楼主| 发表于 2016-12-21 13:26 | 显示全部楼层
grf1973 发表于 2016-12-21 11:25
考虑到不影响原代码,加个函数判断一下。

然后在原代码开头加一句:


Hi grf1973,
可以使用了, 谢谢, 但我想了解一下程式码,以下对于程式码解析是否有误,麻&#8203;&#8203;烦了

1.Function 判断重复() As Boolean
'Function判断式写法?

2.arr = Sheets("Out").Range("a1:a" & Sheets("Out").[a65536].End(3).Row)
'这是指抓取Sheets("Out") A:A 栏位所有资料吗?

3. For i = 5 To UBound(arr)'从5开始到数组的最大上界值之间循环
'从5开始到数组的最大上界值之间循环

4. d(arr(i, 1)) = ""
'将关键字" "(空白)资料丢进 arr(i,1)

5.If d.exists(lotno) Then MsgBox "Same LotNo in Out": 判断重复 = True
'如果字典中存在关键字"lotno”,秀出Same LotNo in Out讯息







回复

使用道具 举报

 楼主| 发表于 2016-12-21 13:28 | 显示全部楼层

sgxb123431380
谢谢你的帮忙,
但grf1973 大大比较符合我的需求, 须不影响原代码状态下, 不好意思

回复

使用道具 举报

发表于 2016-12-21 13:42 | 显示全部楼层
lkk0063 发表于 2016-12-21 13:28
sgxb123431380
谢谢你的帮忙,
但grf1973 大大比较符合我的需求, 须不影响原代码状态下, 不好意思

没事,写着玩的,就是看你有好多对单元格的直接调用就给你改了一下,能加快一些速度而已
回复

使用道具 举报

发表于 2016-12-21 15:27 | 显示全部楼层    本楼为最佳答案   
加了注释。
  1. Function 判断重复() As Boolean      '“判断重复”作为一个逻辑型的函数,如果重复,值为true,否则为false
  2.     Dim d, arr, i, lotno
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheets("Out").Range("a1:a" & Sheets("Out").[a65536].End(3).Row)        '工作表"Out"的A列作为数据源
  5.     For i = 5 To UBound(arr)     '有效数据从第5行开始
  6.         d(arr(i, 1)) = ""     '把LotNo(arr(i,1))放入字典
  7.     Next
  8.     lotno = Left([g2], 13)     '本表的LotNo
  9.     If d.exists(lotno) Then MsgBox "Same LotNo in Out": 判断重复 = True     '如果本表的LotNo在字典中存在,说明有重复,那么函数“判断重复”值为true,并消息框提示。
  10. End Function
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 09:08 , Processed in 0.339595 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表