アットウィキロゴ
note4recurrent @ ウィキ
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

note4recurrent @ ウィキ

VBA_app

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集

Option Explicit Type keisan

   saveName As String '保存名
   payW As String '時給1・月給2
   choiceAge As String '年齢区分
   workT As Integer '時間
   payH As Long '時給(交通費なし)
   payM As Long  '月給(交通費なし):時給の場合はpayH×workT
   transport As Integer '交通費
   remuneration As Long  '月額報酬 月給の場合はそのまま、時給の場合は時給×単価+交通費
   health As Long  '健康保険
   welfare As Long  '厚生年金
   care As Long  '介護保険
   job As Long  '雇用保険

End Type

Sub 社会保険料算出_Click()

   '時給か月収が選択されていない場合
   Dim choiceHM  As String
       choiceHM = Cells(7, 4).Value
       If choiceHM = "" Then
           MsgBox "時給もしくは月給を選択してください。"
           Exit Sub
       End If
   
   Dim choiceAge As String
       choiceAge = Cells(7, 6).Value
       If choiceAge = "" Then
           MsgBox "年齢を選択してください。"
           Exit Sub
       End If
   Dim hour As Integer
   Dim transport As Long
   Dim splInput As Long
   Dim payInput As Long
   '入力値が数値じゃない場合メッセージを表示する。
   If Not IsNumeric(Cells(5, 8)) Or Not IsNumeric(Cells(5, 12)) Or Not IsNumeric(Cells(5, 16)) Or Not IsNumeric(Cells(7, 16)) Then
       MsgBox "数字を入力してください。"
       Exit Sub
   End If
   '入力値=変数
   If Cells(7, 6) = 1 Then
       choiceAge = "39歳以下"
   Else
       choiceAge = "40歳以上"
   End If
   transport = Cells(7, 16).Value
   splInput = Cells(5, 12).Value
   payInput = Cells(5, 16).Value
   '勤務時間 入力がなければ160時間とする
   If Cells(5, 8) = 0 Then
       hour = 160
   Else
       hour = Cells(5, 8)
   End If
   
   '年齢、支給額、入金額が未入力の場合メッセージを出す
  If splInput = 0 Or payInput = 0 Then
       If choiceHM = "1" Then
           hour = 0
       End If
       MsgBox "入力してください。"
       Exit Sub
   End If
   ActiveSheet.Unprotect
   '保険料シートのため
   Dim i As Integer
   Dim j As Integer
   
   Dim payH As Long '時給(交通費なし)
   Dim payM As Long  '月給(交通費なし)
   Dim splH As Long  '月の入金額
   Dim splM As Long  '時間の入金額
   Dim remuneration As Long  '月額報酬
   Dim health As Long  '健康保険
   Dim welfare As Long  '厚生年金
   Dim care As Long  '介護保険
   Dim job As Long  '雇用保険
   Dim total As Long  '保険合計=健康保険+厚生年金+介護保険+雇用保険
   Dim cost As Long  '経費合計(交通費有)=保険合計+月額報酬
   Dim costNoTransport As Long  '経費合計(交通費無)=保険合計+月給
   Dim del As Long  '差額(交通費有)=入金額ー経費合計(交通費有)
   Dim delNoTransport As Long  '差額(交通費無)=入金額ー経費合計(交通費無)
   'menuにメニュー、datasheetに保険料
   Dim menu As Worksheet
   Set menu = ThisWorkbook.Worksheets("メニュー")
   Dim datasheet As Worksheet
   Set datasheet = ThisWorkbook.Worksheets("保険料")
   '保存用
   Range("F19").Value = choiceAge
   Range("G19").Value = hour
   Range("H19").Value = transport
   '時給の時
   If choiceHM = 1 Then
       splH = splInput
       splM = splH * hour
       Range("I19").Value = splM
   
       '支給金額を計算
       For i = -2 To 2
           '時給が-100円、-50円、0円、50円、+100円のパターンを表示
           payH = payInput + i * 50
           Cells(14 + i, 10).Value = payH
           '報酬月給(時給×月の勤務時間+交通費)
           payM = Cells(14 + i, 10).Value * hour
           remuneration = payM + transport
           Cells(14 + i, 11).Value = remuneration
   
           '保険料シートを上から回す
           For j = 6 To 55
   
               '「保険料」の報酬月額(以上)<月給<「保険料」の報酬月額(未満)
               If datasheet.Cells(j, 3).Value <= remuneration And remuneration < datasheet.Cells(j, 4) Then
   
                   '健康保険
                   health = datasheet.Cells(j, 6).Value
                   Cells(14 + i, 12) = health
                   '厚生年金
                   welfare = datasheet.Cells(j, 9).Value
                   Cells(14 + i, 13) = welfare
                   '介護保険
                   If choiceAge = "39歳以下" Then
                       care = 0
                   Else
                       care = datasheet.Cells(j, 7).Value
                   End If
                   Cells(14 + i, 14).Value = care
                   '雇用保険
                   job = Round((Cells(14 + i, 11).Value / 160), 0)
                   Cells(14 + i, 15).Value = job
                   '保険合計
                   total = health + welfare + care + job
                   Cells(14 + i, 16).Value = total
   
                   '経費合計(交通費有)=保険合計+月額報酬
                   cost = total + remuneration
                   Cells(14 + i, 17).Value = cost
   
                   '経費合計(交通費無)=保険合計+月給
                   costNoTransport = total + payM
                   Cells(14 + i, 18).Value = costNoTransport
   
                   '差額(交通費有)=時給*160-経費合計(交通費有)
                   del = splM - cost
                   Cells(14 + i, 19).Value = del
   
                   '差額(交通費なし)=時給*160-経費合計(交通費無)
                   delNoTransport = splM - costNoTransport
                   Cells(14 + i, 20).Value = delNoTransport
                   Exit For
               End If
           Next
       Next
   '月給の時
   Else
       splM = splInput
       splH = Round((splM / hour), 0)
       Range("I19").Value = splM
   
       For i = -2 To 2
           '報酬月額が-10000円、-5000円、0円、+5000円、+10000円のパターンを表示
           payM = payInput + i * 5000
           remuneration = payM + transport
           Cells(14 + i, 11).Value = remuneration
   
           '時給(160時間として計算)交通費無
           payH = Round(((payM + i * 5000) / hour), 0)
           Cells(14 + i, 10).Value = payH
       
           '保険料シートを上から回す
           For j = 6 To 55
   
               '「保険料」の報酬月額(以上)<=月給<「保険料」の月額報酬(未満)
               If datasheet.Cells(j, 3).Value <= remuneration And remuneration < datasheet.Cells(j, 4) Then
                   '健康保険
                   health = datasheet.Cells(j, 6).Value
                   Cells(14 + i, 12) = health
                   '厚生年金
                   welfare = datasheet.Cells(j, 9).Value
                   Cells(14 + i, 13) = welfare
                   '介護保険
                   If choiceAge = "39歳以下" Then
                       care = 0
                   Else
                       care = datasheet.Cells(j, 7).Value
                   End If
                   Cells(14 + i, 14).Value = care
                   '雇用保険(報酬月額*0.006)
                   job = Round((Cells(14 + i, 11).Value / 160), 0)
                   Cells(14 + i, 15).Value = job
                   '保険合計
                   total = health + welfare + care + job
                   Cells(14 + i, 16).Value = total
                   '経費合計(交通費有)=保険合計+月額報酬
                   cost = total + remuneration
                   Cells(14 + i, 17).Value = cost
                   '経費合計(交通費無)=保険合計+月給
                   costNoTransport = total + payM
                   Cells(14 + i, 18).Value = costNoTransport
                   '差額(交通費有)=時給*160-経費合計(交通費有)
                   del = splM - cost
                   Cells(14 + i, 19).Value = del
                   '差額(交通費無)=時給*160-経費合計(交通費無)
                   delNoTransport = splM - costNoTransport
                   Cells(14 + i, 20).Value = delNoTransport
   
                   Exit For
               End If
           Next
       Next
   End If
   ActiveSheet.Protect

