- 締切済み
VBAで給料明細を作成している最中ですが。。。
※シート※ 入力シートに 名前 年齢 基本給 通勤手当 調整分 住民税 あい 20 19,000 1,320 230 13,098 かき 32 20,000,000 23,000 5,000 980 さし 32 60,000 7,800 800 6,090 たち 50 980,000 5,600 1,234 320 なに 66 1,600,000 9,000 390 9,809 入力シートにコマンドボタンがありクリックすると計算できるプログラムを組んでいます。 所得税のシートに 課税所得 超 以下 計算式 0 1,950,000 5% - 1,950,000 3,300,000 10% -97,500 3,300,000 6,950,000 20% -427,500 6,950,000 9,000,000 23% -636,000 9,000,000 18,000,000 33% -1,536,000 18,000,000 - 40% -2,796,000 というのがあり健康保険料というシートに 報酬月額 標準報酬月額 20歳以上40歳未満 40歳以上65歳未満 93000 以上 98,000 標準報酬月額*0.082/2 標準報酬月額*0.0933/2 というのがあり厚生年金のシートに 報酬月額 標準報酬月額 計算式 93000 以上 98000 標準報酬月額*0.14996/2 というのがあります。 それらのシートを使用してソースをさっぱりできないかなと思っています。 現在のソースは ------------------------------------------ j = 0 For i = 3 To n '所得税計算 atai = Worksheets("入力").Range("D" + CStr(i)) ReDim Preserve shotoku(j) Select Case atai Case 0 To 1950000 shotoku(j) = atai * 0.05 Case 1950000 To 3300000 shotoku(j) = atai * 0.1 - 97500 Case 3300000 To 6950000 shotoku(j) = atai * 0.2 - 427500 Case 6950000 To 9000000 shotoku(j) = atai * 0.23 - 636000 Case 9000000 To 18000000 shotoku(j) = atai * 0.33 - 1536000 Case Is >= 18000000 shotoku(j) = atai * 0.4 - 2796000 End Select '健康保険料計算 age = Worksheets("入力").Range("C" + CStr(i)) ReDim Preserve kenko(j) If Worksheets("入力").Range("D" + CStr(i)) < 98000 Then kenko(j) = 0 Else Select Case age Case 20 To 39 kenko(j) = 98000 * 0.082 / 2 Case 40 To 64 kenko(j) = 98000 * 0.0933 / 2 End Select End If '厚生年金計算 ReDim Preserve nenkin(j) If Worksheets("入力").Range("D" + CStr(i)) < 93000 Then nenkin(j) = 0 Else nenkin(j) = 98000 * 0.14996 / 2 End If -------------------------------------------------- これをさっぱりとした簡潔なソースに仕上げたいです。 ------------------------------------------------- name = Format(Date, "ggge年m月分") & ".xls" '処理をした日の月で保存 Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:= _ "C:\Documents and Settings\PC Users\デスクトップ\研修課題\" & name, FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False Application.DisplayAlerts = True --------------------------------------------------- 入力シートに名前(B列)が書いてある数だけシートをコピーし貼り付けていくということをFor文で繰り返しているのですが保存が終了したあと再び処理をする場合のソースが知りたいです。 例)最初に5件分の給料明細書を作成し保存 →その後3件分になり再び処理をする場合前のもの(2件分)のシートが残ったままになっています。その2件分のものを消す処理のプログラムを組みたいのでよろしくお願いします。 説明不足だったり意味不明なところがあれば聞いてください。 解りづらい説明かもしれませんが2件の処理の仕方をよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- hana-hana3
- ベストアンサー率31% (4940/15541)
Vlookup 関数の使い方を知っているのであれば簡単に応用できると思いますよ。 case 文で分岐しなくても、Application.WorksheetFunction.Vlookup で必要な値を呼び出せると思います。
- redfox63
- ベストアンサー率71% (1325/1856)
肝心な部分のソースが無いのでは? 質問の『入力シートに名前(B列)が書いてある ・・・』からのくだりが質問の趣旨ならその部分のソースを公開しなければ意味が無いでしょう シートとして『入力』『所得税』の2枚だけあればいいのでしたら この計算を実行する前に下記のようなコードで不必要なシートを作事してから実行してみてください dim sh as Worksheet Application.displayAlerts = false for each sh in thisWorkbook.WorkSheets if sh.Name <> "入力" and sh.Name<>"所得税" then sh.Delete end if next Application.displayAlerts = true といった具合でしょう 他にも必要なシートがあるなら if sh.Name <> "入力" and sh.Name<>"所得税" then の条件を変更しましょう
補足
すみません。 Vlookup関数は一度しか使ったことがなく今回のSelect caseでの計算方法でどのように使ったらいいかわかりません。 所得税というシートを元に計算していきたいのですが・・・ 所得税 課税所得 超 以下 計算式 0 1,950,000 5% 1,950,000 3,300,000 10% -97,500 3,300,000 6,950,000 20% -427,500 6,950,000 9,000,000 23% -636,000 9,000,000 18,000,000 33% -1,536,000 18,000,000 40% -2,796,000 *以下の空欄はそれ以上の値を表します 入力というシートに B C D E F G 名前 年齢 基本給 通勤手当 調整分 住民税 あい 20 19,000 1,320 230 13,098 かき 32 200,000 23,000 5,000 980 さし 32 60,000 7,800 800 6,090 たち 50 980,000 5,600 1,234 320 なに 66 18,000,000 9,000 390 9,809 というシートを作り所得税というシートを引用?しSelect caseで今まで計算していました。 ずれていたらすみません・・・ 例)基本給190000の時の所得税 例)基本給18000000の時の所得税 を計算したいのですがApplication.WorksheetFunction.Vlookupでできるのでしょうか。 よろしくお願いします。