Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1922|回复: 5

[已解决]想各位帮忙一下!

[复制链接]
发表于 2013-7-5 14:29 | 显示全部楼层 |阅读模式
各位大大,我刚开始学VBA,我工作的时候有两个表,分别是“购销-吉之岛”和“代销-吉之岛”,里面分别是不同店号的金额。我想用VBA做到以下效果:
1、以不同店号批量新建工作表,每个店分别是以“购销-店号”及“代销-店号”为表名;
2、然后将“购销-吉之岛”、“代销-吉之岛”的数据分别复制到“购销-店号”、“代销-店号”的表中;
3、最后将相同店号的购销和代销两个表合成一个工作薄。

恳请各位大大的帮忙,帮我在表中录制宏或者给我一些教材,谢谢了!!!
最佳答案
2013-7-5 16:22
  1. Sub 多表合并拆散()
  2. '源数据
  3.     Dim arr
  4.     '工作表名,临时字符串
  5.     Dim strShtname As String, strTemp As String
  6.     '工作簿循环,数组循环
  7.     Dim i As Integer, j As Long
  8.     '单元格
  9.     Dim rg As Range
  10.     '字典对象
  11.     Dim objDic As Object, objDicKeyItem

  12.     On Error GoTo ErrorHandler


  13.     '关属性,提速
  14.     With Application
  15.         .ScreenUpdating = False
  16.         .DisplayAlerts = False
  17.         .EnableEvents = False
  18.         .Calculation = xlCalculationManual
  19.     End With


  20.     '先清空工作表内原有内容
  21.     For i = 3 To Worksheets.Count
  22.         Worksheets(i).UsedRange.ClearContents
  23.     Next

  24.     '创建字典
  25.     Set objDic = CreateObject("scripting.dictionary")

  26.     For i = 1 To 2
  27.         '取工作表名
  28.         strShtname = Worksheets(i).Name
  29.         '取工作表名中-号前的文本
  30.         strTemp = Left(strShtname, InStr(strShtname, "-") - 1)

  31.         '读取源数据
  32.         arr = Worksheets(i).Range("a1").CurrentRegion.Value

  33.         '数组循环
  34.         For j = LBound(arr) + 1 To UBound(arr)
  35.             '字典嵌套字典
  36.             If Not objDic.exists(arr(j, 1)) Then
  37.                 objDic.Add arr(j, 1), CreateObject("scripting.dictionary")
  38.             End If
  39.             objDic(arr(j, 1))(strTemp & "-" & arr(j, 1)) = ""

  40.             '检测工作表是否存不,不存在则创建

  41.             If Not HasWorksheet(strTemp & "-" & arr(j, 1)) Then
  42.                 Worksheets.Add after:=Worksheets(Worksheets.Count)
  43.                 ActiveSheet.Name = strTemp & "-" & arr(j, 1)
  44.             End If
  45.             '写入内容
  46.             With Worksheets(strTemp & "-" & arr(j, 1))
  47.                 Set rg = .Cells(Rows.Count, 1).End(xlUp)
  48.                 If rg.Row = 1 Then
  49.                     rg.Resize(, 2).Value = Array("店号", "金额")
  50.                 End If
  51.                 rg.Offset(1).Resize(, 2).Value = Array(arr(j, 1), arr(j, 2))
  52.             End With
  53.         Next
  54.     Next


  55.     '导出同店铺号的购销与代销
  56.     For Each objDicKeyItem In objDic.keys
  57.         Worksheets(objDic(objDicKeyItem).keys).Copy
  58.         ActiveWorkbook.SaveAs ThisWorkbook.Path & Application.PathSeparator & objDicKeyItem & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
  59.         'Debug.Print ActiveWorkbook.FullName
  60.         ActiveWorkbook.Close False
  61.     Next

  62.     '开属性,还原
  63.     With Application
  64.         .ScreenUpdating = True
  65.         .DisplayAlerts = True
  66.         .EnableEvents = True
  67.         .Calculation = xlCalculationAutomatic
  68.     End With
  69.     MsgBox "导出成功"
  70.     Exit Sub

  71. ErrorHandler:
  72.     MsgBox Err.Number & vbCrLf & _
  73.            Err.Description
  74.     If ActiveWorkbook.Name <> ThisWorkbook.Name Then
  75.         ActiveWorkbook.Close False
  76.     End If

  77.     With Application
  78.         .ScreenUpdating = True
  79.         .DisplayAlerts = True
  80.         .EnableEvents = True
  81.         .Calculation = xlCalculationAutomatic
  82.     End With

  83. End Sub

  84. Function HasWorksheet(strShtname As String) As Boolean
  85.     On Error Resume Next
  86.     If Len(Worksheets(strShtname).Name) = 0 Then
  87.         HasWorksheet = False
  88.         Err.Clear
  89.     Else
  90.         HasWorksheet = True
  91.     End If
  92. End Function
