ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
123
返回列表 发新帖
楼主: 周进

[求助] VBA对序列号进行分段,谢谢!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-7-5 11:54 | 显示全部楼层
  1. Public d1 As Object
  2. Public d2 As Object
  3. Sub test1()
  4.   Dim r&, i&, m&
  5.   Dim brr(), crr()
  6.   Application.ScreenUpdating = False
  7.   Application.DisplayAlerts = False
  8.   Set d1 = CreateObject("scripting.dictionary")
  9.   Set d2 = CreateObject("scripting.dictionary")
  10.   tt = Timer
  11.   ss = ("0123456789ABCDEFGHJKLMNPQRSTUVWXYZ")
  12.   For i = 1 To Len(ss)
  13.     ch = Mid(ss, i, 1)
  14.     d1(ch) = i - 1
  15.     d2(i - 1) = ch
  16.   Next
  17.   With Worksheets("sheet1")
  18.     gdz = .Range("c4")
  19.     ksm = c34to10(.Range("d4"))
  20.     jsm = c34to10(.Range("d5"))
  21.     ReDim brr(1 To jsm - ksm + 1)
  22.     m = 0
  23.     For i = ksm To jsm
  24.       m = m + 1
  25.       brr(m) = gdz & c10to34(i)
  26.     Next
  27.     ReDim crr(1 To 2000, 1 To Application.Ceiling(UBound(brr) / 2000, 1))
  28.     m = 1
  29.     n = 1
  30.     For i = 1 To UBound(brr)
  31.       crr(m, n) = brr(i)
  32.       m = m + 1
  33.       If m > 2000 Then
  34.         n = n + 1
  35.         m = 1
  36.       End If
  37.     Next
  38.     .Range("g3").Resize(UBound(crr), UBound(crr, 2)) = crr
  39.   End With
  40.   Application.ScreenUpdating = True
  41.   MsgBox "共用时" & Timer - tt & "秒"
  42. End Sub
  43. Function c34to10(ByVal c34 As String) As Long
  44.   Dim r%, i%
  45.   Dim s As Long
  46.   c34 = UCase(c34)
  47.   For i = 1 To Len(c34)
  48.     ch = Mid(c34, i, 1)
  49.     s = s + d1(ch) * 34 ^ (Len(c34) - i)
  50.   Next
  51.   c34to10 = s
  52. End Function
  53. Function c10to34(ByVal c10 As Long) As String
  54.   Dim s$
  55.   Do While c10 > 33
  56.     n = c10 Mod 34
  57.     c10 = Int(c10 / 34)
  58.     s = d2(n) & s
  59.   Loop
  60.   s = d2(c10) & s
  61.   c10to34 = s
  62. End Function

复制代码

TA的精华主题

TA的得分主题

发表于 2020-7-5 11:55 | 显示全部楼层
  1. Sub test2()
  2.   Dim r%, i%, m%, n%
  3.   Dim gdz$, ksm$, jsm$
  4.   Dim brr(1 To 2000, 1 To 3000)
  5.   Application.ScreenUpdating = False
  6.   Application.DisplayAlerts = False
  7.   Set d1 = CreateObject("scripting.dictionary")
  8.   Set d2 = CreateObject("scripting.dictionary")
  9.   tt = Timer
  10.   ss = ("0123456789ABCDEFGHJKLMNPQRSTUVWXYZ")
  11.   For i = 1 To Len(ss)
  12.     ch = Mid(ss, i, 1)
  13.     d1(ch) = i - 1
  14.     d2(i - 1) = ch
  15.   Next
  16.   
  17.   With Worksheets("sheet1")
  18.     gdz = .Range("c4")
  19.     ksm = .Range("d4")
  20.     jsm = .Range("d5")
  21.     m = 1
  22.     n = 1
  23.     Do
  24.       brr(m, n) = gdz & ksm
  25.       m = m + 1
  26.       If m > 2000 Then
  27.         m = 1
  28.         n = n + 1
  29.       End If
  30.       c34add ksm, Len(ksm)
  31.     Loop While ksm <> jsm
  32.     .Range("g3").Resize(UBound(brr), UBound(brr, 2)) = brr
  33.   End With
  34.   Application.ScreenUpdating = True
  35.   MsgBox "共用时" & Timer - tt & "秒"
  36. End Sub

  37. Sub c34add(ByRef c34 As String, ByVal n As Integer)
  38.   ch = Mid(c34, n, 1)
  39.   If d1(ch) < 33 Then
  40.     c34 = Application.Replace(c34, n, 1, d2(d1(ch) + 1))
  41.   Else
  42.     c34 = Application.Replace(c34, n, 1, "0")
  43.     c34add c34, n - 1
  44.   End If
  45. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-7-5 11:59 | 显示全部楼层
第一种算法先转换成10进制数相加生成数组,然后再转换成34进制,用时68秒。
第二种直接使用递归算法直接进行34制加法,用时90秒。

按序列分段.rar

23.03 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-6 22:59 | 显示全部楼层
chxw68 发表于 2020-7-5 11:59
第一种算法先转换成10进制数相加生成数组,然后再转换成34进制,用时68秒。
第二种直接使用递归算法直接进 ...

两个文本框中输入字符+回车键确定该文本输入完成,代码如何写?也就是textbox1与textbox2两个文本框必须字符输入完然后按回车键才执行比较,目前问题是textbox2字符串未输入完程序就开始比较了

Option Explicit

Dim flag As Boolean

Private Sub TextBox1_Change()
  Call speak
End Sub

Private Sub TextBox2_Change()
  Call speak
End Sub

Sub speak()
  Dim t
  If Len(TextBox1.Text) = 0 Or Len(TextBox2.Text) = 0 Or flag Then Exit Sub
  If Mid(TextBox1.Text, 1, 7) = Mid(TextBox2.Text, 1, 7) Then
  Application.Speech.speak "ok"
  Else: Application.Speech.speak "不相同"
  End If
  t = Timer
  Do
    DoEvents
  Loop Until Timer - t >= 1
  TextBox1.Text = vbNullString
  TextBox2.Text = vbNullString
  flag = False
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-22 12:15 , Processed in 0.032033 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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