ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 注释一行代码后,程序就变了,不能追加数据了?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-7 22:28 | 显示全部楼层 |阅读模式
本帖最后由 gjgjgjgj 于 2024-9-7 22:29 编辑

这个代码是抄来了,改了一下,附件中,008表有按钮执行宏,每执行一次,将008表中的数据按Q列分拆到各工作表中,各表中提取的数据是008表中的指定几列数据,且每一次执行,将数据从各工作表有数据行的最后开始追加,现在需要提取的几列中,不需要E列,就注释掉,结果多次执行宏,就不能追加数据到各表中了。
image.jpg
分拆到表后应该是这样
image.png
现在不能追加后,第一列数据自动累加,而不是追加
image.png
arrA(rA, 5) = data(i, 3)      '这行代码一注释就不能追加数据
附件中的代码,员工医疗表中已经注释掉代码了,就不能追加数据了,其它表中没有注释这行代码,就可以追加。求大神指点一下,如何修改代码,不显示这列数据了(E列),原因是什么,因为以后还要调整008表数据的放置列位置和数量,和其他分拆表指定的列数据提取,知道原因以后才能改代码?
请各位大神指点一二。谢谢,



2023年发货明细表_-_测试beat0.16可追加.rar

66.46 KB, 下载次数: 10

TA的精华主题

TA的得分主题