复制代码

Book2.rar

14.86 KB, 下载次数: 17

发表于 2013-7-5 15:47 | 显示全部楼层
  1. Sub tst()
  2. '源数据
  3.     Dim arr
  4.     '工作表名,临时字符串
  5.     Dim strShtname As String, strTemp As String
  6.     '工作簿循环,数组循环
  7.     Dim i As Integer, j As Long
  8.     '单元格
  9.     Dim rg As Range
  10.     '工作表名数组字符串
  11.     Dim strShtArr As String, arrSheet
  12.     '字典对象
  13.     Dim objDic As Object, objDicKeyItem

  14.     '关属性,提速
  15.     With Application
  16.         .ScreenUpdating = False
  17.         .DisplayAlerts = False
  18.         .EnableEvents = False
  19.         .Calculation = xlCalculationManual
  20.     End With


  21.     '先清空工作表内原有内容
  22.     For i = 3 To Worksheets.Count
  23.         Worksheets(i).UsedRange.ClearContents
  24.     Next
  25.     '创建字典
  26.     Set objDic = CreateObject("scripting.dictionary")

  27.     For i = 1 To 2
  28.         '取工作表名
  29.         strShtname = Worksheets(i).Name
  30.         '取工作表名中-号前的文本
  31.         strTemp = Left(strShtname, InStr(strShtname, "-") - 1)

  32.         '读取源数据
  33.         arr = Worksheets(i).Range("a1").CurrentRegion.Value
  34.         '添加\,
  35.         strShtArr = strShtArr & strTemp & "\,"

  36.         '数组循环
  37.         For j = LBound(arr) + 1 To UBound(arr)
  38.             '添加店铺号
  39.             objDic(arr(j, 1)) = ""
  40.             '检测工作表是否存不,不存在则创建
  41.             If Not HasWorksheet(strTemp & "-" & arr(j, 1)) Then
  42.                 Worksheets.Add after:=Worksheets(Worksheets.Count)
  43.                 ActiveSheet.Name = strTemp & "-" & arr(j, 1)
  44.             End If
  45.             '写入内容
  46.             With Worksheets(strTemp & "-" & arr(j, 1))
  47.                 Set rg = .Cells(Rows.Count, 1).End(xlUp)
  48.                 If rg.Row = 1 Then
  49.                     rg.Resize(, 2).Value = Array("店号", "金额")
  50.                 End If
  51.                 rg.Offset(1).Resize(, 2).Value = Array(arr(j, 1), arr(j, 2))
  52.             End With
  53.         Next
  54.     Next

  55.     '导出同店铺号的购销与代销
  56.     For Each objDicKeyItem In objDic.keys
  57.         strTemp = Replace(Left(strShtArr, Len(strShtArr) - 1), "", "-" & objDicKeyItem)
  58.         arrSheet = Split(strTemp, ",")
  59.         Worksheets(arrSheet).Copy
  60.         ActiveWorkbook.SaveAs ThisWorkbook.Path & Application.PathSeparator & objDicKeyItem & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
  61.         Debug.Print ActiveWorkbook.FullName
  62.         ActiveWorkbook.Close False
  63.     Next
  64.     '开属性,还原
  65.     With Application
  66.         .ScreenUpdating = True
  67.         .DisplayAlerts = True
  68.         .EnableEvents = True
  69.         .Calculation = xlCalculationAutomatic
  70.     End With
  71.     MsgBox "导出成功"
  72. End Sub

  73. Function HasWorksheet(strShtname As String) As Boolean
  74.     On Error Resume Next
  75.     If Len(Worksheets(strShtname).Name) = 0 Then
  76.         HasWorksheet = False
  77.         Err.Clear
  78.     Else
  79.         HasWorksheet = True
  80.     End If
  81. End Function
复制代码
回复

使用道具 举报

发表于 2013-7-5 15:48 | 显示全部楼层
代码里有个BUG,当一个店铺号在两个表里不同时存在时,会报错,呆会再改。
另外还没有做错误处理。

回复

使用道具 举报

 楼主| 发表于 2013-7-5 16:04 | 显示全部楼层
hwc2ycy 发表于 2013-7-5 15:48
代码里有个BUG,当一个店铺号在两个表里不同时存在时,会报错,呆会再改。
另外还没有做错误处理。

