Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-如何区分同一循环中具有相同路径的两个工作簿之间的差异_Vba_Excel - Fatal编程技术网

Excel VBA-如何区分同一循环中具有相同路径的两个工作簿之间的差异

Excel VBA-如何区分同一循环中具有相同路径的两个工作簿之间的差异,vba,excel,Vba,Excel,我有月报,每个月都有特定的模式名称。例如,“2017年11月视觉报告”、“2017年12月视觉报告”等等。。。在我的宏中,我需要使用两个报告,其中一个是上个月的报告,另一个是本月的报告,这对我来说非常重要 因此,我在a列中创建了一个表格,列中有每个月的可能报告名称,列中有“视觉报告…”,列中有月份名称和年份,我在这些单元格中循环,并在文件夹中查找具有此名称的文件(应该只有2个文件。本月和上一个月) 我的问题是,在第二个工作簿打开后,月份和年份的变量发生了变化,我无法复制第一个工作簿的数据,因为他

我有月报,每个月都有特定的模式名称。例如,“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,即我自己找到了另一个解决方案。不幸的是,你的解决方案不起作用,我删除了这个问题,因为很多人给了我一个不好的分数。