设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2251|回复: 2
打印 上一主题 下一主题

急救!!! VBA 批量导入和批量导出标准表格

[复制链接]
跳转到指定楼层
1#
发表于 2016-9-4 19:21:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位高手:
    最近手上有几千行数据(见索赔明细),每一行代表对一个供应商的索赔信息(包括供应商名称、原始金额、供应商名称、索赔单编号、索赔产品、数量、发生月份等),需要将索赔明细中每一行的信息对应复制黏贴到标准表格对应的阴影区域,由于数据量太大。而且是重复的动作,不知道可以用VBA实现吗?急用,万分感谢
    其中标准表格中阴影区域的数据来源如下:
    GX2016090476 来源于 索赔明细中 索赔单编号
    2016-9-2     来源于 索赔明细中  制单日期
   黎明液压有限公司  来源于 索赔明细中 供应商名称
    蒋经理  来源于 标准通讯录中 黎明液压有限公司对应的联系人,如果标准通讯录中未找到该供应商名称,那么联系人、电话、传真均空白,其他工作继续进行
      3775893399     来源于 标准通讯录中蒋经理对应电话
       7732760       来源于 标准通讯录中蒋经理对应传真,如没有就空着
     过滤器  来源于  索赔明细中 索赔产品
         13  来源于  索赔明细中 数量
    2016年8月  来源于 索赔明细中 发生月份
    230  来源于   索赔明细中    原始金额
  269.1  来源于    索赔明细中  索赔单金额

     希望将每一行转化为索赔单之后,另存为excel表,保存在桌面上“索赔单”文件夹,且表格的名字命名方式为:索赔单编号后六位数字+供应商名称,本例子最后生成的excel名称应为“090476黎明液压有限公司”。     

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
发表于 2017-1-20 02:11:51 | 只看该作者
请测试一下!
3分半,生成200份索赔单,个人觉得不太满意
  1. Sub autoT()
  2. Application.ScreenUpdating = False

  3.     Dim arr, brr, Mxi, Tongx, t, i&, j%, k%, a, b, facN
  4.     Dim wb As Workbook, wk As Workbook
  5.     Dim sh As Worksheet, ipath
  6.     t = Timer
  7.     ipath = ThisWorkbook.Path & "\索赔单"
  8.     Set Mxi = CreateObject("scripting.dictionary")
  9.     Set Tongx = CreateObject("scripting.dictionary")
  10.     arr = Array("J4", "D5", "C17", "A17", "c4", "D8", "J8", "H10", "D10", "J10", "I21")
  11.     brr = Array("I6", "J6", "I7")
  12.     '清空标准表单
  13.     For i = 0 To UBound(arr)
  14.         Range(arr(i)) = ""
  15.     Next
  16.     For i = 0 To UBound(brr)
  17.         Range(brr(i)) = ""
  18.     Next
  19.     Set wb = Workbooks.Open(ThisWorkbook.Path & "\索赔明细.xlsx")
  20.     '    wb.Sheet1.Activate
  21.         With ActiveSheet
  22.         a = .Range("A2:I" & .[a1].End(4).Row)
  23.         For i = 1 To UBound(a)
  24.             For j = 2 To 9
  25.                 Mxi(a(i, 1)) = Mxi(a(i, 1)) & a(i, j) & vbTab
  26.             Next
  27.         Next
  28.         End With
  29.         Erase a: wb.Close False: i = 1
  30.         Set wb = Nothing
  31. '
  32. '        '按Mxi序号批量建立sheets
  33. '        For i = 1 To Mxi.Count
  34. '            If TypeName(Application.Evaluate("(" & i & ")!A1")) = "Error" Then
  35. '                Sheets("标准").Copy after:=Worksheets(Worksheets.Count)
  36. '                With ActiveSheet
  37. '                    .Name = "(" & i & ")"
  38. '                End With
  39. '            End If
  40. '        Next
  41.         
  42.     Set wb = Workbooks.Open(ThisWorkbook.Path & "\标准通讯录.xls")
  43.         With ActiveSheet
  44.             a = .Range("D2:G" & .[d2].End(4).Row)
  45.             For i = 1 To UBound(a)
  46.                 Tongx(a(i, 1)) = a(i, 2) & vbTab & a(i, 3) & vbTab & a(i, 4)
  47.             Next
  48.         End With
  49.         Erase a: wb.Close False
  50.         Set wb = Nothing
  51.    
  52.     For i = 1 To Mxi.Count
  53.         a = Split(Mxi(i), vbTab)
  54.         With ActiveSheet
  55.             For k = 0 To UBound(arr) Step 1
  56.                 If k <= 7 Then
  57.                     .Range(arr(k)) = a(k)
  58.                 End If
  59.                 If k = 8 Then .Range(arr(k)) = a(5)
  60.                 If k = 9 Then .Range(arr(k)) = a(6)
  61.                 If k = 10 Then .Range(arr(k)) = a(2)
  62.             Next
  63.             formN = Right(a(4), 6)
  64.             Erase a
  65.             facN = .Range(arr(1))
  66.             b = Split(Tongx(facN), vbTab)
  67.             For j = 0 To UBound(brr)
  68.                 .Range(brr(j)) = "" & b(j)
  69.             Next
  70.             Erase b
  71.             fname = formN & facN
  72.             Set wk = Workbooks.Add
  73.              .Copy before:=wk.Worksheets("sheet1")

  74.             For Each sh In wk.Worksheets
  75.                  If sh.Name Like "*Sheet*" Then
  76.                     Application.DisplayAlerts = False
  77.                     sh.Delete
  78.                     Application.DisplayAlerts = True
  79.                  End If
  80.             Next sh
  81.             wk.SaveAs ipath & fname & ".xls"
  82.             wk.Close
  83.         End With
  84.     Next
  85. Application.ScreenUpdating = True
  86. MsgBox "成功生成 " & Mxi.Count & " 份索赔单,耗时 " & Format(Timer - t, "0.000") & " 秒!"
  87. End Sub
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
3#
发表于 2017-1-20 09:12:41 | 只看该作者
本帖最后由 yayahzmeng 于 2017-1-20 15:30 编辑

