我想创建一个宏函数,使您可以将许多Excel文件(工作簿)中的数据收集到一个摘要语句中,以用于特定实施阶段和截止日期的另一个文件中。
所有这些文件都将收集在一个文件夹中(也是该摘要文件)。
我想通过在运行宏功能后手动输入(输入框)或从可用选项的下拉列表中选择实施阶段和截止日期(例如,阶段1,术语40 –如屏幕截图所示),如果添加了另一个阶段。
浏览完上述文件夹中的所有文件(完成数据下载)后,宏功能需要按名称或索引对这些数据进行排序,并计算总需求量(数量总和)。 (选择并计算唯一项的值),但在此之前需要以仅将主要索引用于计算和最终结果的方式对其进行排序(例如,仅使用1、2、3而不使用1.1)。 ,1.1.1、1.2。,2.1。等)。如果可能的话,我想避免使用过滤器和数据透视表,而所有这些操作都应由一个宏函数完成。
所有这些文件将始终只有一张纸,并且可能具有不同的名称。
我必须这样做,但是我对VBA编程甚至在Excel中使用marcos都不了解,所以我将不胜感激。
我正在添加一些屏幕截图,说明如何运行(对于第1阶段和第40学期),我希望这将有助于理解我的问题。
此刻,我正在使用该代码,它可以很好地工作,但我不知道如何将读取“源”的工作簿的名称更改为“ *”-任何名称(我指的是该文件路径)并循环播放更大的文件。还不知道我是否应该创建另一个宏来过滤数据或与此结合。
Sub CollectData()
Dim i As Long, lCurrRow As Long, lRow As Long, n As Long
Dim wb As Workbook, ans As VbMsgBoxResult
For i = 1 To 5 Step 1
On Error Resume Next
Set wb = Workbooks.Open(ThisWorkbook.Path & "\Source" & i & ".xls")
If Not Err.Number = 0 Then
Err.Clear
Set wb = Workbooks.Open(ThisWorkbook.Path & "\Source " & i & ".xls")
If Not Err.Number = 0 Then
Err.Clear
ans = MsgBox("Could not find Source " & i & " Workbook." & vbNewLine & "Do you wis" & _
"h to continue?", vbInformation + vbYesNo, "Error")
If ans = vbNo Then Exit Sub
GoTo NextI
End If
End If
With wb.Sheets("RAW_DATA")
If Not Err.Number = 0 Then
Err.Clear
ans = MsgBox("Could not find Source " & i & " Workbook's 'Data Output' tab." & _
vbNewLine & "Do you wish to continue?", vbInformation + vbYesNo, "Error")
If ans = vbNo Then
wb.Close False
Exit Sub
End If
GoTo NextI
End If
If i = 1 Then
lRow = 1
Else
lRow = 2
End If
Do Until .Range("A" & lRow).Value = vbNullString
lCurrRow = lCurrRow + 1
For n = 0 To 6 Step 1
Me.Range("A" & lCurrRow).Offset(ColumnOffset:=n).Value = .Range("A" & lRow).Offset(ColumnOffset:=n).Value
Next n
lRow = lRow + 1
Loop
End With
NextI:
wb.Close False
Next i
Set wb = Nothing
End Sub
答案 0 :(得分:1)
Dir()
和FileSystemOpbect
可用于查找相关文件。 FileSystemObject可用于定位文件夹,而Files
集合可返回文件列表。在StackOverflow上有很多答案描述了这两种方法的使用。
是原始代码,首先打开工作簿。打开工作簿后:
For Each wb in Application.Workbooks
' Code here
Next wb
另一种方法是拥有一组工作簿名称:
Dim wbNames as Variant
Dim wbName as String
Dim iterator as Lon
wbNames = Array("1.xls", "2.xls")
For iterator = LBound(wbNames) to UBound(wbNames)
wbName = ThisWorkbook.Path & "\" & wbNames(iterator)
Set wb = Application.Workbooks.Open(wbName)
' Code here
Next iterator
但是,如果您使用的是Files
集合,则也可以使用这些行
For each fFile in foundFiles '<--- remember to declare!
wbName = ThisWorkbook.Path & "\" & fFile.Name
根据提取文件名的方式,甚至可以使用:
wbName = fFile.Path & fFile.Name ` Check this, can't remember if Path includes file name
通过创建子功能将代码分成可管理的块通常也是一个好主意。