Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


70596 / 76738 ←次へ | 前へ→

【10646】プロシジャー分割
回答  ichinose  - 04/2/5(木) 2:32 -

引用なし
パスワード
   こんばんは。
頭がいいわけでもすごい人の範疇でもないんですが、
私なりに考えてみましたが・・・。

>給与計算を作ってってたんですが、計算等とか所得税はできたんですが、作ってるうちにだんだんファイルが大きくなってしまって、なんとか小さくならないとかと思いまして、大きな所の一部だけ載せてみました。人数分だけでも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を削除しました。
前者の仕様だとしても上記のコードの改良でなんとかなるかもしれません。
もっともどちらでもなかったとしたら、再度考えなければなりませんが・・。

確認してみて下さい。

0 hits

【10642】[無題] かぷ 04/2/4(水) 16:42 質問
【10644】Re:[無題] 通りすがりの者 04/2/5(木) 0:00 発言
【10645】Re:[無題] かぷ 04/2/5(木) 0:33 発言
【10646】プロシジャー分割 ichinose 04/2/5(木) 2:32 回答
【10647】誤字脱字が・・・ ichinose 04/2/5(木) 2:44 発言
【10648】Re:プロシジャー分割 かぷ 04/2/5(木) 7:58 発言
【10653】Re:プロシジャー分割 かぷ 04/2/5(木) 13:22 発言
【10676】さらに追記 かぷ 04/2/5(木) 18:53 発言
【10678】Re:プロシジャー分割 ichinose 04/2/5(木) 23:54 質問
【10679】Re:プロシジャー分割 かぷ 04/2/6(金) 0:18 回答
【10680】Re:プロシジャー分割 ichinose 04/2/6(金) 1:10 回答
【10683】Re:プロシジャー分割 かぷ 04/2/6(金) 9:50 お礼

70596 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free