End Sub

Sub 時給_Click() ' written by Kinami 2011/11

   ActiveSheet.Unprotect
   Cells(5, 11).Value = "時給"
   Cells(5, 15).Value = "時給"
   Cells(5, 12).Value = 0
   '時給ははじめ160時間で設定
   Range("H5").Value = 160
   
   Range("K6:Q6").Font.ColorIndex = 1
   
   ActiveSheet.Protect

End Sub

Sub 月給_Click() ' written by Kinami 2011/11

   ActiveSheet.Unprotect
   
   Cells(5, 11).Value = "月給"
   Cells(5, 15).Value = "月給"
   Cells(5, 12).Value = 0
   Range("H5").Value = 160
   Range("K6:Q6").Font.ColorIndex = 2
   
   ActiveSheet.Protect

End Sub

Sub クリア_Click() ' written by Kinami 2011/11

   ActiveSheet.Unprotect
   Range("F5").ClearContents  '年齢
   Range("H5").ClearContents  '勤務時間
   Range("L5").ClearContents  '入金額
   Range("P7").ClearContents  '交通費
   Range("F11").ClearContents  '保存名
   '計算結果をクリア
   Range("j12:T16").ClearContents
   
   '画面遷移時は時給計算の設定にしておく
   Range("D7").Value = 1
   Call 時給_Click
   
   ActiveSheet.Protect
   Range("L5").Select

