Ripster 提供了一个示例,说明您的规范中缺少信息。
Santosh 推荐了一个非常简洁的工具,但我对您的问题的阅读是您的知识还没有达到使用工具的水平。
我推断这是一个工作问题,尽管您对 VBA 的了解为零,但您的老板要求您编写此宏。这似乎是一个日益严重的问题:您可以在网上找到任何问题的答案,那么为什么还要费心培训人呢。即使您制定了完整的需求规范,我也怀疑有人会给您完整的解决方案。如果他们确实提供了一个完整的解决方案,那么它将无助于下一个需求。所以我要把你的问题分解成你可以在网上问的问题类型。
每周您会获得 12 个源工作簿,并通过整合来自源工作簿的数据来创建摘要。您是用新的摘要覆盖前一周的摘要还是要保存所有摘要?保留所有摘要不会增加太多复杂性,但您需要决定您想要什么。
如果你放弃以前的摘要,宏可以在 Summary.xlxm 中,比如说。如果您保存摘要,则宏将需要位于其自己的工作簿中,例如 Macro.xlsm,并且它将每周创建一个不同的摘要工作簿,例如 SummaryYYWW.xlsm。
如果您搜索“打开工作簿”和“创建工作簿”,您将找到有关一个工作簿中的宏如何打开其他工作簿和创建新工作簿的说明。
源工作簿在哪里?它们是否在每周覆盖的 CurrentData 文件夹中?它们是否在 Week1301、Week1302、Week1303 等文件夹中?它们是否在文件夹 NewData 中,宏是在处理后将它们移动到文件夹 Week1301、Week1302、Week1303 等?所有这些都是选项,但我建议您首先将源工作簿和摘要工作簿移入/移出便于宏使用的文件夹。
查找“ThisWorkbook”和“ActiveWorkbook”。简而言之:“ThisWorkbook”是包含宏的工作簿,“ActiveWorkbook”是最近打开的工作簿。
查找工作簿属性“路径”。例如,ThisWorkbook.Path 为您提供包含 ThisWorkbook 的文件夹的名称。查找工作簿属性“名称”。
如果源工作簿始终具有相同的名称,您可以将名称硬编码到宏中。我不推荐这个。查找函数“Dir”。
我希望以上内容已经让您开始将整个问题分解为各个组成部分。
网络上有许多不同的 VBA 教程。尝试几个,然后选择一个你喜欢的。
“Debug.Print xxx”将 xxx 的值输出到即时窗口。这在您开始时会非常有帮助。试试这个作为你的第一个宏:
Option Explicit
Sub First()
Dim FilenameCrnt As String
Dim WbookCrnt As Workbook
Debug.Print ThisWorkbook.Name
Debug.Print ThisWorkbook.Path
FilenameCrnt = Dir$(ThisWorkbook.Path & "\*.*")
Do While FilenameCrnt <> ""
Debug.Print FilenameCrnt
If FilenameCrnt = ThisWorkbook.Name Then
With ThisWorkbook
Debug.Print " Used range: " & .Worksheets(1).UsedRange.Address
End With
Else
If LCase(Right(FilenameCrnt, 3)) = "xls" Or _
LCase(Right(FilenameCrnt, 4)) = "xlsm" Or _
LCase(Right(FilenameCrnt, 4)) = "xlsx" Then
WbookCrnt = Workbooks.Open(ThisWorkbook.Path & "\" & FilenameCrnt)
With WbookCrnt
Debug.Print " Used range: " & .Worksheets(1).UsedRange.Address
End With
WbookCrnt.Close
WbookCrnt = Nothing ' Free resource
End If
End If
FilenameCrnt = Dir$
Loop
End Sub
祝你好运