Attribute VB_Name = "実装処理"
Option Explicit
Public Const TITLE_NAME_BY_TARGET_DIR = "▼処理対象ディレクトリ"
Public Const TITLE_NAME_BY_DO_SUB_DIR = "▼配下のディレクトリも対象"
Public Const TEMPLATE_SHEET_NAME = "雛形"
Public Const RESULT_SHEET_NAME = "処理結果"
Public Const FILE_EXTENSION = "xls,xlsx,xlsm"
Private Const TITLE_▼一括エクスポート先 = "▼一括エクスポート先"
Private Const TITLE_▼一括インポート元 = "▼一括インポート元"
Private Const ROOT_DIR_NAME = "EXPORT"
Private Const オプション名_処理区分名リスト = "エクスポート,インポート"
Private Const RESULT_COL_LENGTH = 3
Private TITLE_▼一括エクスポート先List As Variant
Private TITLE_▼一括インポート元List As Variant
Dim resultCount As Long
Public 処理日時 As String
Private オプションボタンリスト As Variant
Public Type optionButtonSelectedName
value As String
End Type
Private 処理区分値名 As optionButtonSelectedName
Private ファイルCLOSE方法全ブック対象確認済フラグ As Boolean
Private ファイルCLOSE方法確認結果 As Long
Function 全体前処理(targetSheet As Worksheet)
resultCount = 0
ファイルCLOSE方法全ブック対象確認済フラグ = False
TITLE_▼一括エクスポート先List = タイトル名指定でリスト値を取得(TITLE_▼一括エクスポート先, targetSheet)
TITLE_▼一括インポート元List = タイトル名指定でリスト値を取得(TITLE_▼一括インポート元, targetSheet)
処理日時 = Format(Date, "yyyymmdd") & Format(Time, "hhnnss")
オプションボタンリスト = getShapesProperty(targetSheet, msoFormControl, xlOptionButton)
Dim 対象オプションボタンリスト() As Variant
Dim 処理区分値リスト(2) As String
Dim i, j, k, count As Long
Dim リスト名() As String
リスト名 = Split(オプション名_処理区分名リスト, ",")
count = 0
For i = LBound(オプションボタンリスト) To UBound(オプションボタンリスト)
For j = LBound(リスト名) To UBound(リスト名)
If オプションボタンリスト(i, 1) = リスト名(j) Then
count = count + 1
End If
Next j
Next i
ReDim Preserve 対象オプションボタンリスト(count - 1, UBound(オプションボタンリスト, 2) + 1)
count = 0
For i = LBound(オプションボタンリスト) To UBound(オプションボタンリスト)
For j = LBound(リスト名) To UBound(リスト名)
If オプションボタンリスト(i, 1) = リスト名(j) Then
For k = LBound(オプションボタンリスト, 2) To UBound(オプションボタンリスト, 2)
対象オプションボタンリスト(count, k) = オプションボタンリスト(i, k)
Next k
count = count + 1
End If
Next j
Next i
For i = LBound(オプションボタンリスト) To UBound(オプションボタンリスト)
If オプションボタンリスト(i, 2) = 1 Then
処理区分値名.value = オプションボタンリスト(i, 1)
End If
Next i
End Function
Function ブックOPEN後処理(fileName As Variant, targetWB As Workbook, ByRef results() As Variant) As Boolean
Dim ルートパス, 相対パス, ブック名 As String
Dim ファイル操作情報 As ファイル操作情報
Dim fileExtention As Variant
fileExtention = Split(FILE_EXTENSION_OF_MODULE, ",")
Dim moduleFileNames() As String
Dim moduleFileName As Variant
Dim ファイル情報 As ファイル操作情報
Dim モジュールファイル情報 As ファイル操作情報
ファイル情報 = ファイル操作情報の取得(fileName)
相対パス = ファイル情報.分割ファイル情報(0)
ブック名 = targetWB.Name
If 処理区分値名.value = "エクスポート" Then
If 0 > isDirectoryExist(CStr(TITLE_▼一括エクスポート先List(0))) Then
MsgBox "入力欄「▼一括エクスポート先」で指定したディレクトリが存在しません。処理を中断します。"
End
End If
ルートパス = TITLE_▼一括エクスポート先List(0) & PATH_DELIMITER & ROOT_DIR_NAME
Call ディレクトリ作成(ルートパス, 処理日時, "")
Call ディレクトリ作成(ルートパス, 処理日時, 相対パス)
Call ExportModules(ルートパス & 処理日時 & PATH_DELIMITER & 相対パス & PATH_DELIMITER, targetWB)
Call doRepeat(ルートパス & 処理日時 & PATH_DELIMITER & 相対パス & PATH_DELIMITER, fileExtention, moduleFileNames, True)
If 0 < IsArrayEx(moduleFileNames) Then
For Each moduleFileName In moduleFileNames
モジュールファイル情報 = ファイル操作情報の取得(moduleFileName)
Call reDimResult(RESULT_COL_LENGTH, results)
results(0, resultCount) = モジュールファイル情報.親ディレクトリまでのフルパス
results(1, resultCount) = ファイル情報.対象ファイル名
results(2, resultCount) = モジュールファイル情報.対象ファイル名
resultCount = resultCount + 1
Next
End If
ElseIf 処理区分値名.value = "インポート" Then
If 0 > isDirectoryExist(CStr(TITLE_▼一括インポート元List(0))) Then
MsgBox "入力欄「▼一括エクスポート元」で指定したディレクトリが存在しません。処理を中断します。"
End
End If
ルートパス = TITLE_▼一括インポート元List(0)
Call doRepeat(ルートパス, fileExtention, moduleFileNames, True)
Dim ファイルパス As String
ファイル情報 = ファイル操作情報の取得(fileName)
Call DeleteComponents(targetWB)
For Each moduleFileName In moduleFileNames
モジュールファイル情報 = ファイル操作情報の取得(moduleFileName)
If モジュールファイル情報.対象ディレクトリ名 = ファイル情報.分割ファイル情報(0) Then
Call ImportComponents(targetWB, モジュールファイル情報.フルパス_ファイル名, モジュールファイル情報.分割ファイル情報(0))
Call reDimResult(RESULT_COL_LENGTH, results)
results(0, resultCount) = ファイル情報.フルパス
results(1, resultCount) = ファイル情報.対象ファイル名
results(2, resultCount) = モジュールファイル情報.対象ファイル名
resultCount = resultCount + 1
End If
Next
End If
ブックOPEN後処理 = True
End Function
Function シート毎処理(fileName As Variant, targetSheet As Worksheet, ByRef results() As Variant)
End Function
Function ブックCLOSE前処理(fileName As Variant, targetWB As Workbook, ByRef results() As Variant) As Long
Dim lng確認結果 As Long
Dim txt確認メッセージ(0) As String
If 処理区分値名.value = "エクスポート" Then
ファイルCLOSE方法確認結果 = ファイルCLOSE方法区分.保存しないで閉じる
ElseIf 処理区分値名.value = "インポート" Then
If ファイルCLOSE方法全ブック対象確認済フラグ = False Then
txt確認メッセージ(0) = "ファイルを保存して閉じてよろしいですか?"
lng確認結果 = 確認ダイアログ表示(txt確認メッセージ, False)
If lng確認結果 = vbYes Then
ファイルCLOSE方法確認結果 = ファイルCLOSE方法区分.保存して閉じる
txt確認メッセージ(0) = "ファイルを保存して閉じる設定を、全処理対象ファイルに適用しますか?"
lng確認結果 = 確認ダイアログ表示(txt確認メッセージ, False)
If lng確認結果 = vbYes Then
ファイルCLOSE方法全ブック対象確認済フラグ = True
End If
ElseIf lng確認結果 = vbNo Then
ファイルCLOSE方法確認結果 = ファイルCLOSE方法区分.保存しないで閉じない
txt確認メッセージ(0) = "ファイルを保存せずに開いておく設定を、全処理対象ファイルに適用しますか?"
lng確認結果 = 確認ダイアログ表示(txt確認メッセージ, False)
If lng確認結果 = vbYes Then
ファイルCLOSE方法全ブック対象確認済フラグ = True
End If
End If
End If
End If
ブックCLOSE前処理 = ファイルCLOSE方法確認結果
End Function
Function 実行結果内容編集処理(ByRef var変換元() As Variant) As Variant
End Function
Sub 実行結果書式編集処理(ByRef targetSheet As Worksheet)
End Sub
Function 全体後処理(targetSheet As Worksheet)
End Function
Public Sub ExportModules(outputPath As String, targetWB As Workbook)
Dim targetModule As Object
Dim fileExt As String
For Each targetModule In targetWB.VBProject.VBComponents
fileExt = GetExtFromModuleType(targetModule.Type)
If fileExt <> "" Then
Dim filePath As String
filePath = outputPath & "\" & targetModule.Name & "." & fileExt
targetModule.Export filePath
Debug.Print "Save " & targetModule.Name
End If
Next
End Sub
Public Sub ImportComponents(targetWB As Workbook, フルパス_ファイル名 As String, Optional ByVal 分割ファイル情報_0 As String = "")
If "" = 分割ファイル情報_0 Then
Call DeleteComponents(targetWB)
Else
Call DeleteComponents(targetWB, 分割ファイル情報_0)
End If
targetWB.VBProject.VBComponents.Import フルパス_ファイル名
End Sub
Public Sub DeleteComponents(targetWB As Workbook, Optional ByVal 分割ファイル情報_0 As String = "")
Dim targetModule As VBComponent
For Each targetModule In targetWB.VBProject.VBComponents
If "" <> GetExtFormModuleType(targetModule.Type) Then
If "" = 分割ファイル情報_0 Then
targetWB.VBProject.VBComponents.Remove targetModule
Else
If targetModule.Name = 分割ファイル情報_0 Then
targetWB.VBProject.VBComponents.Remove targetModule
End If
End If
End If
Next targetModule
End Sub
Private Function GetExtFromModuleType(aType As Integer) As String
Const vbext_ct_StdModule As Variant = 1
Const vbext_ct_MSForm As Variant = 2
Const vbext_ct_ClassModule As Variant = 3
Select Case aType
Case vbext_ct_StdModule
GetExtFromModuleType = "bas"
Case vbext_ct_ClassModule
GetExtFromModuleType = "cls"
Case vbext_ct_MSForm
GetExtFromModuleType = "frm"
End Select
End Function