End Sub

Sub save2db() '================このコードは 支給計算シートで実行される ' written by Kasahara 2011/11/16

   Application.ScreenUpdating = False      '画面描画の停止
   '算出履歴
   Dim resultSheet As Worksheet
   Set resultSheet = ThisWorkbook.Worksheets("算出履歴")
   '支給計算
   Dim calcSheet As Worksheet
   Set calcSheet = ThisWorkbook.Worksheets("支給計算")
'算出されていない場合はメッセージを出す
   If Cells(14, 10) = "" Then
       MsgBox "算出してください。"
       Exit Sub
   ElseIf Cells(5, 12) = 0 Or Cells(5, 12) = "" Then
       MsgBox "データを入力し、算出を行ってください。"
       Exit Sub
   ElseIf Cells(11, 6) = "" Then
       MsgBox "保存名を入力してください"
       Exit Sub
   ElseIf Cells(5, 12).Value > 10000 And Cells(7, 4).Value = 1 Then
       MsgBox "時給10,000超過。要修正。"
       Exit Sub
   ElseIf Cells(5, 12).Value < 10000 And Cells(7, 4).Value = 2 Then
       MsgBox "月給10,000未満。要修正。"
       Exit Sub
   End If
   
   '       =============再計算 念のために計算を実行
   Call 社会保険料算出_Click
   
   ActiveSheet.Unprotect

' ========================重複のチェック

   Dim saveName As String
   saveName = Range("F11").Value
   
   Dim kari As Variant
   kari = readData(saveName)
   
   If kari(0, 0) <> "nodata" Then  'DB に該当のデータがあるか確認
       Call MsgBox("既に使われた保存名です。変更して保存してください。")
       ActiveSheet.Protect
       Exit Sub
   End If

' ========================DBにinsert

   
   Dim str As String                                         'SQL文を入れる変数
   str = makeSQL("insert")                               'SQL文生成
   execSQL (str)                                               'insert実行

' =============履歴データダウンロード・転記

   Cells(1, 1).Value = "save"                              ' save モードであることを記録しておく(writeData で使う)
   Call loadHist
   calcSheet.Activate
   Cells(1, 1).Value = ""                                      '消しておく
   ActiveSheet.Protect          '支給計算
   calcSheet.Range("F11").Select
   

End Sub Sub loadData() '================このコードは 支給計算シートで実行される ' written by Kasahara 2011/11/21

   Application.ScreenUpdating = False      '画面描画の停止
'保存名がない場合はエラー
   If Cells(11, 6) = "" Then
       MsgBox "保存名を入力してください"
       Exit Sub
   End If
   ActiveSheet.Unprotect

