【发布时间】:2017-10-25 23:16:44
【问题描述】:
我正在考虑构建一个主工作簿,该工作簿每月接收所有成本中心的数据转储,然后将在工作簿中填充大量工作表,然后需要将其拆分并发送给服务负责人。服务负责人将收到基于工作表名称的前 4 个字符选择的工作表(尽管这可能会在适当的时候改变)。
例如 1234x、1234y、5678a、5678b 将生成两个名为 1234 和 5678 的新工作簿,每个工作簿有两张。
我从各个论坛拼凑了一些代码来创建一个宏,该宏将通过定义服务头 4 个字符代码的硬编码数组工作并创建一系列新工作簿。这似乎有效。
但是.. 我还需要在源文件(称为“数据”)中包含主数据转储表以及要复制的文件数组,以便链接保留在复制的数据表中。如果我写一行单独复制数据表,新工作簿仍然引用源文件,服务负责人无权访问。
所以主要问题是:如何将“数据”选项卡添加到 Sheets(CopyNames) 中。复制代码以便与数组中的所有其他文件同时复制以保持链接完整?
第二个问题是如果我决定它是工作表的前两个字符定义与服务负责人相关的工作表,我如何调整代码的拆分/中间行 - 我已经尝试过,但我被捆绑了以节为单位!
非常感谢任何其他使代码更优雅的提示(可能有很长的服务头代码列表,我相信有更好的方法来创建一个循环的例程列表)
Sub Copy_Sheets()
Dim strNames As String, strWSName As String
Dim arrNames, CopyNames
Dim wbAct As Workbook
Dim i As Long
Dim arrlist As Object
Set arrlist = CreateObject("system.collections.arraylist")
arrlist.Add "1234"
arrlist.Add "5678"
Set wbAct = ActiveWorkbook
For Each Item In arrlist
For i = 1 To Sheets.Count
strNames = strNames & "," & Sheets(i).Name
Next i
arrNames = Split(Mid(strNames, 2), ",")
'strWSName =("1234")
strWSName = Item
Application.ScreenUpdating = False
CopyNames = Filter(arrNames, strWSName, True, vbTextCompare)
If UBound(CopyNames) > -1 Then
Sheets(CopyNames).Copy
ActiveWorkbook.SaveAs Filename:=strWSName & " " & Format(Now, "dd-mmm-yy h-mm-ss")
ActiveWorkbook.Close
wbAct.Activate
Else
MsgBox "No sheets found: " & strWSName
End If
Next Item
Application.ScreenUpdating = True
End Sub
【问题讨论】:
-
此时不能更改 strNames = strNames & "," & LEFT(Sheets(i).NameSheets(i).Name,2) 吗?