Excel VBA-如何区分同一循环中具有相同路径的两个工作簿之间的差异
我有月报,每个月都有特定的模式名称。例如,“2017年11月视觉报告”、“2017年12月视觉报告”等等。。。在我的宏中,我需要使用两个报告,其中一个是上个月的报告,另一个是本月的报告,这对我来说非常重要 因此,我在a列中创建了一个表格,列中有每个月的可能报告名称,列中有“视觉报告…”,列中有月份名称和年份,我在这些单元格中循环,并在文件夹中查找具有此名称的文件(应该只有2个文件。本月和上一个月) 我的问题是,在第二个工作簿打开后,月份和年份的变量发生了变化,我无法复制第一个工作簿的数据,因为他设置了第二个工作簿的路径。如果有人知道如何以其他方式命名第一个工作簿,我将不胜感激Excel VBA-如何区分同一循环中具有相同路径的两个工作簿之间的差异,vba,excel,Vba,Excel,我有月报,每个月都有特定的模式名称。例如,“2017年11月视觉报告”、“2017年12月视觉报告”等等。。。在我的宏中,我需要使用两个报告,其中一个是上个月的报告,另一个是本月的报告,这对我来说非常重要 因此,我在a列中创建了一个表格,列中有每个月的可能报告名称,列中有“视觉报告…”,列中有月份名称和年份,我在这些单元格中循环,并在文件夹中查找具有此名称的文件(应该只有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
子名称\u工作簿()
"清除旧数据",
centerWS.Cells.Clear
empWS.Cells.Clear
sigillws.Cells.Clear
'查找文件夹中的文件并命名它们
对于j=1到3
对于列表SLR的i=2
年份=列表单元格(i,2).值
月=ListsWS.Cells(i,1).Value
FName=月份、月份和年份
SecondPath=Dir(路径&“\”&FName&“*xlsx*”)
如果第二路径为“”,则
j=j+1
如果j=2,则
设置preWB=Workbooks.Open(路径&“\”&SecondPath)
其他的
Set nextWB=Workbooks.Open(路径&“\”&SecondPath)
如果结束
如果j=3,则退出以进行测试
如果结束
接下来我
下一个j
端接头
如果您在运行时查看当前月份和前一个月,下面是我将如何执行此操作的示例
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
Hth,如果您在运行时查看当前月份和前一个月,我将以此为例进行说明
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
Hth,如果报告已经命名,那么我将创建一个函数来解析文件名中的日期
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
如果您有多本工作簿,那么您可以对日期进行排序,以确定哪些工作簿较旧
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
如果报告已经命名,那么我将创建一个函数来解析文件名中的日期
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
如果您有多本工作簿,那么您可以对日期进行排序,以确定哪些工作簿较旧
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
您是否一直打算在当月运行它?或者我们正在考虑几个月的组合?这与您之前的创建日期删除问题类似吗?如果是,您是否尝试过我的解决方案?@shrivallabha.redij我们正在考虑几个月的组合。例如,如果我们将在2018年8月运行它,它将打开Augo的报告st和July。您是否可以在处理主工作簿时将文件名写入主工作簿,以便特定列的最后一行始终保存您处理的上个月的文件?然后检查文件夹中的此文件,如果找到,将其设置为上个月?@QHarr No mate,这是我自己发现的另一个解决方案。不幸的是,您的解决方案不起作用,我删除了这个问题,因为很多人给了我一个不好的分数。你总是打算在当月运行它吗?或者我们正在考虑几个月的组合?这与你之前的创建日期删除的问题类似吗?如果是,你在那里尝试过我的解决方案吗?@shrivallabha.redij我们正在考虑几个月的组合。如果我们将例如,在Augost 2018中取消它,它将打开Augost和July的报告。在处理这些报告时,您不能将文件名写入主工作簿,以便特定列的最后一行始终保存您处理的上个月的文件吗?然后在文件夹中检查此文件,如果找到,则设置为last month?@QHarr No mate,即我自己找到了另一个解决方案。不幸的是,你的解决方案不起作用,我删除了这个问题,因为很多人给了我一个不好的分数。