昨晚居然没有发成功,请测试一下
  1. Sub autoT()
  2. Application.ScreenUpdating = False

  3.     Dim arr, brr, Mxi, Tongx, t, i&, j%, k%, a, b, facN
  4.     Dim wb As Workbook, wk As Workbook
  5.     Dim sh As Worksheet, ipath
  6.     t = Timer
  7.     ipath = ThisWorkbook.Path & "\索赔单"
  8.     Set Mxi = CreateObject("scripting.dictionary")
  9.     Set Tongx = CreateObject("scripting.dictionary")
  10.     arr = Array("J4", "D5", "C17", "A17", "c4", "D8", "J8", "H10", "D10", "J10", "I21")
  11.     brr = Array("I6", "J6", "I7")
  12.     '清空标准表单
  13.     For i = 0 To UBound(arr)
  14.         Range(arr(i)) = ""
  15.     Next
  16.     For i = 0 To UBound(brr)
  17.         Range(brr(i)) = ""
  18.     Next
  19.     Set wb = Workbooks.Open(ThisWorkbook.Path & "\索赔明细.xlsx")

  20.         With ActiveSheet
  21.         a = .Range("A2:I" & .[a1].End(4).Row)
  22.         For i = 1 To UBound(a)
  23.             For j = 2 To 9
  24.                 Mxi(a(i, 1)) = Mxi(a(i, 1)) & a(i, j) & vbTab
  25.             Next
  26.         Next
  27.         End With
  28.         Erase a: wb.Close False: i = 1
  29.         Set wb = Nothing
  30.         
  31.     Set wb = Workbooks.Open(ThisWorkbook.Path & "\标准通讯录.xls")
  32.         With ActiveSheet
  33.             a = .Range("D2:G" & .[d2].End(4).Row)
  34.             For i = 1 To UBound(a)
  35.                 Tongx(a(i, 1)) = a(i, 2) & vbTab & a(i, 3) & vbTab & a(i, 4)
  36.             Next
  37.         End With
  38.         Erase a: wb.Close False
  39.         Set wb = Nothing
  40.    
  41.     For i = 1 To Mxi.Count
  42.         a = Split(Mxi(i), vbTab)
  43.         With ActiveSheet
  44.             For k = 0 To UBound(arr) Step 1
  45.                 If k <= 7 Then
  46.                     .Range(arr(k)) = a(k)
  47.                 End If
  48.                 If k = 8 Then .Range(arr(k)) = a(5)
  49.                 If k = 9 Then .Range(arr(k)) = a(6)
  50.                 If k = 10 Then .Range(arr(k)) = a(2)
  51.             Next
  52.             formN = Right(a(4), 6)
  53.             Erase a
  54.             facN = .Range(arr(1))
  55.             b = Split(Tongx(facN), vbTab)
  56.             For j = 0 To UBound(brr)
  57.                 .Range(brr(j)) = "" & b(j)
  58.             Next
  59.             Erase b
  60.             fname = formN & facN
  61.             Set wk = Workbooks.Add
  62.              .Copy before:=wk.Worksheets("sheet1")

  63.             For Each sh In wk.Worksheets
  64.                  If sh.Name Like "*Sheet*" Then
  65.                     Application.DisplayAlerts = False
  66.                     sh.Delete
  67.                     Application.DisplayAlerts = True
  68.                  End If
  69.             Next sh
  70.             wk.SaveAs ipath & fname & ".xls"
  71.             wk.Close
  72.         End With
  73.     Next
  74. Application.ScreenUpdating = True
  75. MsgBox "成功生成 " & Mxi.Count & " 份索赔单,耗时 " & Format(Timer - t, "0.000") & " 秒!"
  76. End Sub
复制代码


打开“标准表格.xlsm”,ctrl + p
测试了一下,900秒生成4000份,个人觉得速度不太令人满意,不知道其它大神有没有更快的保存工作簿的代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

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

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-16 23:55 , Processed in 0.095965 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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