' ========================保存名を使って検索

   Dim saveName As String
   saveName = Range("F11").Value
   
   Dim rData As Variant                '検索結果を受ける変数
   rData = readData(saveName)
   
   If rData(0, 0) = "nodata" Then  'select の結果データがなかった
       Call MsgBox("保存名が見当たりません。修正して再度実行してください。")
       ActiveSheet.Protect
       Exit Sub
   End If
   

' =============社会保険計算に必要なデータをセルに入れる ' 受け取ったデータを変数に代入(扱い易いように)

   Dim h As keisan
   h.saveName = rData(0, 0)
   h.payW = rData(1, 0)
   h.choiceAge = rData(2, 0)
   h.workT = rData(3, 0)
   h.payH = rData(4, 0)
   h.payM = rData(5, 0)
   h.transport = rData(6, 0)

' セルに入れる

   Cells(11, 6).Value = h.saveName
   Cells(7, 4).Value = h.payW
   If h.choiceAge = "39歳以下" Then
       Cells(7, 6).Value = 1
   Else
       Cells(7, 6).Value = 2
   End If
   Cells(5, 8).Value = h.workT
   If h.payW = 1 Then
       Call 時給_Click
       Cells(5, 12).Value = h.payH
   Else
       Call 月給_Click
       Cells(5, 12).Value = h.payM
   End If
   Cells(7, 16).Value = h.transport
  

' =============再計算

   Call 社会保険料算出_Click
   
   Range("F11").Select
   ActiveSheet.Protect          '支給計算
   

End Sub

Sub updateData() '================このコードは 支給計算シートで実行される ' written by Kasahara 2011/11/21

       Application.ScreenUpdating = False      '画面描画の停止
   '算出履歴
   Dim resultSheet As Worksheet
   Set resultSheet = ThisWorkbook.Worksheets("算出履歴")
   '支給計算
   Dim calcSheet As Worksheet
   Set calcSheet = ThisWorkbook.Worksheets("支給計算")
'算出されていない場合はメッセージを出す
   If Cells(14, 10) = "" Then
       MsgBox "算出してください。"
       Exit Sub
   ElseIf Cells(5, 12) = 0 Or Cells(5, 12) = "" Then
       MsgBox "データを入力し、算出を行ってください。"
       Exit Sub
   ElseIf Cells(11, 6) = "" Then
       MsgBox "保存名を入力してください"
       Exit Sub
   ElseIf Cells(5, 12).Value > 10000 And Cells(7, 4).Value = 1 Then
       MsgBox "時給10,000超過。要修正。"
       Exit Sub
   ElseIf Cells(5, 12).Value < 10000 And Cells(7, 4).Value = 2 Then
       MsgBox "月給10,000未満。要修正。"
       Exit Sub
   End If
   
   '       =============再計算 念のために計算を実行
   Call 社会保険料算出_Click
   
   ActiveSheet.Unprotect

' ========================重複のチェック

   Dim saveName As String
   saveName = Range("F11").Value
   

' ========================保存名を使って検索:保存名を書き換えていないかチェック

 
   Dim rData As Variant                '検索結果を受ける変数
   rData = readData(saveName)
   
   If rData(0, 0) = "nodata" Then  'select の結果データがなかった
       Call MsgBox("保存名が見当たりません。修正して再度実行してください。")
       ActiveSheet.Protect
       Exit Sub
   End If
   

' ========================   既存データをupdate

   
   Dim str As String                                         'SQL文を入れる変数
   str = makeSQL("update")                             'SQL生成
   execSQL (str)                                               'update実行

' =============履歴データダウンロード・転記

   Cells(1, 1).Value = "update"                           'update モードであることを記録しておく(writeData で使う)
   Call loadHist
   calcSheet.Activate
   ActiveSheet.Protect                                         '支給計算
   Cells(1, 1).Value = ""                                      '消しておく
   calcSheet.Range("F11").Select
   

End Sub

Function readData(ByVal saveName As String) As Variant ' written by Kasahara 2011/11/17 ' 指定された一件のデータのみを読み込む。ない場合はその旨を返す。

