| Public Function OpenTargetFile(ByVal TargetFilePath As String, _ ByVal KindSheetName As String, _ ByVal RenameString As String) As Boolean 'ファイル名に指定したキーワードを含むXLSファイルを開く '引数1:TargetFilePath マスタファイルが格納されているファイルパスを渡す '引数2:KindSheetName 読み込むマスタの種類を示す文字列("役職条件マスタ"など) '引数3:RenameString 読み込んだマスタのリネーム用文字列 '戻値:成功=TRUE、失敗=FALSE Dim wksBook As Workbook 'ワークブックオブジェクト Dim wksSheet As Worksheet 'ワークシートオブジェクト Dim strName As String 'ファイル名を格納 Dim strNonExt As String '拡張子を除外したファイル名を格納 Dim latestFileName As String '最新のファイル Dim nameLen As Integer 'ファイル名の長さ Dim nameDate As String 'シート名の日付文字 Dim sheetMax As Integer 'シートの最終インデックス Dim isChecked As Boolean 'チェックフラグ OpenTargetFile = True 'エラーハンドリング On Error GoTo Hdl_ERROR '最新のファイル名を取得(ファイルの存在確認も兼ねて) latestFileName = GetLatestFileName(KindSheetName, TargetFilePath) '該当ファイルがあったらチェックOK If latestFileName <> "" Then isChecked = True Else isChecked = False End If If isChecked = True Then 'ファイル名チェックOKなら実行 'マスタがバッティングするので古いシートがあったら削除 For Each wksSheet In ThisWorkbook.Worksheets If wksSheet.Name = RenameString Then wksSheet.Visible = xlSheetVisible Call DeleteSheetFromPartialSheetName(KindSheetName, ThisWorkbook.Name) Exit For End If Next wksSheet sheetMax = ThisWorkbook.Worksheets.Count Set wksBook = Workbooks.Open(TargetFilePath & "\" & latestFileName) '対象を開く Set wksSheet = ThisWorkbook.Worksheets(sheetMax) '最終のシートを設定し wksBook.Worksheets(1).Copy after:=wksSheet '最終インデックスにコピー wksBook.Saved = True '上書き確認がうざいので上書き済みにし wksBook.Close '対象を閉じる sheetMax = ThisWorkbook.Worksheets.Count 'Maxが変わるので再読み込みして Set wksSheet = ThisWorkbook.Worksheets(sheetMax) 'オブジェクトをコピー先シートにして wksSheet.Name = RenameString 'シート名を変更 End If Set wksSheet = Nothing Set wksBook = Nothing Exit Function Hdl_ERROR: 'オブジェクト解放 Set wksSheet = Nothing Set wksBook = Nothing OpenTargetFile = False End Function Function SaveSheetAsNewBook(ByVal OutputSheet As Worksheet, _ Optional ByVal SavefilePath As String = "") As Boolean '指定したシートを別ブックとして保存 '引数1 OutputSheet: 保存するシートオブジェクト Dim newbook As Workbook '新しいブックオブジェクト Dim objBook As Workbook 'このブック格納用オブジェクト Dim wksSheet As Worksheet 'ワークシートオブジェクト Dim orgSheets As Integer '呼び出し元シートの「新しいブックのシート数」を格納 Dim shtIndex As Integer '新しいブックのシートインデックスを格納 Dim strSheetName As String 'シート名を格納 Dim strShtKind As String 'シートの種別を格納 Dim strDate As String '日付を格納 Dim currentPath As String 'このブックのパス Dim filePath As String 'ファイルパスを格納 Dim fileName As String '出力するファイル名を格納 Dim fullPath As String '最終出力ディレクトリまでのフルパスを格納 Dim isError As Boolean 'エラーフラグ Dim fso As FileSystemObject 'ファイル操作用 Dim strSeqNum As String '連番格納用 Dim SeqNum As Integer '連番 'エラーハンドリング On Error GoTo Hdl_SAVE_ERROR '渡されたオブジェクトが空オブジェクトか判定 If IsEmpty(OutputSheet) <> True Then '空ならFileSystemObjectを設定する Set fso = New FileSystemObject Else GoTo Hdl_SAVE_ERROR End If '出力ディレクトリの定義 If SavefilePath = "" Then 'ディレクトリが指定されていなければ currentPath = Application.ThisWorkbook.Path 'カレントにこのブックのパス名を設定 filePath = currentPath & "\" & STORE_DIR 'マスタファイルの出力ディレクトリ strDate = Replace(Format$(Date, "YYYYMMDD"), "/", "") '本日日付の定義 fullPath = filePath & "\" & strDate '最終のフルパス Else currentPath = SavefilePath 'カレントディレクトリ filePath = SavefilePath '指定ディレクトリを設定 strDate = "" '日付は空にする fullPath = filePath End If 'オートフィルタの判定 If OutputSheet.FilterMode = True Then OutputSheet.ShowAllData 'オートフィルタモード解除 End If '新しいブックの作成 orgSheets = Application.SheetsInNewWorkbook '「新しいブックのシート数」をメモしておく strSheetName = OutputSheet.Name '現在のシート(コピー元)の名前をメモしておく Application.SheetsInNewWorkbook = 1 '新規作成時のデフォルトシート数を1に設定 Set newbook = Workbooks.Add '新しいブックを(メモリ上に)作成 Application.SheetsInNewWorkbook = orgSheets '「新しいブックのシート数」を元に戻しておく '新しいシートにコピーする OutputSheet.Copy before:=newbook.Worksheets(1) shtIndex = newbook.Worksheets.Count 'シート数を取得 Application.DisplayAlerts = False '確認警告を無効に newbook.Worksheets(shtIndex).Delete '空シートを削除 Application.DisplayAlerts = True '確認警告を有効に '保存の判定 If SavefilePath = "" Then '渡されたパス名が空だったら If fso.FolderExists(filePath) = False Then '出力ディレクトリがなかったら ' カレントの直下に出力フォルダを作成する Call fso.CreateFolder(filePath) '当日日付ディレクトリがなかったら作成する If fso.FolderExists(fullPath) = False Then Call fso.CreateFolder(fullPath) End If 'マスタ種別を取得 strShtKind = JudgeSheetKind(strSheetName) 'マスタ種別が「該当なし」でなければ If strShtKind <> "" Then '最新の連番を取得し SeqNum = GetTargetFileSeq(strShtKind, fullPath) 'ファイル名を設定し fileName = strShtKind & "_" & strDate & "_" & Format$(CStr(SeqNum + 1), "00") '保存する newbook.SaveAs fullPath & "\" & fileName & ".xls" '邪魔なので閉じる Application.Workbooks(fileName & ".xls").Close End If Else '当日日付ディレクトリがなかったら作成する If fso.FolderExists(fullPath) = False Then Call fso.CreateFolder(fullPath) End If 'マスタ種別を取得 strShtKind = JudgeSheetKind(strSheetName) 'マスタ種別が「該当なし」でなければ If strShtKind <> "" Then '最新の連番を取得し SeqNum = GetTargetFileSeq(strShtKind, fullPath) '存在しなければ初期値を設定し If SeqNum = -255 Then SeqNum = 0 'ファイル名を設定し fileName = strShtKind & "_" & strDate & "_" & Format$(CStr(SeqNum + 1), "00") '保存する newbook.SaveAs fullPath & "\" & fileName & ".xls" '邪魔なので閉じる Application.Workbooks(fileName & ".xls").Close End If End If Else SaveSheetAsNewBook = False newbook.Close Exit Function End If '開いていたブックを閉じる 'オブジェクト解放 Set fso = Nothing Set newbook = Nothing '成功を戻す SaveSheetAsNewBook = True Exit Function Lbl_NO_MATCH: Application.DisplayAlerts = True SaveSheetAsNewBook = False Hdl_SAVE_ERROR: 'オブジェクト解放 Set fso = Nothing Set newbook = Nothing Set objBook = Nothing Set wksSheet = Nothing Application.DisplayAlerts = True '失敗を戻す SaveSheetAsNewBook = False End Function Function GetTargetFileSeq(ByVal KindTargetFile As String, _ ByVal TargetFilePath As String) As Integer '指定ディレクトリに指定種別のファイルが存在するかチェックし、 '最新ファイルの連番を返す ' '引数1:KindTargetFile マスタ種別を表す文字列 '引数2:TargetFilePath マスタのあるディレクトリ '戻り値:成功=0以上 存在しない=-255 エラー=-1 Dim FSO As New FileSystemObject 'FSO Dim myFolder As Folder 'フォルダオブジェクト Dim objFile As File 'ファイルオブジェクト Dim strName As String 'ファイル名を格納 Dim strNonExt As String '拡張子を除外したファイル名を格納 Dim nameLen As Integer 'ファイル名の長さ Dim strSeqNum As String 'ファイル連番(文字列) Dim SeqNum As Integer 'ファイル連番 Dim MaxSeq As Integer '連番の最大値 Dim matchCount As Integer '存在判定のためのカウンタ 'エラーハンドリング On Error GoTo Hdl_ERROR '初期値設定 SeqNum = 0 MaxSeq = 0 matchCount = 0 'FSOの初期化 Set FSO = New FileSystemObject 'フォルダオブジェクトの指定 Set myFolder = FSO.GetFolder(TargetFilePath) 'フォルダオブジェクトのセット 'ファイルの読み込み For Each objFile In myFolder.Files '前方一致でファイル名を検査 If objFile.Name Like KindTargetFile & "*" & ".xls" Then 'ファイル名の取得を行う strName = objFile.Name 'ファイル名を取得し nameLen = Len(strName) 'ファイル名の長さを取得し strNonExt = FSO.GetBaseName(objFile.Path & _ "\" & objFile.Name) '拡張子抜きのファイル名を取得 nameLen = Len(strNonExt) '長さの補正を行う If DateCheck(Mid$(strNonExt, nameLen - 10, 8)) = True Then '日付が埋め込まれているか If Mid$(strNonExt, nameLen - 2, 1) = "_" And _ IsNumeric(Mid(strNonExt, nameLen - 1, 2)) = True Then '"_nn"の形式か判定 '連番の判定 strSeqNum = Mid$(strNonExt, nameLen - 1, 2) If IsNumeric(strSeqNum) = True Then '数値だったら SeqNum = CInt(strSeqNum) '文字列から数値にして If SeqNum > MaxSeq Then '数値の比較を行う MaxSeq = SeqNum End If matchCount = matchCount + 1 End If End If End If End If Next objFile If matchCount = 0 Then GetTargetFileSeq = -255 Else GetTargetFileSeq = MaxSeq End If Exit Function Hdl_ERROR: Set objFile = Nothing Set myFolder = Nothing Set FSO = Nothing GetTargetFileSeq = -1 End Function Function GetLatestFileName(ByVal KindTargetFile As String, _ ByVal TargetFilePath As String) As String '指定ディレクトリに指定種別のファイルが存在するかチェックし、 '最新ファイルのファイル名を返す ' '引数1:KindTargetFile マスタ種別を表す文字列 '引数2:TargetFilePath マスタのあるディレクトリ '戻り値:成功=ファイル名,存在しない="",エラー="%" Dim fso As New FileSystemObject 'FSO Dim myFolder As Folder 'フォルダオブジェクト Dim objFile As File 'ファイルオブジェクト Dim strName As String 'ファイル名を格納 Dim strNonExt As String '拡張子を除外したファイル名を格納 Dim nameLen As Integer 'ファイル名の長さ Dim strSeqNum As String 'ファイル連番(文字列) Dim SeqNum As Integer 'ファイル連番 Dim MaxSeq As Integer '連番の最大値 Dim latestFileName As String '最新ファイル名 Dim matchCount As Integer '存在判定のためのカウンタ 'エラーハンドリング On Error GoTo Hdl_ERROR '初期値設定 SeqNum = 0 MaxSeq = 0 matchCount = 0 latestFileName = "" 'FSOの初期化 Set fso = New FileSystemObject 'フォルダオブジェクトの指定 Set myFolder = fso.GetFolder(TargetFilePath) 'フォルダオブジェクトのセット 'ファイルの読み込み For Each objFile In myFolder.Files '前方一致でファイル名を検査 If objFile.Name Like KindTargetFile & "*" & ".xls" Then 'ファイル名の取得を行う strName = objFile.Name 'ファイル名を取得し nameLen = Len(strName) 'ファイル名の長さを取得し strNonExt = fso.GetBaseName(objFile.Path & _ "\" & objFile.Name) '拡張子抜きのファイル名を取得 nameLen = Len(strNonExt) '長さの補正を行う If DateCheck(Mid$(strNonExt, nameLen - 10, 8)) = True Then '日付が埋め込まれているか If Mid$(strNonExt, nameLen - 2, 1) = "_" And _ IsNumeric(Mid(strNonExt, nameLen - 1, 2)) = True Then '"_nn"の形式か判定 '連番の判定 strSeqNum = Mid$(strNonExt, nameLen - 1, 2) latestFileName = objFile.Name If IsNumeric(strSeqNum) = True Then '数値だったら SeqNum = CInt(strSeqNum) '文字列から数値にして If SeqNum > MaxSeq Then '数値の比較を行う MaxSeq = SeqNum latestFileName = objFile.Name End If matchCount = matchCount + 1 End If End If End If End If Next objFile If matchCount = 0 Then '見つからなかったら GetLatestFileName = "" Else '見つかったら GetLatestFileName = latestFileName End If Exit Function Hdl_ERROR: Set objFile = Nothing Set myFolder = Nothing Set fso = Nothing GetLatestFileName = "%" End Function Function JudgeSheetKind(ByVal TargetSheetName As String) As String '指定したシート名で前方から"_"を検索して、"_"の直前までの文字列を取得し、 'ファイル名のルールに沿っているかを判定する '判定した結果、ルールに沿うならばマスタ種別を表す文字列を返す Dim i As Integer '汎用カウンタ Dim myLen As Integer 'シート名の長さ Dim myPos As Variant '"_"の最初の位置 Dim strKind As String '最初の"_"までのシート名 Dim KindArray(3) As String 'マスタ種別ワードの格納用 Dim KindMax As Integer '配列最大値 Dim bolExistFlg As Boolean '合致フラグ 'フラグ初期化 bolExistFlg = False 'マスタ種別ワードの定義 KindArray(1) = PRFX_ACL KindArray(2) = PRFX_KSJ KindArray(3) = DIFF_RES_ACL '"_"の検索 myPos = InStr(1, TargetSheetName, "_", vbTextCompare) '文字検索中にエラーが起きたらそのまま抜ける If IsNull(myPos) = True Then JudgeSheetKind = "False" Exit Function End If '検索結果を判定して If myPos = 0 Then '検索結果が0だったら '指定文字列をそのまま格納 strKind = TargetSheetName Else '検索結果がヒットだったら '"_"の直前までの文字列を格納 strKind = Mid$(TargetSheetName, 1, myPos - 1) End If KindMax = UBound(KindArray) '種別の判定 For i = 1 To KindMax Step 1 If strKind = KindArray(i) Then bolExistFlg = True Exit For End If Next '結果の通知 If bolExistFlg = True Then '該当種別があったら JudgeSheetKind = strKind '種別文字列を返す Else JudgeSheetKind = "" 'なかったら空を返す End If End Function '対象シートをCSV化する 'Open strExFileName For Output Access Write As #Fn 'のような感じで事前にファイルをオープンさせておく必要あり ' Function ExportCSV(ByRef Fn As Integer, ByRef wksTarget As Worksheet) As Long Dim RangeNum As Range Dim Count As Long Dim Limit As Long Limit = wksTarget.UsedRange.Columns.Count - 1 On Error GoTo Hdl_ERROR For Each RangeNum In wksTarget.UsedRange.Rows For Count = 1 To Limit Write #Fn, "" & Trim(RangeNum.Columns(Count).Text); Next Count Write #Fn, "" & Trim(RangeNum.Columns(Count).Text) Next ExportCSV = True Exit Function Hdl_ERROR: ExportCSV = Count End Function |