ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用VBA做固定合同模板分发

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-7-7 19:26 | 显示全部楼层
优化一下代码,改用一个字典。

购销合同模板分发.zip

88.05 KB, 下载次数: 21

TA的精华主题

TA的得分主题

发表于 2024-7-7 19:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
代码优化,改用一个字典。

  1. Sub ykcbf()   '//2024.7.7  总表按模板拆分为多表
  2.     Application.ScreenUpdating = False
  3.     Application.DisplayAlerts = False
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     For Each sht In Sheets
  6.         If InStr("基础数据源|加工合同模板", sht.Name) = 0 Then sht.Delete
  7.     Next
  8.     With Sheets("基础数据源")
  9.         r = .Cells(Rows.Count, 6).End(3).Row
  10.         arr = .[a1].Resize(r, 16)
  11.     End With
  12.     For i = 5 To UBound(arr)
  13.         If arr(i, 2) = Empty Then arr(i, 2) = arr(i - 1, 2)
  14.         s = arr(i, 2)
  15.         If Not d.exists(s) Then Set d(s) = CreateObject("Scripting.Dictionary")
  16.         d(s)(i) = i
  17.     Next
  18.     On Error Resume Next
  19.     For Each k In d.keys
  20.         Sheets("加工合同模板").Copy After:=Sheets(Sheets.Count)
  21.         Set sht = Sheets(Sheets.Count)
  22.         m = 0
  23.         With sht
  24.             .[l2] = k
  25.             ReDim brr(1 To 20, 1 To 20)
  26.             For Each kk In d(k).keys
  27.                 m = m + 1
  28.                 If m = 1 Then
  29.                     .Name = arr(kk, 5)
  30.                     .[b6] = arr(kk, 5)
  31.                     .[b7] = arr(kk, 3)
  32.                     .[b8] = arr(kk, 4)
  33.                 End If
  34.                 For j = 6 To UBound(arr)
  35.                     brr(m, j - 5) = arr(kk, j)
  36.                 Next
  37.             Next
  38.             .[a13].Resize(20, 11) = brr
  39.         End With
  40.     Next
  41.     Sheets("基础数据源").Activate
  42.     Application.ScreenUpdating = True
  43.     MsgBox "OK!"
  44. End Sub
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-7-7 22:59 | 显示全部楼层
  1. Sub main()

  2.     Dim source_arr, temp_arr, ws_name_arr
  3.     Dim cnt%, i%, j%, k%, ws_cnt%, end_row%
  4.     Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
  5.    
  6.     Set ws1 = Worksheets("基础数据源")
  7.     Set ws2 = Worksheets("加工合同模板")
  8.    
  9.    
  10.     ' 读取数据源
  11.     end_row = ws1.Range("P66356").End(xlUp).Row
  12.     source_arr = ws1.Range("A5:P" & end_row)
  13.    
  14.     ' 在合同模板中写入基础信息
  15.     For i = 1 To UBound(source_arr)
  16.         ' 将合同另存为新sheet,并改名为受托方
  17.         ws2.Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
  18.         Set ws3 = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
  19.         
  20.         ' 统计内容的行数
  21.         cnt = 0
  22.         For j = i To UBound(source_arr)
  23.             cnt = cnt + 1
  24.             If j = end_row - 4 Then
  25.                 Exit For
  26.             Else
  27.                 If Len(source_arr(i + cnt, 2)) Then
  28.                     Exit For
  29.                 End If
  30.             End If
  31.         Next j
  32.         
  33.         With ws3
  34.             .Cells(2, "L") = source_arr(i, 2)       ' 合同号
  35.             .Cells(6, "B") = source_arr(i, 5)       ' 受托方
  36.             .Cells(7, "B") = source_arr(i, 3)       ' 地址
  37.             .Cells(8, "B") = source_arr(i, 4)       ' 电话
  38.             
  39.             ' 判断合同模板的数据行数是否足够
  40.             If cnt > 20 Then
  41.                 For j = 1 To cnt - 20
  42.                     .Rows(32).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
  43.                 Next j
  44.             End If
  45.             
  46.             ' 将该合同号下的数据写入temp_arr
  47.             ReDim temp_arr(1 To cnt, 1 To 11)
  48.             k = 1
  49.             Do While k <= cnt
  50.                 For j = 1 To 11
  51.                     temp_arr(k, j) = source_arr(i, j + 5)
  52.                 Next j
  53.                 i = i + 1
  54.                 k = k + 1
  55.             Loop
  56.             ' 将temp_arr写入合同的数据区域
  57.             .Cells(13, "A").Resize(UBound(temp_arr, 1), UBound(temp_arr, 2)) = temp_arr
  58.             
  59.             ' 修改sheet名
  60.             ws_cnt = ws_cnt + 1
  61.             ws3.Name = ws_cnt & "_" & ws3.Cells(6, "B")
  62.         End With
  63.         
  64.         i = i - 1
  65.         
  66.     Next i
  67.    
  68.    
  69. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-22 12:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
各位老师:其实我自己很想学VBA,但是这么多年了,资料买了不少,VBA还是不会写,每一次只能厚着脸皮寻求您们的帮助,再次感谢您们!

TA的精华主题

TA的得分主题

发表于 2024-7-22 16:41 | 显示全部楼层
chenyun1234 发表于 2024-7-22 12:25
各位老师:其实我自己很想学VBA,但是这么多年了,资料买了不少,VBA还是不会写,每一次只能厚着脸皮寻求您 ...

学VBA是个知识积累的过程,而且,要多动手写代码,在写代码的过程中再去针对性学习相关的知识。多看老师们的代码并努力理解之,这是一个捷径。写代码就是一个解题的过程,思路很重要。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-7-22 17:37 | 显示全部楼层
练练手。。。

购销合同模板分发.rar

83.37 KB, 下载次数: 11

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

本版积分规则

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

GMT+8, 2024-11-18 04:23 , Processed in 0.044969 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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