2017-08-04 23 views
2

次のマクロを使用して、従業員時間ファイルを含むディレクトリから特定のデータをフィルタし、zmasterファイルに配置します。しかし、私は様々なプロジェクト(EGの変更名: "プロジェクト300000")のための様々なマスタードキュメントが必要です。マスターファイル名をzmasterから何かに変更すると、私のマクロは明らかに適切なファイルを見つけることができません。ファイル名を変更するとマクロが自動的に更新されます

zmaster.xlsmがマクロ内で現在のファイル名で自動的に置き換えられるようにマクロを変更する方法はありますか?ハードコーディングされたワークブックの名前から脱出する

Option Explicit 

Sub CopyToMasterFile() 

    Dim MasterWB As Workbook 
    Dim MasterSht As Worksheet 
    Dim MasterWBShtLstRw As Long 
    Dim FolderPath As String 
    Dim TempFile 
    Dim CurrentWB As Workbook 
    Dim CurrentWBSht As Worksheet 
    Dim CurrentShtLstRw As Long 
    Dim CurrentShtRowRef As Long 
    Dim CopyRange As Range 
    Dim ProjectNumber As String 


    FolderPath = "C:\test\" 
    TempFile = Dir(FolderPath) 

    Dim WkBk As Workbook 
    Dim WkBkIsOpen As Boolean 

    'Check if zmaster is open already 
    For Each WkBk In Workbooks 
     If WkBk.Name = "zmaster.xlsm" Then WkBkIsOpen = True 
    Next WkBk 

    If WkBkIsOpen Then 
     Set MasterWB = Workbooks("zmaster.xlsm") 
     Set MasterSht = MasterWB.Sheets("Sheet1") 
    Else 
     Set MasterWB = Workbooks.Open(FolderPath & "zmaster.xlsm") 
     Set MasterSht = MasterWB.Sheets("Sheet1") 
    End If 

    ProjectNumber = MasterSht.Cells(1, 1).Value 



    Do While Len(TempFile) > 0 

     'Checking that the file is not the master and that it is a xlsx 
     If Not TempFile = "zmaster.xlsm" And InStr(1, TempFile, "xlsx", vbTextCompare) Then 

      Set CopyRange = Nothing 

      'Note this is the last used Row, next empty row will be this plus 1 
      With MasterSht 
       MasterWBShtLstRw = .Cells(.Rows.Count, "A").End(xlUp).Row 
      End With 

      Set CurrentWB = Workbooks.Open(FolderPath & TempFile) 
      Set CurrentWBSht = CurrentWB.Sheets("Sheet1") 

      With CurrentWBSht 
       CurrentShtLstRw = .Cells(.Rows.Count, "A").End(xlUp).Row 
      End With 

      For CurrentShtRowRef = 1 To CurrentShtLstRw 

      If CurrentWBSht.Cells(CurrentShtRowRef, "A").Value = ProjectNumber Then 

       'This is set to copy from Column A to Column L as per the question 

       If CopyRange Is Nothing Then 
       'If there is nothing in Copy range then union wont work 
       'so first row of the work sheet needs to set the initial copyrange 
        Set CopyRange = CurrentWBSht.Range("A" & CurrentShtRowRef & _ 
               ":L" & CurrentShtRowRef) 
       Else 
        'Union is quicker to be able to copy from the sheet once 
        Set CopyRange = Union(CopyRange, _ 
             CurrentWBSht.Range("A" & CurrentShtRowRef & _ 
                  ":L" & CurrentShtRowRef)) 
       End If ' ending If CopyRange Is Nothing .... 
      End If ' ending If CurrentWBSht.Cells.... 

      Next CurrentShtRowRef 

      CopyRange.Select 

      'add 1 to the master file last row to be the next open row 
      CopyRange.Copy MasterSht.Cells(MasterWBShtLstRw + 1, 1) 

      CurrentWB.Close savechanges:=False 

     End If  'ending   If Not TempFile = "zmaster.xlsx" And .... 

     TempFile = Dir 

    Loop 

ActiveSheet.Range("A1:L200").RemoveDuplicates Columns:=Array(1, 2, 4, 8, 9, 10, 11, 12), Header:=xlYes 

End Sub 
+1

の顔をしています。 xlsm'は 'wbName'変数 – codtex

+0

@Codtexを使用してください、あなたの応答に感謝します。 zmaster.xlsmを変数wbNameに置き換えましたが、次のエラーが表示されます。1004 C:\ test \ wbname.xlsxが見つかりません。現在のファイルが.xlsmの間に.xlsxファイルを開こうとしているのに気付きましたが、これが問題かどうか、そしてこれを修正する方法がわかりません。何か案は? – Smits

+1

あなたは 'WkBk.Name =" wbName.xlsm "ではなく、' WkBk.Name = wbName'のような使い方を置きたいと思っています。変数を使用する場合は、引用符を使用する必要はありません。文字列を表す場合にのみ引用符を使用しています – codtex

答えて

1

一つの方法は、ActiveWorkbookまたはThisWorkbookオブジェクトを使用することです - 彼らは両方のWorkbookオブジェクトのインスタンスを返します。

ThisWorkbook

Returns a Workbook object that represents the workbook where the current macro code is running. Read-only.

ActiveWorkbook

Returns a Workbook object that represents the workbook in the active window (the window on top). Read-only. Returns Nothing if there are no windows open or if either the Info window or the Clipboard window is the active window.

次に、あなたが返さWorkbookオブジェクトのNameプロパティで、ブックの名前を取得することができます。


このようなデータを関数に渡すと別の方法があります。たとえば : - あなたの機能にハードコーディングされたものを逃れることができ、この方法を使用すると、別のマクロコードから自分のSubを呼び出す場合は、この変形例では

Sub CopyToMasterFile(wbName as String, sheetName as String) 

、あなたが使用したいものは何でも渡すことができます。 wbName = ActiveWorkbook.Name`、次にあなたが `zmasterを使用する場所に: -

これもWorksheetオブジェクトに対して有効では文字列として`薄暗いwbNameような何かを行うことができますActiveSheet

関連する問題