谢谢楼主!!!!!{:021:}
我要慢慢研究一下!!
太感谢了!!!!{:171:}
回复

使用道具 举报

发表于 2013-7-5 16:22 | 显示全部楼层    本楼为最佳答案   
  1. Sub 多表合并拆散()
  2. '源数据
  3.     Dim arr
  4.     '工作表名,临时字符串
  5.     Dim strShtname As String, strTemp As String
  6.     '工作簿循环,数组循环
  7.     Dim i As Integer, j As Long
  8.     '单元格
  9.     Dim rg As Range
  10.     '字典对象
  11.     Dim objDic As Object, objDicKeyItem

  12.     On Error GoTo ErrorHandler


  13.     '关属性,提速
  14.     With Application
  15.         .ScreenUpdating = False
  16.         .DisplayAlerts = False
  17.         .EnableEvents = False
  18.         .Calculation = xlCalculationManual
  19.     End With


  20.     '先清空工作表内原有内容
  21.     For i = 3 To Worksheets.Count
  22.         Worksheets(i).UsedRange.ClearContents
  23.     Next

  24.     '创建字典
  25.     Set objDic = CreateObject("scripting.dictionary")

  26.     For i = 1 To 2
  27.         '取工作表名
  28.         strShtname = Worksheets(i).Name
  29.         '取工作表名中-号前的文本
  30.         strTemp = Left(strShtname, InStr(strShtname, "-") - 1)

  31.         '读取源数据
  32.         arr = Worksheets(i).Range("a1").CurrentRegion.Value

  33.         '数组循环
  34.         For j = LBound(arr) + 1 To UBound(arr)
  35.             '字典嵌套字典
  36.             If Not objDic.exists(arr(j, 1)) Then
  37.                 objDic.Add arr(j, 1), CreateObject("scripting.dictionary")
  38.             End If
  39.             objDic(arr(j, 1))(strTemp & "-" & arr(j, 1)) = ""

  40.             '检测工作表是否存不,不存在则创建

  41.             If Not HasWorksheet(strTemp & "-" & arr(j, 1)) Then
  42.                 Worksheets.Add after:=Worksheets(Worksheets.Count)
  43.                 ActiveSheet.Name = strTemp & "-" & arr(j, 1)
  44.             End If
  45.             '写入内容
  46.             With Worksheets(strTemp & "-" & arr(j, 1))
  47.                 Set rg = .Cells(Rows.Count, 1).End(xlUp)
  48.                 If rg.Row = 1 Then
  49.                     rg.Resize(, 2).Value = Array("店号", "金额")
  50.                 End If
  51.                 rg.Offset(1).Resize(, 2).Value = Array(arr(j, 1), arr(j, 2))
  52.             End With
  53.         Next
  54.     Next


  55.     '导出同店铺号的购销与代销
  56.     For Each objDicKeyItem In objDic.keys
  57.         Worksheets(objDic(objDicKeyItem).keys).Copy
  58.         ActiveWorkbook.SaveAs ThisWorkbook.Path & Application.PathSeparator & objDicKeyItem & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
  59.         'Debug.Print ActiveWorkbook.FullName
  60.         ActiveWorkbook.Close False
  61.     Next

  62.     '开属性,还原
  63.     With Application
  64.         .ScreenUpdating = True
  65.         .DisplayAlerts = True
  66.         .EnableEvents = True
  67.         .Calculation = xlCalculationAutomatic
  68.     End With
  69.     MsgBox "导出成功"
  70.     Exit Sub

  71. ErrorHandler:
  72.     MsgBox Err.Number & vbCrLf & _
  73.            Err.Description
  74.     If ActiveWorkbook.Name <> ThisWorkbook.Name Then
  75.         ActiveWorkbook.Close False
  76.     End If

  77.     With Application
  78.         .ScreenUpdating = True
  79.         .DisplayAlerts = True
  80.         .EnableEvents = True
  81.         .Calculation = xlCalculationAutomatic
  82.     End With

  83. End Sub

  84. Function HasWorksheet(strShtname As String) As Boolean
  85.     On Error Resume Next
  86.     If Len(Worksheets(strShtname).Name) = 0 Then
  87.         HasWorksheet = False
  88.         Err.Clear
  89.     Else
  90.         HasWorksheet = True
  91.     End If
  92. End Function
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-7-8 16:36 | 显示全部楼层
hwc2ycy 发表于 2013-7-5 16:22

感谢班长吖!!
我还要慢慢摸索一下,把它运用到另外一些表格上!
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 14:50 , Processed in 0.190431 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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