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

问题描述 投票:0回答:2

我有月度报告,他们每个月都有一定的图案名称。例如,“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
excel vba excel-vba
2个回答
1
投票

如果您在运行时查看当前月份和上个月,我将以此为例。

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

心连心,


1
投票

如果报告已经命名,那么我将创建一个函数来解析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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.