'==============DB接続

   Dim db      As ADODB.connection     'アクセス用のオブジェクト宣言
   Dim openFl  As Boolean
   openFl = False                      'オープンフラグ
   
   'エラー処理の宣言
   On Error GoTo ErrorHandler
   
   If db Is Nothing Then                   'インスタンスが存在しない場合
       Set db = New ADODB.connection       'インスタンス生成
       openFl = True                       'オープンフラグをTrue
   Else    'オブジェクトが存在する場合
       If db.State = adStateClosed Then    'コネクション状態がクローズの場合
           openFl = True                   'オープンフラグオン
       End If
   End If
   
   If openFl = True Then                   'オープンフラグがオンの場合 DB に接続
       db.Open "Provider=SQLOLEDB;" & _
           "Data Source=MC27;" & _
           "Initial Catalog= test;" & _
           "User Id=sa;" & _
           "Password=MandC_mc27;"
   '    Call MsgBox("接続されました", vbInformation)
   End If
   
   '==============SQL実行
   
   Dim rs   As ADODB.Recordset             'SQLにアクセスするオブジェクト宣言
   Set rs = New ADODB.Recordset            'インスタンス生成
   
   rs.ActiveConnection = db                'dbの接続をrsのActivConnectionにセット
   
   'データ取得SQL文をrsにセット
   rs.Source = "SELECT " & _
               "  * " & _
               "FROM " & _
               " hoken  " & _
               " WHERE " & _
               " saveName =  '" & _
                 saveName & "' ; "
                 
   rs.Open                                 'SQL実行(select)
   Dim notdata(1, 1) As Variant
   notdata(0, 0) = "nodata"
   If rs.EOF = True Then                   'データが存在しない場合はnotdataを返り値に入れる
       readData = notdata
   Else                                               'データが存在する場合は読んだデータを返り値に入れる
       readData = rs.GetRows
   End If
   '============SQLの後処理
   rs.Close                                'レコードセットクローズ
   Set rs = Nothing                        'rsを破棄
   If Not db Is Nothing Then               'オブジェクトが存在する場合
       'コネクション状態がオープンの場合
       If db.State = adStateOpen Then
           db.Close                        'DBクローズ
       End If
       Set db = Nothing                    'オブジェクト破棄
   End If

Exit Function

'エラーの場合 ErrorHandler:

   Call MsgBox("エラー" & Err.Number & Chr(13) & Err.Description, vbCritical)
   

End Function Sub execSQL(str As String) ' written by Kasahara 2011/11/16 ' update,delete,insert で使える

'==============DB接続

   Dim i As Integer
   Dim openFl  As Boolean
   openFl = False                      'オープンフラグ
   Dim db      As ADODB.connection     'アクセス用のオブジェクト宣言
   
   'エラー処理の宣言
   On Error GoTo ErrorHandler
   
   If db Is Nothing Then                   'インスタンスが存在しない場合
       Set db = New ADODB.connection       'インスタンス生成
       openFl = True                       'オープンフラグをTrue
   Else    'オブジェクトが存在する場合
       If db.State = adStateClosed Then    'コネクション状態がクローズの場合
           openFl = True                   'オープンフラグオン
       End If
   End If
   
   If openFl = True Then                   'オープンフラグがオンの場合 DB に接続
       db.Open "Provider=SQLOLEDB;" & _
           "Data Source=MC27;" & _
           "Initial Catalog= test;" & _
           "User Id=sa;" & _
           "Password=MandC_mc27;"
   '    Call MsgBox("接続されました", vbInformation)
   End If
   
   '==============SQL実行
    db.Execute str
   
   '==============SQLの後処理
   If Not db Is Nothing Then               'オブジェクトが存在する場合
   'コネクション状態がオープンの場合
       If db.State = adStateOpen Then
           db.Close                        'DBクローズ
       End If
       Set db = Nothing                    'オブジェクト破棄
   End If

Exit Sub

