ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 从总表提取指定数据到固定的模板

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-26 19:24 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
从总表按派车单号为维度,提取(装货时间/提运单号/货物总件数/货物总毛重/载货清单号/大陆车牌/集装箱编号/商品项简要描述/货物价值/币种/发货人名称)到模板表后另存为新的表,按车次号命名


因为总表是每天都有1个新的表,代码希望是适用于同样格式的表都能运行,其次表里面的车次会不断新增,希望导出的时候能自由选择导出1车或多车,求教各位大神~

数据20240426.zip

105.27 KB, 下载次数: 35

TA的精华主题

TA的得分主题

发表于 2024-4-27 10:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test0() '算是回复另帖追问……
  2.   Dim strPath As String, strFile As String, max_ As Long
  3.   
  4.   max_ = Val(InputBox("请输入 车次", "输入提示:", 5))
  5.   If max_ = 0 Then Exit Sub
  6.   
  7.   strPath = ThisWorkbook.Path & "\"
  8.   strFile = strPath & "空白模板.xlsx"
  9.   If Dir(strFile) = "" Then MsgBox "!", 64: Exit Sub
  10.   
  11.   strPath = strPath & "Results" & "\"
  12.   If Dir(strPath, vbDirectory) = "" Then MkDir strPath
  13.   
  14.   DoApp False
  15.   
  16.   Dim results, data, dict As Object
  17.   Dim wkb As Workbook, wks As Worksheet
  18.   Dim i As Long, j As Long, k As Long, x As Long, y As Long
  19.   Dim cnt As Long, pos As Long
  20.   
  21.   Set dict = CreateObject("Scripting.Dictionary")
  22.   With Sheet1
  23.     data = .Range("A1", .Range("A1").CurrentRegion.Offset(1)).Value
  24.   End With
  25.   For j = 1 To UBound(data, 2)
  26.     If Not dict.Exists(data(1, j)) Then dict.Add data(1, j), j
  27.   Next
  28.   x = dict("车次")
  29.   
  30.   Set wkb = Workbooks.Open(strFile, 0)
  31.   Set wks = wkb.Worksheets(1)
  32.   results = wks.UsedRange.Resize(1000, 10).Value
  33.   ActiveWindow.WindowState = xlMinimized
  34.   
  35.   For y = 2 To UBound(data) - 1
  36.     If Val(data(y, x)) Then
  37.       cnt = 6
  38.       pos = y
  39.       For i = 2 To 3
  40.         For j = 1 To 3 Step 2
  41.           results(i, j + 1) = Trim(data(y, dict(Replace(results(i, j), ":", ""))))
  42.         Next
  43.       Next
  44.     End If
  45.     cnt = cnt + 1
  46.     For j = 1 To UBound(results, 2)
  47.       If dict.Exists(results(6, j)) Then
  48.         results(cnt, j) = data(y, dict(results(6, j)))
  49.       End If
  50.     Next
  51.     If Val(data(y + 1, x)) Or (y + 1) = UBound(data) Then
  52.       wks.Copy
  53.       With ActiveWorkbook
  54.         With .Worksheets(1)
  55.           .Range("A1").Resize(cnt, UBound(results, 2)) = results
  56.           .UsedRange.Offset(cnt).Clear
  57.         End With
  58.         .SaveAs strPath & Format(data(pos, x), "第0车"), 51
  59.         .Close
  60.       End With
  61.       k = k + 1
  62.       If k = max_ Then Exit For
  63.     End If
  64.   Next
  65.   
  66.   Set dict = Nothing
  67.   Set wks = Nothing
  68.   wkb.Close False
  69.   Set wkb = Nothing
  70.   DoApp
  71.   Beep
  72. End Sub

  73. Function DoApp(Optional b As Boolean = True)
  74.   With Application
  75.     .ScreenUpdating = b
  76.     .DisplayAlerts = b
  77.     .Calculation = -b * 30 - 4135
  78.   End With
  79. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-27 14:47 | 显示全部楼层

大神,还是要把数据复制到这个总表才能运行,在其他同格式的表里面运行不了vba,选择车次的时候可以比如输入2就导出第2车,输入2-5,就把(2.3.4.5)导出,输入2,5(就把第2.第5)导出,这样可以实现吗

TA的精华主题

TA的得分主题

