EXCELからACCESSに登録
EXCELからACCESSに登録する部分。
チェックロジックの中に色々と詰め込む。
何となく気に入らない作りながら仕方がない。
今後、色々と見直しする。
チェックロジックの中に色々と詰め込む。
何となく気に入らない作りながら仕方がない。
今後、色々と見直しする。
Function ExcelToAccess(val_ExcelPath,val_AccessPath,val_EmpDate)
Dim cn, rs 'ACCESSデータベース
Dim objExcel 'EXCEL
Dim xlSheet
Dim objFso 'ファイル存在チェック用
Dim argRtn(3) '引数チェック用
Dim DataBaseName
Dim strSQL
Dim ExcelName
Dim EmpDate '現在日付取得(登録日日算出)
Dim keyDate
Dim OpFlg
Dim i 'ループカウンタ(タイトル行除外スタート)
Dim j '処理件数カウント用
Dim LastRow 'EXCELL最終行
Dim KeyCell 'EXCEL行NO(抽出条件ヒット用
Dim KeyOpFlgCell '手動除外用
Dim CellValue '格納用ワーク
Dim strEmpCol
strEmpCol ="X" 'EXCELの列
Dim strOpCol
strOpCol ="XX" 'EXCELの列
Dim rsCount 'レコード件数カウント用
Dim EmpMCclum
EmpMCclum = "X"
Dim InputArea
Dim InputDate '
InputDate = Mid(Now(),6,5) & "XX"
Dim InEmpNo
Dim InName
Dim NoCell
Dim NameCell
Dim oColum1
Dim oColum2
'--------------------------------------------------------------
'/* 引数エラーチェック
argRtn(0)= argumentChecker(val_ExcelPath)
argRtn(1)= argumentChecker(val_AccessPath)
argRtn(2)= argumentChecker(val_EmpDate)
If argRtn(0) ="False" Or argRtn(1) ="False" Or argRtn(2)="False" Then
ExcelToAccess = "False"
Logrtn = OutLogger("[Err],ファイル名もしくは日付が空欄です。")
If Logrtn = "False" Then
WScript.Echo LErrMsg
End If
Exit Function
Else
DataBaseName = val_AccessPath
ExcelName = val_ExcelPath
EmpDate = CDate(val_EmpDate)
End If
'//* ACCESSデータベースファイル存在チェック
Set objFso = CreateObject("Scripting.FileSystemObject")
If objFso.FileExists(DataBaseName) Then
Set cn = CreateObject("ADODB.Connection")
cn.CursorLocation = 3 ' クライアントサイドカーソルに変更(レコードセットカウント対策)
cn.Open "Provider = Microsoft.ACE.OLEDB.12.0; " & _
"Data Source = " & DataBaseName & ";"
Set rs = CreateObject("ADODB.Recordset")
Else
ExcelToAccess = "False"
WScript.Echo CErrMsg
Logrtn = OutLogger("[Err],ACCESSデータベースが存在しません。ACCESSデータベースを確認してください。")
If Logrtn = "False" Then
WScript.Echo LErrMsg
End If
Set objFso = Nothing
Exit Function
End If
Set objFso = Nothing
'//* EXCELファイル存在チェック
Set objFso = CreateObject("Scripting.FileSystemObject")
If objFso.FileExists(ExcelName) Then
Set objExcel = CreateObject("Excel.Application")
objExcel.Workbooks.Open(ExcelName)
Set xlSheet = objExcel.Worksheets(1)
objExcel.Visible = False
Else
ExcelToAccess = "False"
Logrtn = OutLogger("[Err],EXCELファイルが存在しません。")
If Logrtn = "False" Then
WScript.Echo LErrMsg
End If
Set objFso = Nothing
Exit Function
End If
Set objFso = Nothing
'
LastRow = xlSheet.UsedRange.Rows.Count 'EXCEL最終行取得
j=0 '処理件数初期化
For i = 5 To LastRow Step 1
'DoはContinue対応用ループ
'(http://mblog.excite.co.jp/user/yozda/entry/detail/?id=9314000)
Do
KeyCell = strEmpCol & i
keyDate = xlSheet.Range(keyCell).Value
KeyOpFlgCell = strOpCol & i
OpFlg = xlSheet.Range(KeyOpFlgCell).Value
If keyDate > EmpDate And InStr(OpFlg,"XX")=0 Then
'/* 日が合致した行のデータを取得 */
NoCell = "X" & i
NameCell= "X" & i
oColum1=xlSheet.Range(NoCell).Value
oColum2=xlSheet.Range(NameCell).Value
'/* チェックロジック */
'/* チェックロジック */
'/* ACCESSデータベースへの登録 */
'ACCESSデータベースへの接続
strSQL=""
strSQL= strSQL & " INSERT INTO ACCESSデータベース( "
strSQL= strSQL & " )"
strSQL= strSQL & " VALUES ( "
strSQL= strSQL & "'" & oColum1 & "'" & ", "
strSQL= strSQL & "'" & oColum2 & "'"
strSQL= strSQL & " );"
cn.BeginTrans 'トランザクション開始
Set rs =cn.Execute(strSQL)
If Err.Number = 0 Then
cn.CommitTrans 'コミット
Else
ExcelToAccess = "False"
objADO.RollbackTrans 'ロールバック
Logrtn = OutLogger("[Err],"& oEmpNo & ":" & oName & "ACCESSデータベースの追加に失敗しました。手動で処理してください。")
If Logrtn = "False" Then
WScript.Echo LErrMsg
End If
Exit Do
End If
'/* EXCEL登録/
'日付をセットする。
InputArea = EmpMCclum & i
CompArea = strOpCol & i
xlSheet.Range(InputArea).Value = InputDate
xlSheet.Range(CompArea).Value = "XX"
'EXCELを保存
objExcel.DisplayAlerts = False
objExcel.Workbooks(1).Save
j=j+1
End If
Loop Until 1
Next
If j=0 Then
ExcelToAccess = "False"
Exit Function
End If
Logrtn = OutLogger("[Comp],ACCESSデータベース登録完了者" & j & "件です")
If Logrtn = "False" Then
WScript.Echo LErrMsg
End If
objExcel.DisplayAlerts = False
objExcel.Application.Quit
Set rs = Nothing
Set cn = Nothing
ExcelToAccess = "True"
End Function
コメント