Dim strFileName As String
Dim BkLog() As Variant 'Logデータ退避用配列
Dim EndLog() As Variant 'END行格納用
Dim GYO As Long '格納するセルの行数
Private Sub UserForm_Activate()
'システム日付をセット
If MultiPage1.Value = 0 Then
Cmb_Dtp.Value = Now
Else
Cmb_Dtp2.Value = Now
End If
End Sub
Private Sub Cmd_End_Click()
Call Sub終了処理
End Sub
Private Sub MultiPage1_Change()
If MultiPage1.Value = 0 Then
Cmb_Dtp.Value = Now
Else
Cmb_Dtp2.Value = Now
End If
End Sub
Private Sub Cmd_Sakusei_Click()
'************************************
'* 出勤簿作成ボタン
'************************************
Dim WkDate As String
Dim I As Integer
Dim xlAPP As Application ' Applicationオブジェクト
Dim objWBK As Workbook ' ワークブックObject
Dim swESC As Boolean ' Escキー判定
'処理確認メッセージ
If FunMsg(Format(Cmb_Dtp.Value, "yyyy/mm/dd") & "の出勤簿を作成します。よろしいですか?", vbQuestion + vbYesNo, "追加確認") = vbNo Then
'処理しない
Exit Sub
End If
Set xlAPP = Application
With xlAPP
.ScreenUpdating = False ' 画面描画停止
.EnableEvents = False ' イベント動作停止
.EnableCancelKey = xlErrorHandler ' Escキーでエラートラップする
'''''.Cursor = xlWait 'カーソルを砂時計にする
End With
On Error GoTo Button1_Click_ESC
'選択した日付のcsvについて繰り返す
Do While strFileName <> ""
' Escキー打鍵判定
DoEvents
If swESC = True Then
' 中断するのかをメッセージで確認
If MsgBox("中断キーが押されました。ここで終了しますか?", _
vbInformation + vbYesNo) = vbYes Then
GoTo Button1_Click_EXIT
Else
swESC = False
End If
End If
'----------------
' Escキー脱出用行ラベル
Button1_Click_ESC:
If Err.Number = 18 Then
' EscキーでのエラーRaise
swESC = True
Resume
ElseIf Err.Number = 1004 Then
' 隠しシートや印刷対象なしの実行時エラーは無視
Resume Next
Else
' その他のエラーはメッセージ表示後終了
MsgBox Err.Description
End If
'----------------
' 処理終了
Button1_Click_EXIT:
With xlAPP
.StatusBar = False ' ステータスバーを復帰
.EnableEvents = True ' イベント動作再開
.EnableCancelKey = xlInterrupt ' Escキー動作を戻す
.Cursor = xlDefault ' カーソルをデフォルトにする
.ScreenUpdating = True ' 画面描画再開
End With
Set objWBK = Nothing
Set xlAPP = Nothing
End Sub
Private Sub Sub配列格納(pFile As String)
'************************************************
'* Logファイルの内容を配列に格納
'************************************************
Const cnsTITLE = "テキストファイル読み込み処理"
Dim xlAPP As Application ' Applicationオブジェクト
Dim intFF As Integer ' FreeFile値
Dim OpenFile As String ' OPENするファイル名(フルパス)
Dim lngREC As Long ' レコード件数カウンタ
Dim X(3) As Variant ' 読み込んだレコード内容
Dim strREC As String ' レコード領域
Dim POS1 As Long ' レコード文字位置INDEX
Dim POS2 As Long ' レコード文字位置INDEX
Dim IX1 As Long ' CSV項目カラムINDEX
'FreeFile値の取得(以降この値で入出力する)
intFF = FreeFile
'指定ファイルをOPEN(入力モード)
Open OpenFile For Input As #intFF
'ファイルのEOF(End of File)まで繰り返す
Do Until EOF(intFF)
'レコード件数カウンタの加算
lngREC = lngREC + 1
xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)"
'ファイルを行で読み込み
Line Input #intFF, strREC
'LineInputより自分で半角カンマを探しCSV→項目分割させる
POS1 = 1
IX1 = 0
Do While POS1 <= Len(strREC)
POS2 = InStr(POS1, strREC, ",", vbTextCompare)
If POS2 < POS1 Then
POS2 = Len(strREC) + 1
End If
X(IX1) = Trim$(Mid$(strREC, POS1, POS2 - POS1))
'シングルコーテーション、ダブルコーテーションで囲まれている場合は両端文字を取り除く
If (((Left$(X(IX1), 1) = """") And (Right$(X(IX1), 1) = """")) Or _
((Left$(X(IX1), 1) = "'") And (Right$(X(IX1), 1) = "'"))) Then
X(IX1) = Trim$(Mid$(X(IX1), 2, Len(X(IX1)) - 2))
End If
POS1 = POS2 + 1
IX1 = IX1 + 1
Loop
'配列に格納処理
If lngREC = 1 Then
'START行は最初のcsvファイルだけ配列に格納
If GYO = 1 Then
'一応選択日とLogの日付をチェック
If Format(X(0), "yyyy/mm/dd") <> Format(Cmb_Dtp.Value, "yyyy/mm/dd") Then
'処理確認メッセージ
If FunMsg("選択日(" & Format(Cmb_Dtp.Value, "yyyy/mm/dd") & ")とLog(" & Format(X(0), "yyyy/mm/dd") & ")の日付が違います。よろしいですか?", vbQuestion + vbYesNo, "追加確認") = vbNo Then
'処理しない
Close #intFF ' 指定ファイルをCLOSE
xlAPP.StatusBar = False
Exit Sub
End If
End If
Else
'配列に格納
ReDim Preserve BkLog(4, GYO)
BkLog(1, GYO) = X(0)
BkLog(2, GYO) = X(1)
BkLog(3, GYO) = X(2)
BkLog(4, GYO) = X(3)
GYO = GYO + 1
End If
End If
Loop
'指定ファイルをCLOSE
Close #intFF
xlAPP.StatusBar = False
End Sub
Private Sub Sub出勤簿()
'************************************************
'* 出勤簿を作成
'************************************************
Const cnsTITLE = "出勤簿出力処理"
Dim xlAPP As Application ' Applicationオブジェクト
Dim WkDate As String
Dim WkDd As String
'Applicationオブジェクト取得
Set xlAPP = Application
xlAPP.Cursor = xlWait 'カーソルを砂時計にする
Private Sub Subブック作成(pYymm As String, pDd As String)
'************************************************
'* ブックを新規に作成
'************************************************
Dim MyWs As Worksheet '自シート
'新規作成なのでアクティブシート以外のシートをすべて無条件に削除
With Application
.DisplayAlerts = False
For Each MyWs In Worksheets
If MyWs.Name <> ActiveSheet.Name Then MyWs.Delete
Next
.DisplayAlerts = True
End With
End Sub
Private Sub SubシートChk(pYymm As String, pDd As String)
'************************************************
'* シートがあるかチェック
'************************************************
Dim MyWs As Worksheet '自シート
Dim MyFlag As Boolean 'チェック用フラグ
Dim xlAPP As Application ' Applicationオブジェクト
'シートがあるかチェック
MyFlag = False
For Each MyWs In Worksheets
If MyWs.Name = pDd Then
MyFlag = True
Exit For
End If
Next
If MyFlag = True Then
'シートがあったので削除して新たに作り直す
On Error Resume Next
With Application
.DisplayAlerts = False '---警告メッセージ非表示
Sheets("pDd").Delete
.DisplayAlerts = True '---警告メッセージ表示
End With
End If
'日付順になるようにシートを追加
MyFlag = False
For Each MyWs In Worksheets
If CInt(MyWs.Name) > CInt(pDd) Then
MyFlag = True
Exit For
End If
Next
If MyFlag = False Then
Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = pDd
Else
Worksheets.Add(Before:=Worksheets(MyWs.Name)).Name = pDd
End If
End Sub
Private Sub Sub出勤簿作成(pYymm As String, pDd As String)
'************************************************
'* 出勤簿を作成する
'************************************************
Const cnsTITLE = "出勤簿作成処理"
Dim Cnt As Long
Dim InTime As Long
Dim InName As Long
Dim OutTime As Long
Dim OutName As Long
Dim WkTime As String
Dim BkX As Integer 'キャンセル用
Dim BkY As Integer 'キャンセル用
Else
'退社
Cells(OutName, 3).Value = BkLog(4, Cnt)
BkX = 3
BkY = OutName
OutName = OutName + 1
End If
End Select
'行を加算
Cnt = Cnt + 1
Loop
'ブックを閉じる
ActiveWorkbook.Close SaveChanges:=True
End Sub
Private Sub Cmd_Csv_Click()
'************************************
'* CSV作成ボタン
'************************************
Dim WkDate As String
Dim I As Integer
Dim xlAPP As Application ' Applicationオブジェクト
Dim objWBK As Workbook ' ワークブックObject
Dim swESC As Boolean ' Escキー判定
'処理確認メッセージ
If FunMsg(Format(Cmb_Dtp2.Value, "yyyy/mm/dd") & "のCSVを作成します。よろしいですか?", vbQuestion + vbYesNo, "追加確認") = vbNo Then
'処理しない
Exit Sub
End If
Set xlAPP = Application
With xlAPP
.ScreenUpdating = False ' 画面描画停止
.EnableEvents = False ' イベント動作停止
.EnableCancelKey = xlErrorHandler ' Escキーでエラートラップする
'''''.Cursor = xlWait ' カーソルを砂時計にする
End With
On Error GoTo Button1_Click_ESC
'選択した日付のcsvについて繰り返す
Do While strFileName <> ""
' Escキー打鍵判定
DoEvents
If swESC = True Then
' 中断するのかをメッセージで確認
If MsgBox("中断キーが押されました。ここで終了しますか?", _
vbInformation + vbYesNo) = vbYes Then
GoTo Button1_Click_EXIT
Else
swESC = False
End If
End If
'----------------
' Escキー脱出用行ラベル
Button1_Click_ESC:
If Err.Number = 18 Then
' EscキーでのエラーRaise
swESC = True
Resume
ElseIf Err.Number = 1004 Then
' 隠しシートや印刷対象なしの実行時エラーは無視
Resume Next
Else
' その他のエラーはメッセージ表示後終了
MsgBox Err.Description
End If
'----------------
' 処理終了
Button1_Click_EXIT:
With xlAPP
.StatusBar = False ' ステータスバーを復帰
.EnableEvents = True ' イベント動作再開
.EnableCancelKey = xlInterrupt ' Escキー動作を戻す
.Cursor = xlDefault ' カーソルをデフォルトにする
.ScreenUpdating = True ' 画面描画再開
End With
Set objWBK = Nothing
Set xlAPP = Nothing
End Sub
Private Sub Sub作成(pDate As String)
'************************************************
'* まとめたLogのcsvを作成
'************************************************
Const cnsTITLE = "CSVテキストファイル出力処理"
Dim xlAPP As Application ' Applicationオブジェクト
Dim intFF As Integer ' FreeFile値
Dim SvFile As String ' OPENするファイル名(フルパス)
Dim SvGyo As Long ' 収容するセルの行
Dim lngREC As Long ' レコード件数カウンタ
Dim I As Long ' カラム(Work)
'Applicationオブジェクト取得
Set xlAPP = Application
SvFile = "C:\ComiPenSample\Log\" & pDate & ".csv"
'FreeFile値の取得(以降この値で入出力する)
intFF = FreeFile
'指定ファイルをOPEN(出力モード)
Open SvFile For Output As #intFF