2017-12-31 92 views
0

私は毎月のレポートを持っており、毎月特定のパターンの名前を持っています。たとえば、「2017年11月のビジュアルレポート」、「2017年12月のビジュアルレポート」など...そして、マクロでは2つのレポートを使用する必要があり、それは以前の今月の予定はどれですか?Excel VBA - 同じループで同じパスの2つのワークブックの違いを教える方法

私は、列Aの各月のレポートの可能な名前を「ビジュアルレポートfor ..」、列Bの月名と年を表にして、このセルをループして検索します

私の問題は、2番目のワークブックが開かれた後に月と年の変数が変更されていて、次のデータをコピーできないということです。他の方法で最初のワークブックの名前をどのようにすればいいのでしょうか?ここでは、実行時に現在の月と前月を見ていた場合、私は例として、それを行うだろう方法です

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 
+0

あなたは常に現在の月のためにそれを実行するつもりですか?あるいは、数ヶ月の組み合わせを見ていますか? –

+0

これは以前のCreation Date削除された質問に似ていますか?はいの場合、そこに私のソリューションを試しましたか? – QHarr

+0

@ shrivallabha.redij私たちは数ヶ月の組み合わせを見ています。 2018年のAugostで実行すると、Augostと7月のレポートが開きます。 –

答えて

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 

第H、

1

は、私はファイル名から日付を解析する関数を作成します。

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を使用して、ブックを日付の昇順でソートされたコレクションに配置します。

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