【发布时间】:2017-11-28 16:32:46
【问题描述】:
希望大家都好。
我正在寻求帮助。我希望自动化一个工作簿,该工作簿根据 H 列将数据从主文件拆分到各个工作簿。首先需要做的是,需要将 T 列过滤为“拥有”或“影响”。然后需要将 H 列拆分为单独的工作簿。基于 H 列中可能包含的内容。在创建的每个新工作簿上,无论 H 列下的内容都需要有两个选项卡,一个选项卡用于“拥有”,一个选项卡用于“受影响”。然后需要将其保存为单元格的名称和日期。
额外的困难位在 H 列下,根据附件,每个单元格中可能有 A、B、C、D、E、F 作为单独的单元格,但也可能有包含多个字母的单元格。如果他们有多个字母,每个字母都需要进入单元格中提到的所有工作簿。因此,例如,如果有一个包含 A、B、C、D 的单元格,这意味着它必须进入 A、B、C 和 D 的各个工作簿的工作簿。
我已经附加了文件 image 并且我有下面的代码,我使用它。它确实有效,但是由于单元格中存在多个标准的上述问题,它会将工作簿进一步拆分为单独的工作簿。有谁知道是否可以添加一个下拉列表,我可以从 H 和 T 列中选择标准,或者请其他解决方法。如有必要,我很乐意尝试其他代码。附上示例工作簿。
Option Explicit
Sub ParseItems()
'Based on selected column, data is filtered to individual workbooks
'workbooks are named for the value plus today's date
Dim LR As Long, Itm As Long, MyCount As Long, vCol As Long
Dim ws As Worksheet, MyArr As Variant, vTitles As String, SvPath As String
'Sheet with data in it
Set ws = Sheets("Master")
'Path to save files into, remember the final \
SvPath = "\\My Documents\New folder\"
'Range where titles are across top of data, as string, data MUST
'have titles in this row, edit to suit your titles locale
vTitles = "A1:V1"
'Choose column to evaluate from, column A = 1, B = 2, etc.
vCol = Application.InputBox("What column to split data by? " & vbLf _
& vbLf & "(A=1, B=2, C=3, etc)", "Which column?", 8, Type:=1)
If vCol = 0 Then Exit Sub
'Spot bottom row of data
LR = ws.Cells(ws.Rows.Count, vCol).End(xlUp).Row
'Speed up macro execution
Application.ScreenUpdating = False
'Get a temporary list of unique values from key column
ws.Columns(vCol).AdvancedFilter Action:=xlFilterCopy,
CopyToRange:=ws.Range("HH1"), Unique:=True
'Sort the temporary list
ws.Columns("HH:HH").Sort Key1:=ws.Range("HH2"), Order1:=xlAscending,
Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
'Put list into an array for looping (values cannot be the result of
formulas, must be constants)
MyArr = Application.WorksheetFunction.Transpose(ws.Range("HH2:HH" &
Rows.Count).SpecialCells(xlCellTypeConstants))
'clear temporary worksheet list
ws.Range("HH:HH").Clear
'Turn on the autofilter, one column only is all that is needed
ws.Range(vTitles).AutoFilter
'Loop through list one value at a time
For Itm = 1 To UBound(MyArr)
ws.Range(vTitles).AutoFilter Field:=vCol, Criteria1:=MyArr(Itm)
ws.Range("A1:A" & LR).EntireRow.Copy
Workbooks.Add
Range("A1").PasteSpecial xlPasteAll
Cells.Columns.AutoFit
MyCount = MyCount + Range("A" & Rows.Count).End(xlUp).Row - 1
ActiveWorkbook.SaveAs SvPath & MyArr(Itm) & Format(Date, " MM-DD-YY") &
".xlsx", 51 'use for Excel 2007+
ActiveWorkbook.Close False
ws.Range(vTitles).AutoFilter Field:=vCol
Next Itm
'Cleanup
ws.AutoFilterMode = False
MsgBox "Rows with data: " & (LR - 1) & vbLf & "Rows copied to other sheets:
" & MyCount & vbLf & "Hope they match!!"
Application.ScreenUpdating = True
End Sub
任何帮助将不胜感激。提前致谢
【问题讨论】:
-
“它将工作簿进一步拆分为单独的工作簿”是什么意思?你能详细说明一下吗?它是否创建了一个名为“A、B、C”的工作簿,而不是只进入工作簿 A、工作簿 B 和工作簿 C?
-
是的,这是正确的,它是将其创建到工作簿 A、B、C 中,而不是进入工作簿 A、工作簿 b 等。
-
您可能需要使用
Split()并用,分隔这些值,以便将其分解。 -
将整个内容复制到新工作簿,然后使用autofilter 显示不应该存在的所有内容并将其删除。有时,摆脱你不想要的东西比复制你想要的东西更容易。
-
我相信
LBound(MyArr)是 0,而不是 1,而您正在循环到 1,048,575。
标签: vba excel automation excel-2010