发表于 2024-4-27 16:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
SZ@HK123 发表于 2024-4-27 14:47
大神,还是要把数据复制到这个总表才能运行,在其他同格式的表里面运行不了vba,选择车次的时候可以比如 ...
  1. Sub test0() ' ……
  2.   Dim strPath As String, strFile As String, str_ As String
  3.   Dim i As Long, j As Long, k As Long, x As Long, y As Long
  4.   Dim ar, br, cr() As Long, dict As Object
  5.   
  6.   Set dict = CreateObject("Scripting.Dictionary")
  7.   
  8.   str_ = InputBox("请输入 车次", "输入提示:", "2-5,3,6-7,10,12")
  9.   If Len(str_) Then
  10.     ar = Split(str_, ",")
  11.     For i = 0 To UBound(ar)
  12.       br = Split(ar(i), "-")
  13.       For j = 0 To UBound(br)
  14.         If Not dict.Exists(Val(br(j))) Then dict.Add Val(br(j)), ""
  15.       Next
  16.     Next
  17.   Else
  18.     MsgBox "未指定车次!", 64: Exit Sub
  19.   End If
  20.   
  21.   strPath = ThisWorkbook.Path & "\"
  22.   strFile = strPath & "空白模板.xlsx"
  23.   If Dir(strFile) = "" Then MsgBox "!", 64: Exit Sub
  24.   
  25.   DoApp False
  26.   
  27.   strPath = strPath & "Results" & "\"
  28.   If Dir(strPath, vbDirectory) = "" Then MkDir strPath
  29.   
  30.   Dim results, data, Flag As Boolean
  31.   Dim wkb As Workbook, wks As Worksheet, name_ As Name
  32.   Dim cnt As Long, pos As Long
  33.   
  34.   With ActiveSheet
  35.     data = .Range("A1", .Range("A1").CurrentRegion.Offset(1)).Value
  36.   End With
  37.   For j = 1 To UBound(data, 2)
  38.     If Not dict.Exists(data(1, j)) Then dict.Add data(1, j), j
  39.   Next
  40.   x = dict("车次")
  41.   data(UBound(data), x) = 10 ^ 7
  42.   
  43.   Set wkb = Workbooks.Open(strFile, 0)
  44.   Set wks = wkb.Worksheets(1)
  45.   results = wks.UsedRange.Resize(1000, 10).Value
  46.   ActiveWindow.WindowState = xlMinimized
  47.   
  48.   For j = 1 To UBound(results, 2)
  49.     If dict.Exists(results(6, j)) Then
  50.       k = k + 1
  51.       ReDim Preserve cr(1, 1 To k)
  52.       cr(0, k) = j
  53.       cr(1, k) = dict(results(6, j))
  54.     End If
  55.   Next
  56.   
  57.   For y = 2 To UBound(data) - 1
  58.     If Val(data(y, x)) Then
  59.       Flag = dict.Exists(Val(data(y, x)))
  60.       If Flag Then
  61.         cnt = 6
  62.         pos = y
  63.         For i = 2 To 3
  64.           For j = 1 To 3 Step 2
  65.             results(i, j + 1) = Trim(data(y, dict(Replace(results(i, j), ":", ""))))
  66.           Next
  67.         Next
  68.       End If
  69.     End If
  70.     If Flag Then
  71.       cnt = cnt + 1
  72.       For j = LBound(cr, 2) To UBound(cr, 2)
  73.         results(cnt, cr(0, j)) = data(y, cr(1, j))
  74.       Next
  75.       If Val(data(y + 1, x)) Then
  76.         wks.Copy
  77.         With ActiveWorkbook
  78.           With .Worksheets(1)
  79.             .Range("A1").Resize(cnt, UBound(results, 2)) = results
  80.             .UsedRange.Offset(cnt).Clear
  81.           End With
  82.           For Each name_ In .Names
  83.             name_.Delete
  84.           Next
  85.           .SaveAs strPath & Format(data(pos, x), "第0车"), 51
  86.           .Close
  87.         End With
  88.         Flag = Not Flag
  89.       End If
  90.     End If
  91.   Next
  92.   
  93.   Set dict = Nothing
  94.   Set wks = Nothing
  95.   wkb.Close False
  96.   Set wkb = Nothing
  97.   DoApp
  98.   Beep
  99. End Sub

  100. Function DoApp(Optional b As Boolean = True)
  101.   With Application
  102.     .ScreenUpdating = b
  103.     .DisplayAlerts = b
  104.     .Calculation = -b * 30 - 4135
  105.   End With
  106. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-28 15:24 | 显示全部楼层

image.png


大神,太厉害了,可以自由选择自己需要的车次了,但这个报错是什么异常,把代码新建在一个空白的excle表,然后打开同格式的总表操作时报错

TA的精华主题

TA的得分主题

发表于 2024-4-28 15:43 | 显示全部楼层
本帖最后由 baofa2 于 2024-4-28 16:31 编辑
SZ@HK123 发表于 2024-4-28 15:24
大神,太厉害了,可以自由选择自己需要的车次了,但这个报错是什么异常,把代码新建在一个空白 ...

最好是给出错的附件
可能是标题字段不统一,其中一个多了冒号(已作处理),还有可能是多了其它的字符


'补充一下, 可以改这样,不会出错;但模板中字段与总表不一致,导出就不完整……
If dict.Exists(results(i, j)) Then results(i, j + 1) = Trim(data(y, dict(results(i, j))))


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-28 18:21 | 显示全部楼层
baofa2 发表于 2024-4-28 15:43
最好是给出错的附件
可能是标题字段不统一,其中一个多了冒号(已作处理),还有可能是多了其它的字符
...

好的,了解,我试试,感谢解答

TA的精华主题

TA的得分主题

发表于 2024-4-28 18:29 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-3 11:05 , Processed in 0.040562 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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