ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5454|回复: 16

[求助] 如何用VB解决以日期和数量自动生成编号

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-2 20:38 | 显示全部楼层 |阅读模式
各位高手:

能否帮我解决用VB以日期和数量自动生成编号,之前有高手用函数进行解决,但是数量太多,运算起来太卡了,所以再次求助,详见附件,不胜感激!

1111.rar

4.93 KB, 下载次数: 156

TA的精华主题

TA的得分主题

发表于 2018-8-2 22:47 | 显示全部楼层
  1. '需要在指定工作表中插入代码
  2. Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  3. If Target.Column <> 12 Then Exit Sub
  4. If Target.Count = 1 Then If Target = "" Then Exit Sub

  5. r = Target.Row: c = Target.Column
  6. rq = Format(Target.Value2(1, 1), "yymmdd")

  7. For i = 3 To r - 1
  8.     lsh1 = lsh1 + Cells(i, c - 3)
  9. Next i
  10. lsh2 = Cells(r, c - 3)

  11. For i = lsh1 + 1 To lsh1 + lsh2
  12.     bh = "SQB" & rq & Format(i, "0000")
  13.     ic = ic + 1
  14.     Cells(r, 12 + ic) = bh
  15. Next i

  16. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-3 09:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

感谢您的帮忙,但是得出的效果怪怪,和我想要的结果有点差别,我在解释下:
假设:我在I3里输入数量5(I3和I4是合并单元格),那么M3~T3这个区域内会根据L3的日期自动生成5个编号,编号规则“SQB”+“18”(年)+“05”(月)+“02”(日)+“0001”(流水号)

接下来:我在I5里输入数量1(I5和I6是合并单元格),那么M5~T5这个区域内会根据L5的日期自动生成1个编号,编号规则“SQB”+“18”(年)+“06”(月)+“09”(日)+“0006”(流水号)

以此类推

备注:日期随时可能更改,那么编号也跟随更改;
         数量随时可能更改,编号的数量也跟随更改;例如I3的数量5改为3,那么M3~T3这个区域内编号由原来的5个编号自动变成3个编号,以下的流水号也自动变动更新;

麻烦您再看看是否能解决!谢谢,其他高手也帮忙看看!

TA的精华主题

TA的得分主题

