ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 很有规律的提取数字并编号,写了段代码,运行不出来,望高手指点

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-24 14:23 | 显示全部楼层 |阅读模式
本帖最后由 wine0431 于 2018-8-24 14:26 编辑

需要在B列填写编号(从HT18063-1,HT18063-2,HT18063-3,HT18063-4,HT18063-5,HT18063-6……)。规律如下:开头为C列前7个字符(HT18063),之后加上“-”,最后的数字按照C列尾号108个,108个, 108个, 108个,120个(108+12)这样5个数组循环,分别为HT18063-1(尾号为1-108),HT18063-2(尾号为109-216)HT18063-3(尾号为217-324)HT18063-4(尾号为325-432)HT18063-5(尾号为433-552),接着类似HT18063-6,HT18063-7,HT18063-8,HT18063-9,HT18063-10。自己写了段运行不对,望高手指正


Sub title()
Dim i, j, k As Integer, b As String

For i = 2 To ActiveSheet.[A65536].End(xlUp).Row
b = Cells(i, 2)
j = 0
Do While n < 552
m = Val(Right(Range(i, 3), 4))
n = m - 552 * j

If n <= 540 Then
a = Int((n - 1) / 108) + 1 + 5 * j
If n >= 541 And n <= 552 Then
a = 5 * (j + 1)
Else: j = j + 1
Cells(i, 2) = Left(b, 7) & "-" & a
End If

Next i
End Sub

数据编号.zip

199.63 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2018-8-24 15:08 | 显示全部楼层
Sub title()
Dim arr, k0
k0 = [c1].End(4).Row - 1
arr = [c2].Resize(k0, 1)

For i = 1 To k0
   b1 = Left(arr(i, 1), 7)
   b2 = Val(Right(arr(i, 1), 4))
   
   c1 = Int(b2 / 552)
   c2 = b2 - c1 * 552
   c3 = Application.Lookup(c2, Array(0, 1, 109, 217, 325, 433), Array(0, 1, 2, 3, 4, 5))
   Cells(i + 1, 2) = b1 & "-" & c1 * 5 + c3
Next

End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-24 15:48 | 显示全部楼层
  1. Sub Test()
  2.     Dim lngRows As Long
  3.     Dim lngRow As Long
  4.     Dim arr As Variant
  5.     Dim strFirst As String, strID As String
  6.     Dim intVal As Integer, intMod As Integer, intQuotient As Integer
  7.    
  8.     lngRows = Sheet1.Range("C" & Rows.Count).End(xlUp).Row
  9.     arr = Sheet1.Range("A2:C" & lngRows)
  10.    
  11.     strFirst = arr(1, 3)
  12.     strFirst = Left(Trim(strFirst), 7) 'strFirst = "HT18063"
  13.     For lngRow = 1 To UBound(arr)
  14.         intVal = Val(Right(Trim(arr(lngRow, 3)), 4))
  15.         intQuotient = (intVal - 1) \ 552 '每552个号为一大组,108*4+120
  16.         intMod = (intVal - 1) Mod 552
  17.         If intMod > 431 Then '第5组的编号直接计算
  18.             strID = 5 + 5 * intQuotient
  19.         Else
  20.             intMod = intMod \ 108
  21.             strID = intMod + 1 + 5 * intQuotient
  22.         End If
  23.         
  24.         arr(lngRow, 2) = strFirst & "-" & strID
  25.     Next
  26.    
  27.     Sheet1.Range("A2:C" & lngRows) = arr
  28. End Sub
复制代码

TA的精华主题

TA的得分主题

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

谢谢,楼上的效果更好,因为我这只是一部分表格,还有其他的需要合并,前面字母需要提取

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-24 16:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zopey 发表于 2018-8-24 15:08
Sub title()
Dim arr, k0
k0 = [c1].End(4).Row - 1

c3 = Application.Lookup(c2, Array(0, 1, 109, 217, 325, 433), Array(0, 1, 2, 3, 4, 5))
能否请教下这句是什么意思,我看得懂大意,c2的值可以是0-551,不知道中间Array(0, 1, 109, 217, 325, 433)代表什么意思,是表明数组的下界吗?举个例子,如果c2= 227,那么他落在Array(0, 1, 109, 217, 325, 433)的第四和第五之间,取4,所以返回Array(0, 1, 2, 3, 4, 5)的4。是这样的吗?

TA的精华主题

TA的得分主题

发表于 2018-8-24 16:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wine0431 发表于 2018-8-24 16:24
c3 = Application.Lookup(c2, Array(0, 1, 109, 217, 325, 433), Array(0, 1, 2, 3, 4, 5))
能否请教下 ...

if c2>=433 then
  c3=5
elseif  c2>=325 then
   c3=4
elseif  c2>=217 then
   c3=3
elseif  c2>=109 then
   c3=2
elseif  c2>=1 then
   c3=1
elseif  c2>=0 then
   c3=0
end if

TA的精华主题

TA的得分主题

发表于 2018-8-24 16:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
当c2 =227 代码会执行到

elseif  c2>=217 then
      c3=3

退出 if ,此时c3 =3 。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-24 16:35 | 显示全部楼层
zopey 发表于 2018-8-24 16:32
当c2 =227 代码会执行到

elseif  c2>=217 then

好的,那个array中就是下界了,知道了,谢谢啦

TA的精华主题

TA的得分主题

发表于 2018-8-24 16:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wine0431 发表于 2018-8-24 16:17
谢谢,楼上的效果更好,因为我这只是一部分表格,还有其他的需要合并,前面字母需要提取

看清楚逻辑,我和楼上的是一样的,只是我的是计算,他的是 罗列了参数值

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-31 16:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lsdongjh 发表于 2018-8-24 16:38
看清楚逻辑,我和楼上的是一样的,只是我的是计算,他的是 罗列了参数值

好的,学习了,非常感谢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-13 07:54 , Processed in 0.027393 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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