发表于 2024-9-8 09:31 | 显示全部楼层

  1. Public Sub 发货明细表()
  2.     Dim data, wb1 As Workbook, ws As Worksheet, rngS As Range, rngE As Range, wb As Worksheet
  3.     Dim path$, dataFileName$, i&, j&, d$, k
  4.     Dim dic As New Dictionary, arrA(), arrB(), arrC(), r&, rA&, rB&, rC&, rS&, rE&, ID&
  5.    
  6. '    path = ThisWorkbook.path
  7. '    dataFileName = path & "\008.xlsx"
  8. '    Set wb = Workbooks.Open(dataFileName)
  9. '     Set wb = ThisWorkbook.Worksheets("Sheet13")
  10.      Set wb = Sheets("008")

  11.    
  12.    
  13.     '获取数据源
  14.      With wb
  15.         Set rngS = .Range("E1").End(xlDown)
  16.         Set rngE = .Range("Q1000").End(xlUp)
  17.         data = .Range(rngS, rngE).Value
  18.     End With
  19.    
  20.     ThisWorkbook.Activate
  21.    
  22.    
  23.     '提取页签名
  24.     For i = 2 To UBound(data)
  25.         If data(i, 5) <> "" Then
  26.             d = data(i, 13)           '按13列分类页标签,-----为何莫名其妙的弄个日期格式?已删掉了 format 命令
  27.             If Not dic.Exists(d) Then dic.Add d, ""
  28.         End If
  29.     Next i
  30.     Debug.Print dic.Count
  31.    
  32.    
  33.    
  34.     '判断页签是否存在,不存在则增加页签
  35.    
  36.     For Each k In dic.Keys      '页签循环
  37.         Set ws = Nothing
  38.         On Error Resume Next
  39.         Set ws = ThisWorkbook.Worksheets(k)     'Set ws = ThisWorkbook.Worksheets("表名")
  40.         On Error GoTo 0
  41.         If ws Is Nothing Then
  42.             Set ws = ThisWorkbook.Sheets.Add(before:=ThisWorkbook.Sheets(1))
  43.             ws.Name = k
  44.             '创建表头
  45.             ws.Range("A1:W1") = Array("编号", "收案日期", "员工编号", "姓名", "性别", "身份证号", "银行卡号", "治疗性质", "发票张数", "联系电话", "交接时间", "交接明细", "就诊医院", "申请金额", "社保金额", "自费金额", "可理算金额", "赔付金额", "实赔金额", "赔付时间", "理赔周期", "通知拒赔结果时间", "备注") '写入表头
  46.         End If
  47.     Next
  48.      
  49.      
  50.      '提取数据存入对应页签中写入表头
  51.    
  52.     Application.DisplayAlerts = False
  53.     For Each k In dic.Keys                      '按照字典内容逐项搜索
  54.         Debug.Print k
  55.         ReDim arrA(1 To UBound(data), 1 To 25)
  56.         ReDim arrB(1 To UBound(data), 1 To 5)
  57.         ReDim arrC(1 To UBound(data), 1 To 5)
  58.         rA = 1: rB = 1: rC = 1
  59.         For i = 1 To UBound(data)               '逐个检查数据源的每一条记录,是否符合字典项
  60.             If k = data(i, 13) Then             '分类列为13列
  61. '                    arrA(rA, 1) = rA            '编号    ------这一句要不要都无所谓,因为后面分表里的编号不是从这个数组里获取,而是程序根据记录数另外编号
  62.                     arrA(rA, 3) = data(i, 1)    '工号
  63. '                    arrA(rA, 5) = data(i, 3)    '医院等级 ------按照data(i,3)获取的是就诊日期而不是医院等级,也不应该存在arrA(rA,5)的位置,因为第5列分表里是性别列。
  64.                                                  '------注销这列造成arrA数组第5列无数据,后面填充分表会出现数据“原地踏步”现象
  65.                     arrA(rA, 8) = data(i, 2)    '疾病门诊   '前面rA,8中的8是显示表中的8列,i,2中是源表中的2列
  66.                     arrA(rA, 14) = data(i, 8)    '申请金额
  67.                     arrA(rA, 15) = data(i, 9)    '社保金额
  68.                     arrA(rA, 16) = data(i, 10)   '自费金额
  69.                     arrA(rA, 17) = data(i, 11)   '可理算金额'
  70.                     rA = rA + 1
  71.             End If
  72.         Next i
  73.         
  74.         
  75.         
  76.         '如果空表则从第6行开始写入,否则追加在后面
  77.         
  78.         With Sheets(k)
  79.         
  80.         
  81.         'E开始
  82.         r = .Range("N" & Rows.Count).End(xlUp).Row + 1  '----这一句获取分表E列的第一个空白行的行号,如果前面arrA(rA,5)注销了,那么E列为空,
  83.                                                         '----每次循环r都是从2开始,后果就是数据“原地踏步”,不会往下延伸。
  84.                                                         '----建议将此处的E列改为C列或N列(提倡N列,因为没有合并单元格会更好)
  85.         
  86.         If .Cells(r - 1, 1).MergeCells Then
  87.             Set Rng = .Cells(r - 1, 1).MergeArea
  88.             ID = Rng(1).Value   '----分表首次填充数据前,ID也就是编号为0,填完分表后,这里就是1开头的编号了。
  89.                                 '----如果后续多次运行程序,而数据又出现“原地踏步”的情形,每运行一次程序,这里的起始编号就会连续加1一次。
  90.                                 '----“原地踏步”的原因前面已经说过了,就是E列被注销,arrA里的第5列没数据造成的
  91.                                 '----“原地踏步”导致没一次运行程序都反复在A2单元格获取起始编号,导致累加现象。
  92.         Else
  93.             ID = .Cells(r, 1)    'ID=.Cells(r-1,1)  r-1为从第4行开始显示
  94.         End If

  95.         .Range("A" & r).Resize(UBound(arrA), 25) = arrA    '13 定义arrA数组列数  ,A为显示列也是计数列,不能改
  96.         rS = r: rE = r
  97.         
  98.         For i = 2 To rA
  99.             '对员工编号连续相同的情况进行合并处理
  100.             If arrA(i, 3) = arrA(i - 1, 3) Then
  101.                 rE = rE + 1
  102.             Else
  103.                 If rE <> rS Then
  104.                     .Range(.Cells(rS, 1), .Cells(rE, 1)).Merge  '合并编号
  105.                     .Range(.Cells(rS, 2), .Cells(rE, 2)).Merge  '合并收案日期
  106.                     .Range(.Cells(rS, 3), .Cells(rE, 3)).Merge  '合并员工编号----以此类推,后面的姓名列性别列等都可合并。但合并单元格对数据处理有弊无利,不提倡!
  107.                 End If
  108.                 .Cells(rS, 1) = ID + 1                          '填写编号(序号)列
  109.                 rS = rE + 1: rE = rS: ID = ID + 1               '位置指针移动到下一条记录
  110.             End If
  111.         Next i
  112.         End With
  113.     Next k
  114.     Application.DisplayAlerts = True
  115.     Debug.Print UBound(data)
  116.    
  117. End Sub
复制代码

拆数据填充分表.zip

58.59 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2024-9-8 09:37 | 显示全部楼层
改代码的时候,有点感想:
1.这个代码真垃圾!
2.可以看出贴主是个初学者,对原来的代码的内在逻辑没弄清楚,随便点缝缝补补,所以出了错误也找不到原因。
3.Excel做数据处理最讨厌合并单元格,吃力还不讨好,自找麻烦,让人深恶痛绝的陋习!

TA的精华主题

TA的得分主题

