|
こんばんは。
頭がいいわけでもすごい人の範疇でもないんですが、
私なりに考えてみましたが・・・。
>給与計算を作ってってたんですが、計算等とか所得税はできたんですが、作ってるうちにだんだんファイルが大きくなってしまって、なんとか小さくならないとかと思いまして、大きな所の一部だけ載せてみました。人数分だけでも100人近くて
>行を消したり出したりして役職変更できるようにしてみたのですが・・
>ファイルが8M超えてしまって困ってたのでなんとかならないとかと思いまして。
↑この容量が極端に大きくなってしまったのは、別の原因かもしれませんよ。
コードを見せて頂きました。
で、教えていただきたいのは、規則性なんです。
例えば、かぶさんがご提示されたコードは、シート「氏名一覧」の4行目の
氏名にデータにはM列に役職を入力させるようになっているということですよね?
そして、この役職によって、各シート(役職A、掃除、・・)のレイアウトを
変えてしまおうという仕様ですね?
(この仕様の良し悪しは別の話ですよ、この仕様を書いたら大変ですね!!
給与計算の仕様やマニュアルを書こうとしたら、何十枚になってしまいますものね。)。
で、知りたいのは、シート「氏名一覧」の4行目氏名にデータの場合には、
各シートのほとんどが4行目を表示・非表示の設定、役員シートの役員と監事がそれぞれ
100+4、200+4行目を表示・非表示の設定を行っています。
これが、シート「氏名一覧」の5行目氏名に対しては、各シートの何行目に対して表示・非表示の設定を行うのかということなんです。
又、シート「氏名一覧」の6行目氏名に対しては、どうなのか?
ここに等差数列のような規則性があれば、ループ処理が可能です。
上記のような仕様なら、多分規則性があるはずですが・・・。
又は、シート「氏名一覧」の選択した氏名に対して、ご提示されたような各シートの表示・非表示設定を行いたいということでしょうか?
この場合、シート「氏名一覧」の氏名データが何行目のものであっても
各シートの表示・非表示行は、ほとんどが4行目、役員シートの役員と監事がそれぞれ
100+4、200+4行目を表示・非表示設定を行うという解釈ですが・・・。
前者は、規則性がわからないのでコードは掲載しませんが、後者の仕様だと・・。
以下に示すコードは、シート「氏名一覧」の選択した氏名データのM列の役職により、
各シートの所定行の表示・非表示を行うコードです。氏名データを選択した状態で
以下のコード(プロシジャーチェックA)を実行して下さい。
'=============================================================
Sub チェックA()
Dim dsp_row_flg(1 To 10) As Boolean
' 1: 一般 2:役職A 3:役職B 4:役職C 5:役職D 6:掃除 7:学生 8:社長 9:役員 10:監事
' True:表示 False:表示
Dim rng As Range
Set rng = Selection
If rng.Parent.Name <> "氏名一覧" Then
MsgBox "シート""氏名一覧""の氏名行を選択してね!!"
Else
For idx = LBound(dsp_row_flg()) To UBound(dsp_row_flg())
dsp_row_flg(idx) = True
Next idx
Select Case Range("m" & rng.Row).Value
Case "役職A"
dsp_row_flg(1) = False
dsp_row_flg(2) = False
Case "掃除" '表示・非表示設定の規則もはっきりしないので
' 私の勝手な推測で設定しました。
dsp_row_flg(1) = False
dsp_row_flg(6) = False
Case "役職B"
dsp_row_flg(1) = False
dsp_row_flg(3) = False
Case "役職C"
dsp_row_flg(1) = False
dsp_row_flg(4) = False
Case "役職D"
dsp_row_flg(1) = False
dsp_row_flg(5) = False
Case "学生"
dsp_row_flg(1) = False
dsp_row_flg(7) = False
Case "社長"
dsp_row_flg(1) = False
dsp_row_flg(8) = False
Case "役員"
dsp_row_flg(1) = False
dsp_row_flg(9) = False
Case "監事"
dsp_row_flg(1) = False
dsp_row_flg(10) = False
Case "事務"
dsp_row_flg(1) = False
End Select
Call シート設定(4, dsp_row_flg())
End If
Sheets("氏名一覧").Select
End Sub
'=============================================================
Sub シート設定(設定行 As Long, 表示有無() As Boolean)
'各シートの指定行を指定により、表示又は、非表示にする
'input : 設定行 表示又は、非表示対象行
' 表示有無() 各シートの表示・非表示の真偽
' 1: 一般 2:役職A 3:役職B 4:役職C 5:役職D 6:掃除 7:学生 8:社長 9:役員 10:監事
' True:表示 False:表示
Sheets("一般").Rows(設定行).Hidden = 表示有無(1)
Sheets("役職A").Rows(設定行).Hidden = 表示有無(2) '役職A
Sheets("役職B").Rows(設定行).Hidden = 表示有無(3)
Sheets("役職C").Rows(設定行).Hidden = 表示有無(4)
Sheets("役職D").Rows(設定行).Hidden = 表示有無(5)
Sheets("掃除").Rows(設定行).Hidden = 表示有無(6)
Sheets("学生").Rows(設定行).Hidden = 表示有無(7)
With Sheets("役員")
.Rows(設定行).Hidden = 表示有無(8) '社長
.Rows(設定行 + 100).Hidden = 表示有無(9) '役員
.Rows(設定行 + 200).Hidden = 表示有無(10) '監事
End With
End Sub
ここでは、必要ではなさそうなSelectを削除しました。
前者の仕様だとしても上記のコードの改良でなんとかなるかもしれません。
もっともどちらでもなかったとしたら、再度考えなければなりませんが・・。
確認してみて下さい。
|
|