'エラーの場合 ErrorHandler:

   Call MsgBox("エラー" & Err.Number & Chr(13) & Err.Description, vbCritical)

End Sub Function makeSQL(syori As String) As String ' written by Kasahara 2022/11/16 insert 文作成 ' modified by Kasahara 2022/11/22 update 追加 '

   Dim iStr    As String       'SQL文
   Dim d As keisan
   

' シートからデータを取り込む

   d.saveName = Range("F11").Value
   d.payW = Range("D7").Value
   d.choiceAge = Range("F19").Value '年齢
   d.workT = Range("G19").Value       '時間
   If Cells(7, 4).Value = 1 Then
       d.payH = Cells(14, 10).Value  '時給(交通費無)
       d.payM = d.payH * d.workT      '月給(交通費無)
   Else
       d.payM = Cells(5, 12).Value  '月給(交通費無)
       d.payH = Round(d.payM / d.workT, 0)
   End If
   d.transport = Cells(7, 16).Value '交通費
   d.remuneration = Cells(14, 11).Value    '月額報酬
   d.health = Range("L14").Value    '健康保険
   d.welfare = Range("M14").Value    '厚生年金
   d.care = Range("N14").Value    '介護保険
   d.job = Range("O14").Value     '雇用保険
   If syori = "insert" Then
   '   insert 文作成
       iStr = "INSERT INTO hoken" & _
               "(saveName, payW,choiceAge,workT,payH,payM,transport,remuneration,health,welfare,care,job) values ("
       iStr = iStr & "'" & d.saveName & _
               "'," & d.payW & _
               ",'" & d.choiceAge & _
               "'," & d.workT & _
               "," & d.payH & _
               "," & d.payM
        iStr = iStr & "," & d.transport & _
               "," & d.remuneration & _
               "," & d.health & _
               "," & d.welfare & _
               "," & d.care & _
               "," & d.job & _
               ");"
   Else
   '   update 文作成
       iStr = "UPDATE hoken SET "
       iStr = iStr & "saveName= '" & d.saveName & "',"
       iStr = iStr & " payW= " & d.payW & ","
       iStr = iStr & " choiceAge= '" & d.choiceAge & "',"
       iStr = iStr & " workT= " & d.workT & ","
       iStr = iStr & " payH= " & d.payH & ","
       iStr = iStr & " payM= " & d.payM & ","
       iStr = iStr & " transport= " & d.transport & ","
       iStr = iStr & " remuneration= " & d.remuneration & ","
       iStr = iStr & " health= " & d.health & ","
       iStr = iStr & " welfare= " & d.welfare & ","
       iStr = iStr & " care= " & d.care & ","
       iStr = iStr & " job= " & d.job & ","
       iStr = iStr & " cDate= '" & Year(Now) & "-" & Month(Now) & "-" & Day(Now) & " " & hour(Now) & ":" & Minute(Now) & ":" & Second(Now) & ":000'"
       iStr = iStr & " WHERE saveName = '" & d.saveName
       iStr = iStr & "';"
   End If

' Stop

   makeSQL = iStr                          '作ったSQL文を返り値にセット

End Function