发表于 2024-9-8 09:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

  1. Public Sub 发货明细表()
  2.     Dim data, wb1 As Workbook, ws As Worksheet, rngS As Range, rngE As Range, wb As Worksheet
  3.     Dim path$, dataFileName$, i&, j&, d$, k
  4.     Dim dic As New Dictionary, arrA(),  r&, rA&,  rS&, rE&, ID&
  5.    
  6. '    path = ThisWorkbook.path
  7. '    dataFileName = path & "\008.xlsx"
  8. '    Set wb = Workbooks.Open(dataFileName)
  9. '     Set wb = ThisWorkbook.Worksheets("Sheet13")
  10.      Set wb = Sheets("008")

  11.    
  12.    
  13.     '获取数据源
  14.      With wb
  15.         Set rngS = .Range("E1").End(xlDown)
  16.         Set rngE = .Range("Q1000").End(xlUp)
  17.         data = .Range(rngS, rngE).Value
  18.     End With
  19.    
  20.     ThisWorkbook.Activate
  21.    
  22.    
  23.     '提取页签名
  24.     For i = 2 To UBound(data)
  25.         If data(i, 5) <> "" Then
  26.             d = data(i, 13)           '按13列分类页标签,-----为何莫名其妙的弄个日期格式?已删掉了 format 命令
  27.             If Not dic.Exists(d) Then dic.Add d, ""
  28.         End If
  29.     Next i
  30.     Debug.Print dic.Count
  31.    
  32.    
  33.    
  34.     '判断页签是否存在,不存在则增加页签
  35.    
  36.     For Each k In dic.Keys      '页签循环
  37.         Set ws = Nothing
  38.         On Error Resume Next
  39.         Set ws = ThisWorkbook.Worksheets(k)     'Set ws = ThisWorkbook.Worksheets("表名")
  40.         On Error GoTo 0
  41.         If ws Is Nothing Then
  42.             Set ws = ThisWorkbook.Sheets.Add(before:=ThisWorkbook.Sheets(1))
  43.             ws.Name = k
  44.             '创建表头
  45.             ws.Range("A1:W1") = Array("编号", "收案日期", "员工编号", "姓名", "性别", "身份证号", "银行卡号", "治疗性质", "发票张数", "联系电话", "交接时间", "交接明细", "就诊医院", "申请金额", "社保金额", "自费金额", "可理算金额", "赔付金额", "实赔金额", "赔付时间", "理赔周期", "通知拒赔结果时间", "备注") '写入表头
  46.         End If
  47.     Next
  48.      
  49.      
  50.      '提取数据存入对应页签中写入表头
  51.    
  52.     Application.DisplayAlerts = False
  53.     For Each k In dic.Keys                      '按照字典内容逐项搜索
  54.         Debug.Print k
  55.         ReDim arrA(1 To UBound(data), 1 To 25)
  56.          rA = 1
  57.         For i = 1 To UBound(data)               '逐个检查数据源的每一条记录,是否符合字典项
  58.             If k = data(i, 13) Then             '分类列为13列
  59. '                    arrA(rA, 1) = rA            '编号    ------这一句要不要都无所谓,因为后面分表里的编号不是从这个数组里获取,而是程序根据记录数另外编号
  60.                     arrA(rA, 3) = data(i, 1)    '工号
  61. '                    arrA(rA, 5) = data(i, 3)    '医院等级 ------按照data(i,3)获取的是就诊日期而不是医院等级,也不应该存在arrA(rA,5)的位置,因为第5列分表里是性别列。
  62.                                                  '------注销这列造成arrA数组第5列无数据,后面填充分表会出现数据“原地踏步”现象
  63.                     arrA(rA, 8) = data(i, 2)    '疾病门诊   '前面rA,8中的8是显示表中的8列,i,2中是源表中的2列
  64.                     arrA(rA, 14) = data(i, 8)    '申请金额
  65.                     arrA(rA, 15) = data(i, 9)    '社保金额
  66.                     arrA(rA, 16) = data(i, 10)   '自费金额
  67.                     arrA(rA, 17) = data(i, 11)   '可理算金额'
  68.                     rA = rA + 1
  69.             End If
  70.         Next i
  71.         
  72.         
  73.         
  74.         '如果空表则从第6行开始写入,否则追加在后面
  75.         
  76.         With Sheets(k)
  77.         
  78.         
  79.         'E开始
  80.         r = .Range("N" & Rows.Count).End(xlUp).Row + 1  '----这一句获取分表E列的第一个空白行的行号,如果前面arrA(rA,5)注销了,那么E列为空,
  81.                                                         '----每次循环r都是从2开始,后果就是数据“原地踏步”,不会往下延伸。
  82.                                                         '----建议将此处的E列改为C列或N列(提倡N列,因为没有合并单元格会更好)
  83.         
  84.         If .Cells(r - 1, 1).MergeCells Then
  85.             Set Rng = .Cells(r - 1, 1).MergeArea
  86.             ID = Rng(1).Value   '----分表首次填充数据前,ID也就是编号为0,填完分表后,这里就是1开头的编号了。
  87.                                 '----如果后续多次运行程序,而数据又出现“原地踏步”的情形,每运行一次程序,这里的起始编号就会连续加1一次。
  88.                                 '----“原地踏步”的原因前面已经说过了,就是E列被注销,arrA里的第5列没数据造成的
  89.                                 '----“原地踏步”导致没一次运行程序都反复在A2单元格获取起始编号,导致累加现象。
  90.         Else
  91.             ID = .Cells(r, 1)    'ID=.Cells(r-1,1)  r-1为从第4行开始显示
  92.         End If

  93.         .Range("A" & r).Resize(UBound(arrA), 25) = arrA    '13 定义arrA数组列数  ,A为显示列也是计数列,不能改
  94.         rS = r: rE = r
  95.         
  96.         For i = 2 To rA
  97.             '对员工编号连续相同的情况进行合并处理
  98.             If arrA(i, 3) = arrA(i - 1, 3) Then
  99.                 rE = rE + 1
  100.             Else
  101.                 If rE <> rS Then
  102.                     .Range(.Cells(rS, 1), .Cells(rE, 1)).Merge  '合并编号
  103.                     .Range(.Cells(rS, 2), .Cells(rE, 2)).Merge  '合并收案日期
  104.                     .Range(.Cells(rS, 3), .Cells(rE, 3)).Merge  '合并员工编号----以此类推,后面的姓名列性别列等都可合并。但合并单元格对数据处理有弊无利,不提倡!
  105.                 End If
  106.                 .Cells(rS, 1) = ID + 1                          '填写编号(序号)列
  107.                 rS = rE + 1: rE = rS: ID = ID + 1               '位置指针移动到下一条记录
  108.             End If
  109.         Next i
  110.         End With
  111.     Next k
  112.     Application.DisplayAlerts = True
  113.     Debug.Print UBound(data)
  114.    
  115. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-9-8 09:51 | 显示全部楼层
  1. Sub test()
  2.     Dim r%, i%
  3.     Dim arr, brr
  4.     Dim ws As Worksheet
  5.     Dim d As Object
  6.     Set d = CreateObject("scripting.dictionary")
  7.     With Worksheets("008")
  8.         r = .Cells(.Rows.Count, 5).End(xlUp).Row
  9.         arr = .Range("e3:q" & r)
  10.         For i = 1 To UBound(arr)
  11.             If Not d.Exists(arr(i, 13)) Then
  12.                 Set d(arr(i, 13)) = CreateObject("scripting.dictionary")
  13.             End If
  14.             d(arr(i, 13))(i) = Empty
  15.         Next
  16.     End With
  17.     For Each aa In d.Keys
  18.         ReDim brr(1 To d(aa).Count, 1 To 23)
  19.         m = 0
  20.         For Each bb In d(aa).Keys
  21.             m = m + 1
  22.             brr(m, 3) = arr(bb, 1)
  23.             brr(m, 8) = arr(bb, 2)
  24.             brr(m, 11) = arr(bb, 3)
  25.             brr(m, 13) = arr(bb, 4)
  26.             brr(m, 14) = arr(bb, 8)
  27.             brr(m, 15) = arr(bb, 9)
  28.             brr(m, 16) = arr(bb, 10)
  29.             brr(m, 17) = arr(bb, 11)
  30.         Next
  31.         On Error Resume Next
  32.         Set ws = Worksheets(aa)
  33.         If Err Then
  34.             Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count))
  35.             With ws
  36.                 .Name = aa
  37.                 .Range("a1:w1") = Array("编号", "收案日期", "员工编号", "姓名", "性别", "身份证号", "银行卡号", "治疗性质", "发票张数", "联系电话", "交接时间", "交接明细", "就诊医院", "申请金额", "社保金额", "自费金额", "可理算金额", "赔付金额", "实赔金额", "赔付时间", "理赔周期", "通知拒赔结果时间", "备注")
  38.             End With
  39.         End If
  40.         On Error GoTo 0
  41.         With ws
  42.             r = .Cells(.Rows.Count, 3).End(xlUp).Row
  43.             .Cells(r + 1, 1).Resize(m, UBound(brr, 2)) = brr
  44.         End With
  45.     Next
  46. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-9-8 09:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼主的代码没法修改,重新写了一段供参考。

2023年发货明细表_-_测试beat0.16可追加.rar

67.86 KB, 下载次数: 12

TA的精华主题

TA的得分主题

发表于 2024-9-8 11:51 | 显示全部楼层
为何发的回复迟迟不显示?要审核几个小时么?
注销arrA(rA,5)的影响.png
编号累加而不是追加的原因.png
合并单元格是陋习.png

TA的精华主题

TA的得分主题

发表于 2024-9-8 12:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
再发一次.............

拆数据填充分表.rar

56.24 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2024-9-8 14:58 | 显示全部楼层
chxw68 发表于 2024-9-8 09:52
楼主的代码没法修改,重新写了一段供参考。

热心的老师,每次发的都是精品。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-9 21:11 | 显示全部楼层
感谢各位大神们的无私帮助。谢谢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 22:35 , Processed in 0.041153 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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