'--------------------------------------------------
'プロシージャの概要:
'処理名:importExcel条件付き書式
'概要:Excelブックの条件付き書式(数式タイプ)を取得し、t数式テーブルに格納する
'--------------------------------------------------
Public Sub importExcel条件付き書式()
Dim db As Database
Dim rs As Recordset
Dim xlApp As Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim rngFormatCondition As Range
Dim objFormatCondition As Object
Dim lngRuleNumber As Long
Dim lngConditionIndex As Long
Dim strSQL As String
Dim blnSheetProtected As Boolean
Dim strProtectPassword As String
'定数宣言
Const C_EXCEL_FILE_PATH As String = "C:\temp\target.xlsx" 'Excelファイルパス(適宜変更)
Const C_TABLE_NAME As String = "t数式"
Const C_PASSWORD_BLANK As String = ""
Const C_PROTECT_ERROR_MESSAGE As String = "シート保護のため解析不可"
'データベースオブジェクト取得
Set db = CurrentDb
'既存データ削除
strSQL = "DELETE FROM " & C_TABLE_NAME
db.Execute strSQL
'Excelアプリケーション起動
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False
xlApp.DisplayAlerts = False
'Excelブック開く
Set wb = xlApp.Workbooks.Open(C_EXCEL_FILE_PATH)
'レコードセット開く
strSQL = "SELECT * FROM " & C_TABLE_NAME
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
'シート単位で処理
For Each ws In wb.Worksheets
With ws
'シート保護状態確認
blnSheetProtected = False
If .ProtectContents Then
blnSheetProtected = True
'パスワード空白で保護解除試行
On Error Resume Next
.Unprotect C_PASSWORD_BLANK
If Err.Number <> 0 Then
'パスワード解除失敗時の処理
Err.Clear
On Error GoTo 0
'エラーレコード追加
rs.AddNew
rs!ブック名 = wb.Name
rs!シート名 = .Name
rs!セル番地 = "N/A"
rs!ルール番号 = 0
rs!条件タイプ = 0
rs!数式 = C_PROTECT_ERROR_MESSAGE
rs!Formula2 = Null
rs!優先順位 = 0
rs!停止条件 = False
rs.Update
'次のシートへ
GoTo NextSheet
End If
On Error GoTo 0
End If
'条件付き書式の取得処理
On Error Resume Next
For lngConditionIndex = 1 To .Cells.FormatConditions.Count
Set objFormatCondition = .Cells.FormatConditions(lngConditionIndex)
'数式タイプ(xlExpression=2)のみ処理
If objFormatCondition.Type = 2 Then 'xlExpression
lngRuleNumber = lngRuleNumber + 1
'レコード追加
rs.AddNew
rs!ブック名 = wb.Name
rs!シート名 = .Name
'適用範囲取得
rs!セル番地 = objFormatCondition.AppliesTo.Address(False, False)
rs!ルール番号 = lngRuleNumber
rs!条件タイプ = objFormatCondition.Type
'数式取得(Formula1)
If Err.Number = 0 Then
rs!数式 = objFormatCondition.Formula1
Else
rs!数式 = Null
Err.Clear
End If
'Formula2取得(存在する場合)
On Error Resume Next
rs!Formula2 = objFormatCondition.Formula2
If Err.Number <> 0 Then
rs!Formula2 = Null
Err.Clear
End If
'優先順位取得
On Error Resume Next
rs!優先順位 = objFormatCondition.Priority
If Err.Number <> 0 Then
rs!優先順位 = lngRuleNumber
Err.Clear
End If
'停止条件取得
On Error Resume Next
rs!停止条件 = objFormatCondition.StopIfTrue
If Err.Number <> 0 Then
rs!停止条件 = False
Err.Clear
End If
rs.Update
End If
Next lngConditionIndex
On Error GoTo 0
'ルール番号リセット
lngRuleNumber = 0
'シート保護を元に戻す
If blnSheetProtected Then
.Protect C_PASSWORD_BLANK
End If
NextSheet:
End With
Next ws
'オブジェクト解放
rs.Close
Set rs = Nothing
Set db = Nothing
'Excelブック閉じる
wb.Close SaveChanges:=False
Set wb = Nothing
'Excel終了
xlApp.Quit
Set xlApp = Nothing
MsgBox "条件付き書式の取得が完了しました。", vbInformation
End Sub