我有月度报告,他们每个月都有一定的图案名称。例如,“2017年11月的视觉报告”,“2017年12月的视觉报告”等等......在我的宏观中,我需要使用2个报告,这对我来说非常重要,其中一个是以前的月份和本月的哪一个。
因此,我在A列中创建了一个包含每个月报告可能名称的表格,其中包含“Visual report for ..”和月份名称以及B列中的年份和I循环遍历此单元格并查找具有此名称的文件在文件夹中(应该只有2个文件。本月和以前。
我的问题是,在第二个工作簿打开后,月份和年份的变量正在变化,我无法复制第一个工作簿的数据,因为他设置了第二个工作簿的路径。如果有人有想法如何以其他方式命名第一本工作簿我将不胜感激。
here is my code:
Sub Main()
Call initialize
Call name_workbook
End Sub
Sub initialize()
Set MainWB = ThisWorkbook
Path = ThisWorkbook.Path
Set empWS = MainWB.Worksheets("emp")
Set sigilWS = MainWB.Worksheets("sigil")
Set centerWS = MainWB.Worksheets("center)
Set ListsWS = MainWB.Worksheets("Lists")
ListsLR = ListsWS.Cells(Rows.Count, "A").End(xlUp).Row
End Sub
这是我谈到的主要循环:
Sub name_workbook()
'clear old data
centerWS.Cells.Clear
empWS.Cells.Clear
sigilWS.Cells.Clear
'look for files in the folder and name them
For j = 1 To 3
For i = 2 To ListsLR
year = ListsWS.Cells(i, 2).Value
month = ListsWS.Cells(i, 1).Value
FName = month & " " & year
SecondPath = Dir(Path & "\" & FName & ".*xlsx*")
If SecondPath <> "" Then
j = j + 1
If j = 2 Then
Set preWB = Workbooks.Open(Path & "\" & SecondPath)
Else
Set nextWB = Workbooks.Open(Path & "\" & SecondPath)
End If
If j = 3 Then Exit For
End If
Next i
Next j
End Sub
如果您在运行时查看当前月份和上个月,我将以此为例。
Sub Test()
Dim strPrevWB As String
Dim strNextWB As String
strPrevWB = "Visual report for " & Format(Application.EoMonth(Date, -1), "mmmm yyyy")
strNextWB = "Visual report for " & Format(Date, "mmmm yyyy")
Debug.Print strPrevWB & "--" & strNextWB
End Sub
这也可以用于计算下面的任何月组合,你可以循环改变dtReport
变量。
Sub Test2()
Dim strPrevWB As String
Dim strNextWB As String
Dim dtReport As Date
dtReport = DateValue("31/08/2017")
strPrevWB = "Visual report for " & Format(Application.EoMonth(dtReport, -1), "mmmm yyyy")
strNextWB = "Visual report for " & Format(dtReport, "mmmm yyyy")
Debug.Print strPrevWB & "--" & strNextWB
End Sub
心连心,
如果报告已经命名,那么我将创建一个函数来解析FileName中的Date。
Function getWorkbookDate(FileName As String) As Date
getWorkbookDate = DateValue(Replace(FileName, "Visual report for ", ""))
End Function
然后,您可以通过测试哪个日期更大来确定哪个工作簿是哪个。
Sub SimpleExample()
Const Path = "C:\"
Dim FileNames(1) As String
FileNames(0) = "Visual report for December 2017"
FileNames(1) = "Visual report for November 2017"
If getWorkbookDate(FileNames(0)) > getWorkbookDate(FileNames(1)) Then
Set nextWB = Workbooks.Open(Path & "\" & FileNames(1))
Set preWB = Workbooks.Open(Path & "\" & FileNames(0))
Else
Set nextWB = Workbooks.Open(Path & "\" & FileNames(0))
Set preWB = Workbooks.Open(Path & "\" & FileNames(1))
End If
End Sub
如果您有多个工作簿,那么您可以对日期进行排序以确定哪些工作簿较旧。在这里,我使用SortedList将Workbooks放在按日期升序排序的集合中。
Sub SortedList_Example()
Const Path = "C:\"
Dim x As Long
Dim FileNames(5) As String
Dim WBList As Object, item As Variant
Set WBList = CreateObject("System.Collections.SortedList")
FileNames(0) = "Visual report for July 2017"
FileNames(1) = "Visual report for November 2016"
FileNames(2) = "Visual report for September 2016"
FileNames(3) = "Visual report for November 2017"
FileNames(4) = "Visual report for January 2016"
FileNames(5) = "Visual report for October 2017"
For Each item In FileNames
WBList.Add getWorkbookDate(CStr(item)), Workbooks.Open(Path & "\" & item)
Next
For x = 0 To WBList.Count - 1
Debug.Print WBList.GetKey(x), WBList.GetByIndex(x).Name
Next
End Sub