Sub loadHist() ' written by Kasahara 2011/11/17 ' 全データをダウンロードして履歴セルに貼り付ける '==============DB接続

   Dim db      As ADODB.connection     'アクセス用のオブジェクト宣言
   Dim openFl  As Boolean
   openFl = False                                  'オープンフラグ
   Dim allData As Variant                       'DLデータ受ける変数
   
   'エラー処理の宣言
   On Error GoTo ErrorHandler
   
   If db Is Nothing Then                   'インスタンスが存在しない場合
       Set db = New ADODB.connection       'インスタンス生成
       openFl = True                       'オープンフラグをTrue
   Else    'オブジェクトが存在する場合
       If db.State = adStateClosed Then    'コネクション状態がクローズの場合
           openFl = True                   'オープンフラグオン
       End If
   End If
   
   If openFl = True Then                   'オープンフラグがオンの場合 DB に接続
       db.Open "Provider=SQLOLEDB;" & _
           "Data Source=MC27;" & _
           "Initial Catalog= test;" & _
           "User Id=sa;" & _
           "Password=MandC_mc27;"
   End If
   
   '==============SQL実行
   
   Dim rs   As ADODB.Recordset             'SQLにアクセスするオブジェクト宣言
   Set rs = New ADODB.Recordset            'インスタンス生成
   
   rs.ActiveConnection = db                'dbの接続をrsのActivConnectionにセット
   
   'テストデータ取得SQL文をrsにセット          '全件取得
   rs.Source = "SELECT " & _
               "  * " & _
               "FROM " & _
               " hoken order by cDate desc ;"
   rs.Open                                            'SQL実行
   If rs.EOF = True Then                       'データがない場合:理論的には存在しない
       Call MsgBox("該当データが存在しません")
       Exit Sub
   Else                                                  'データが存在する場合
       allData = rs.GetRows                    'GetRowsメソッドでデータを戻り値に格納)
       writeData (allData)                         'ダウンロードしたデータをシートに転記
   End If
   
   '==============SQLの後処理
   rs.Close                                'レコードセットクローズ
   Set rs = Nothing                        'rsを破棄
   If Not db Is Nothing Then               'オブジェクトが存在する場合
       'コネクション状態がオープンの場合
       If db.State = adStateOpen Then
           db.Close                        'DBクローズ
       End If
       Set db = Nothing                    'オブジェクト破棄
   End If

Exit Sub

'エラーの場合 ErrorHandler:

   Call MsgBox("エラー" & Err.Number & Chr(13) & Err.Description, vbCritical)
   

End Sub

Sub writeData(allData As Variant) ' written by Kasahara 2011/11/17 ' ダウンロードした履歴データをワークシートに転記する ' update by Kasahara 2011/11/17 ' update 対応

   Dim RowSize, columnSize, i, j As Long
   Dim temp()  As Variant          '縦と横を入れ替えるために使う
   
   columnSize = UBound(allData, 1)
   RowSize = UBound(allData, 2)
   ReDim temp(RowSize, columnSize) '縦と横を入れ替えるための設定
   
   For i = 0 To UBound(allData, 1)
       For j = 0 To UBound(allData, 2)
           temp(j, i) = allData(i, j)
       Next j
   Next i
   
   'cellに転記
   '支給計算シート (直近5件のみ
   Sheets("支給計算").Select
   ActiveSheet.Unprotect
   
   '                                   どちらのモードで呼ばれたかを読み込む
   Dim flg As String
   flg = Cells(1, 1).Value
   
   For i = 1 To UBound(temp) + 1
       If i > 5 Then
           Exit For
       End If
       
       Cells(i + 21, 4).Value = temp(i - 1, 12)      '  保存日時
       Cells(i + 21, 5).Value = temp(i - 1, 0)      '  保存名
       Cells(i + 21, 6).Value = temp(i - 1, 2)      '  年齢
       Cells(i + 21, 7).Value = temp(i - 1, 3)      '  時間
       Cells(i + 21, 8).Value = temp(i - 1, 6)      '  交通費
       Cells(i + 21, 9).Value = temp(i - 1, 5)      '  月給
       Cells(i + 21, 10).Value = temp(i - 1, 4)      '  時給
       Cells(i + 21, 11).Value = temp(i - 1, 7)      '  報酬月額
       Cells(i + 21, 12).Value = temp(i - 1, 8)      ' 健康保険
       Cells(i + 21, 13).Value = temp(i - 1, 9)      ' 厚生年金
       Cells(i + 21, 14).Value = temp(i - 1, 10)      ' 介護保険料
       Cells(i + 21, 15).Value = temp(i - 1, 11)      ' 雇用保険
      '横計算のセル
       Cells(i + 21, 16).Value = Cells(i + 21, 12) + Cells(i + 21, 13) + Cells(i + 21, 14) + Cells(i + 21, 15)
       Cells(i + 21, 17).Value = Cells(i + 21, 16).Value + Cells(i + 21, 11).Value '経費合計(交通費有)=保険合計+月額報酬
       Cells(i + 21, 18).Value = Cells(i + 21, 16).Value + Cells(i + 21, 9).Value  '経費合計(交通費無)=保険合計+月給
       Cells(i + 21, 19).Value = Cells(i + 21, 9).Value - Cells(i + 21, 17).Value '差額交通費有
       Cells(i + 21, 20).Value = Cells(i + 21, 11).Value - Cells(i + 21, 17).Value  '差額交通費無
   Next i
   ActiveSheet.Protect
   Sheets("算出履歴").Select
   ActiveSheet.Unprotect
   For i = 1 To UBound(temp) + 1
       Cells(i + 5, 4).Value = temp(i - 1, 12)      '  保存日時
       Cells(i + 5, 5).Value = temp(i - 1, 0)      '  保存名
       Cells(i + 5, 6).Value = temp(i - 1, 2)      '  年齢
       Cells(i + 5, 7).Value = temp(i - 1, 3)      '  時間
       Cells(i + 5, 8).Value = temp(i - 1, 6)      '  交通費
       Cells(i + 5, 9).Value = temp(i - 1, 5)      '  月給
       Cells(i + 5, 10).Value = temp(i - 1, 4)      '  時給
       Cells(i + 5, 11).Value = temp(i - 1, 7)      '  報酬月額
       Cells(i + 5, 12).Value = temp(i - 1, 8)      ' 健康保険
       Cells(i + 5, 13).Value = temp(i - 1, 9)      ' 厚生年金
       Cells(i + 5, 14).Value = temp(i - 1, 10)      ' 介護保険料
       Cells(i + 5, 15).Value = temp(i - 1, 11)      ' 雇用保険
      '横計算のセル
       Cells(i + 5, 16).Value = Cells(i + 5, 12) + Cells(i + 5, 13) + Cells(i + 5, 14) + Cells(i + 5, 15)
       Cells(i + 5, 17).Value = Cells(i + 5, 16).Value + Cells(i + 5, 11).Value '経費合計(交通費有)=保険合計+月額報酬
       Cells(i + 5, 18).Value = Cells(i + 5, 16).Value + Cells(i + 5, 9).Value  '経費合計(交通費無)=保険合計+月給
       Cells(i + 5, 19).Value = Cells(i + 5, 9).Value - Cells(i + 5, 17).Value '差額交通費有
       Cells(i + 5, 20).Value = Cells(i + 5, 11).Value - Cells(i + 5, 17).Value  '差額交通費無
   Next i