发表于 2018-8-3 10:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
BMW5566 发表于 2018-8-3 09:52
感谢您的帮忙,但是得出的效果怪怪,和我想要的结果有点差别,我在解释下:
假设:我在I3里输入数量5(I ...

Sub a()
Dim arr, brr(1 To 999, 1 To 20), i%, j%, r%, m%, T%
r = [i999].End(3).Row
arr = Range("i3:l" & r + 1)
For i = 1 To UBound(arr) Step 2
    For j = 1 To arr(i, 1)
        m = m + 1
        T = T + 1
        brr(i, m) = "SQB" & Format(arr(i, 4), "YYMMDD") & Format(T, "0000")
    Next
    m = 0
Next
[M3:T99] = ""
[M3].Resize(999, 20) = brr

TA的精华主题

TA的得分主题

发表于 2018-8-3 11:01 | 显示全部楼层
本帖最后由 gbgbxgb 于 2018-8-3 11:32 编辑
BMW5566 发表于 2018-8-3 09:52
感谢您的帮忙,但是得出的效果怪怪,和我想要的结果有点差别,我在解释下:
假设:我在I3里输入数量5(I ...
  1. <blockquote>
复制代码

TA的精华主题

TA的得分主题

发表于 2018-8-3 11:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim theInputRow&, theDate As Date, theYear&, theMonth&, theDay&
  3.     Dim theColumn&, theNum&, theValue As Variant
  4.     '
  5.     With Target
  6.         theInputRow = .Row
  7.         If theInputRow < 2 Then End
  8.         theColumn = .Column
  9.     End With
  10.     '
  11.     Application.EnableEvents = False
  12.     If theColumn = 9 Or theColumn = 12 Then
  13.         With Me
  14.             .Range(.Cells(theInputRow, 13), .Cells(theInputRow, 20)).ClearContents
  15.             theValue = .Cells(theInputRow, 9)
  16.             If IsNumeric(theValue) Then
  17.                 theNum = CLng(theValue)
  18.                 If theNum > 0 Then
  19.                     theValue = .Cells(theInputRow, 12)
  20.                     If IsDate(theValue) Then
  21.                         theDate = CDate(theValue)
  22.                         theYear = Year(theDate)
  23.                         theMonth = Month(theDate)
  24.                         theDay = Day(theDate)
  25.                         Call theStrInput(theInputRow, theNum, theYear, theMonth, theDay)
  26.                     End If
  27.                 End If
  28.             End If
  29.         End With
  30.     End If
  31.     Application.EnableEvents = True
  32. End Sub

  33. Private Sub theStrInput(theInputRow&, theNum&, theYear&, theMonth&, theDay&)
  34.     Dim thePreviousRow&, theStr$, thePreviousNum&, theColumn&
  35.     Dim i&, a As Variant, theStrFirst$, theStrLast$
  36.     '
  37.     thePreviousRow = theInputRow - 2
  38.     With Me
  39.         Do While thePreviousRow > 1
  40.             For theColumn = 20 To 13 Step -1
  41.                 theStr = .Cells(thePreviousRow, theColumn)
  42.                 If theStr <> "" Then
  43.                     theStr = Right(theStr, 4)
  44.                     If IsNumeric(theStr) Then thePreviousNum = CLng(theStr)
  45.                     Exit Do
  46.                 End If
  47.             Next theColumn
  48.             thePreviousRow = thePreviousRow - 2
  49.         Loop
  50.         theStrFirst = "SQB" & Right(theYear, 2) & Format(theMonth, "00") & Format(theDay, "00")
  51.         ReDim a(1 To theNum)
  52.         For i = 1 To theNum
  53.             theStrLast = theStrFirst & Format(i + thePreviousNum, "0000")
  54.             a(i) = theStrLast
  55.         Next i
  56.         .Cells(theInputRow, 13).Resize(, theNum) = a
  57.     End With
  58. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-3 14:50 | 显示全部楼层

您好!感谢帮忙
但是有些问题,您帮忙写的代码里日期是需要人工手写输入的,但我的表格之前有代码:日期是自动生成的,例如:我编辑B3的数据,那么L3就会自动更新日期!看能否结合自动生成的日期帮忙再修订下您的代码,也就是根据人工输入的数量,再结合原有自动生成的日期,而编译出自动生成编号的代码,谢谢!

TA的精华主题

TA的得分主题

发表于 2018-8-3 15:39 | 显示全部楼层
BMW5566 发表于 2018-8-3 14:50
您好!感谢帮忙
但是有些问题,您帮忙写的代码里日期是需要人工手写输入的,但我的表格之前有代码:日期 ...

如果L列的日期是手动编辑B列引起的结果,那么,把代码中的12改成2就可以了(注:仅指theColumn = 12中的12)。

TA的精华主题

TA的得分主题

发表于 2018-8-3 15:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 gbgbxgb 于 2018-8-3 16:10 编辑
BMW5566 发表于 2018-8-3 14:50
您好!感谢帮忙
但是有些问题,您帮忙写的代码里日期是需要人工手写输入的,但我的表格之前有代码:日期 ...

如果L列的日期是手动编辑B列引起的结果,那么,把代码中的12改成2就可以了(注:仅指theColumn = 12中的12)。
事后:
因网站问题,重复跟帖了。
那就借本楼提醒下:
(1)最好把if theNum > 0 Then修改为If theNum > 0 And theNum < 9 Then
(2)上述手动B列的单元格如果与存在合并单元格的I列(即数量列)不一样,即B列不存在合并单元格,代码还要作相关修改。(3)4楼的代码你为何不借鉴呀。对该代码稍加修改或许才是你要的。



TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-3 16:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
gbgbxgb 发表于 2018-8-3 15:41
如果L列的日期是手动编辑B列引起的结果,那么,把代码中的12改成2就可以了(注:仅指theColumn = 12中的12 ...

我也想借鉴4楼的试用下,但因为是菜鸟,代码复制进去没反应
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-16 20:07 , Processed in 0.030490 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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