'              =============== update の場合は件数が変わらないので以下の処理は行わない
   If flg = "save" Then
       '履歴の最終行に番号を追加
       Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Value = (Cells(Rows.Count, 3).End(xlUp).Value + 1)
       Dim lastRange As Range
       Set lastRange = Range(Cells(Rows.Count, 3).End(xlUp), Cells(Rows.Count, 20).End(xlUp))
       lastRange.Offset(-1, 0).Borders(xlEdgeBottom).LineStyle = False
       lastRange.Offset(-1, 0).Copy
       lastRange.PasteSpecial Paste:=xlPasteFormats
       lastRange.Offset(-1, 0).Borders(xlEdgeBottom).LineStyle = False
       
       '5行ごとに水平の罫線を上部へ追加
       If Cells(Rows.Count, 3).End(xlUp).Value Mod 5 = 1 Then
           lastRange.Borders(xlEdgeTop).LineStyle = True
           lastRange.Borders(xlEdgeTop).ColorIndex = 2
       End If
   
       '最下部の罫線を追加
       lastRange.Borders(xlEdgeBottom).LineStyle = True
       lastRange.Borders(xlEdgeBottom).ColorIndex = 2
       lastRange.Borders(xlEdgeLeft).LineStyle = True
       lastRange.Borders(xlEdgeRight).LineStyle = True
   End If
   ActiveSheet.Protect          '算出履歴

End Sub

Sub 以上_Click() End Sub Sub 以下_Click() End Sub

タグ:

+ タグ編集
  • タグ:
最近更新されたスレッド
ウィキ募集バナー