Excel VBA質問箱 IV

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

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


12407 / 13646 ツリー ←次へ | 前へ→

【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 お礼

【10642】[無題]
質問  かぷ E-MAIL  - 04/2/4(水) 16:42 -

引用なし
パスワード
   はじめまして
ページ毎に役職入れて、1行に1人入れると下のマクロが人数分必要になってしまいます。
もっと簡単に役職が変わっても大丈夫な様なマクロはないでしょうか?
Sub チェックA()
With Sheets("氏名一覧")
If .[M4] = "役職A" Then
A役職A
ElseIf .[M4] = "掃除" Then
A掃除
ElseIf .[M4] = "役職B" Then
A役職B
ElseIf .[M4] = "役職C" Then
A役職C
ElseIf .[M4] = "役職D" Then
A役職D
ElseIf .[M4] = "学生" Then
A学生
ElseIf .[M4] = "社長" Then
A社長
ElseIf .[M4] = "役員" Then
A役員
ElseIf .[M4] = "監事" Then
A監事
ElseIf .[M4] = "事務" Then
A事務
Else
A0
End If
End With
End Sub
Sub A0()
  Sheets("役職A").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True '役職A
  Range("A1").Select
  Sheets("一般").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("役職B").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("掃除").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("役職C").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("役職D").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("学生").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("役員").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True '社長
  Rows("104:104").Select
  Selection.EntireRow.Hidden = True '役員
  Rows("204:204").Select
  Selection.EntireRow.Hidden = True '監事
  Range("A1").Select
  Sheets("氏名一覧").Select
  Range("A4").Select
End Sub
Sub A役職A()
  Sheets("一般").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = False
  Range("A1").Select
  Sheets("役職A").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = False
  Range("A1").Select
  Sheets("役職B").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("掃除").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("役職C").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("役職D").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("学生").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Sheets("役員").Select
  Rows("4:4").Select
  Selection.EntireRow.Hidden = True
  Rows("104:104").Select
  Selection.EntireRow.Hidden = True '役員
  Rows("204:204").Select
  Selection.EntireRow.Hidden = True '監事
  Range("A1").Select
  Sheets("氏名一覧").Select
  Range("A4").Select
End Sub




【10644】Re:[無題]
発言  通りすがりの者  - 04/2/5(木) 0:00 -

引用なし
パスワード
   タイトルは入れるべきでしょうね。

それと、何をしたいのか?
箇条書きでも構わないから書くべきじゃないでしょうか?

ここには頭のいい人が多いから、コードを載せておくだけで理解してくれる人もいるけど、
こんな長いコードを見るだけで嫌気がさしてきちゃう人もいるんじゃないですかね?

やりたいことを箇条書きでも載せておけば、すごい人たちが別のやり方(コードの組み方)を教えてくれるんじゃないですかね?

【10645】Re:[無題]
発言  かぷ E-MAIL  - 04/2/5(木) 0:33 -

引用なし
パスワード
   ▼通りすがりの者 さん:
>タイトルは入れるべきでしょうね。

すみません。タイトル思いつかなかったので・・
>それと、何をしたいのか?
>箇条書きでも構わないから書くべきじゃないでしょうか?
>
>ここには頭のいい人が多いから、コードを載せておくだけで理解してくれる人もいるけど、
>こんな長いコードを見るだけで嫌気がさしてきちゃう人もいるんじゃないですかね?
>
>やりたいことを箇条書きでも載せておけば、すごい人たちが別のやり方(コードの組み方)を教えてくれるんじゃないですかね?

確かにやりたいこととかが書いてありませんでしたね。
すみませんでした。
給与計算を作ってってたんですが、計算等とか所得税はできたんですが、作ってるうちにだんだんファイルが大きくなってしまって、なんとか小さくならないとかと思いまして、大きな所の一部だけ載せてみました。人数分だけでも100人近くて
行を消したり出したりして役職変更できるようにしてみたのですが・・
ファイルが8M超えてしまって困ってたのでなんとかならないとかと思いまして。

乱文すみません。

【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を削除しました。
前者の仕様だとしても上記のコードの改良でなんとかなるかもしれません。
もっともどちらでもなかったとしたら、再度考えなければなりませんが・・。

確認してみて下さい。

【10647】誤字脱字が・・・
発言  ichinose  - 04/2/5(木) 2:44 -

引用なし
パスワード
   誤字脱字が沢山あったみたいです。
気が付いたところだけ訂正しときます。


>>給与計算を作ってってたんですが、計算等とか所得税はできたんですが、作ってるうちにだんだんファイルが大きくなってしまって、なんとか小さくならないとかと思いまして、大きな所の一部だけ載せてみました。人数分だけでも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
>

【10648】Re:プロシジャー分割
発言  かぷ  - 04/2/5(木) 7:58 -

引用なし
パスワード
   ichinoseさん

早速の返答ありがとうございます。

>で、知りたいのは、シート「氏名一覧」の4行目氏名にデータの場合には、
>各シートのほとんどが4行目を表示・非表示の設定、役員シートの役員と監事がそれぞれ
>100+4、200+4行目を表示・非表示の設定を行っています。

>これが、シート「氏名一覧」の5行目氏名に対しては、各シートの何行目に対して
>表示・非表示の設定を行うのかということなんです。

氏名一覧の一部ですが(現状)
A4 は 1 (1)
B4 は 入力禁則で変更します(掃除)
C4 は 氏名(A)
D4 は 口座店名
E4 は 口座番号
F4 は 時間給1(1000)
G4 は 時間給2(1100)
H4 は 時間給3(1200)
I4 は 入力禁則で変更します(乙)
J4 は 人数(0)
K4 は チェックボックス($Q$4)
M4 は =IF(Q4=TRUE,B4,IF(B4="社長","社長",""))
Q4 FALSE (TRUE)
A5 は (2)
B5 は 入力禁則で変更します(役員)
C5 は 氏名(A)
D5 は 口座店名
E5 は 口座番号
F5 は 時間給1(1000)
G5 は 時間給2(1100)
H5 は 時間給3(1200)
I5 は 入力禁則で変更します(乙)
J5 は 人数(0)
K5 は チェックボックス($Q$5)
M5 は =IF(Q5=TRUE,B5,IF(B5="社長","社長",""))
Q5 FALSE (TRUE)
A6 (3)
以下同様です。

役員シートの
A4 =氏名一覧!M4
B4 =氏名一覧!O4
C4 =IF(B4="","",VLOOKUP(B4,氏名一覧!$A$3:$E$102,2))
D4 =IF(C4="社長",IF(B4="","",VLOOKUP(B4,氏名一覧!$A$3:$E$102,3)),"")
E4 =IF(C4="社長",IF(B4="","",(VLOOKUP(B4,氏名一覧!$A$3:$E$102,4))),"")



A104 =氏名一覧!M4
B104 =氏名一覧!O4
C104 =IF(B104="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,2))
D104 =IF(C104="役員",IF(B104="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,3)),"")
E104 =IF(C104="役員",IF(B104="","",(VLOOKUP(B104,氏名一覧!$A$3:$E$102,4))),"")



A204 =氏名一覧!M4
B204 =氏名一覧!O4
C204 =IF(B204="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,2))
D204 =IF(C204="監事",IF(B204="","",VLOOKUP(B204,氏名一覧!$A$3:$E$102,3)),"")
E204 =IF(C204="監事",IF(B204="","",(VLOOKUP(B204,氏名一覧!$A$3:$E$102,4))),"")



一般シート
A4 =氏名一覧!M4
B4 =氏名一覧!O4
C4 =IF(B4="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,2))
D4 =IF(C4="監事","",IF(C4="社長","",IF(C4="役員","",IF(B4="","",VLOOKUP(B4,氏名一覧!$A$3:$E$102,3)))))
E4 =IF(C4="監事","",IF(C4="社長","",IF(C4="役員","",IF(B4="","",(VLOOKUP(B4,氏名一覧!$A$3:$E$102,4))))))



掃除シート(他のシートも同じです)
L2 =SheetName()
A4 =氏名一覧!M4
B4 =氏名一覧!O4
C4 =IF(B4="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,2))
D4 =IF(C4=$L$2,IF(B4="","",VLOOKUP(B4,氏名一覧!$A$3:$E$102,3)),"")
E4 =IF(C4=$L$2,IF(B4="","",(VLOOKUP(B4,氏名一覧!$A$3:$E$102,4))),"")



203行目には社長、役員の小計が入りまして
303行目には監事の小計が入ります。
304行目は合計が入ります。


よろしくお願いします。

【10653】Re:プロシジャー分割
発言  かぷ E-MAIL  - 04/2/5(木) 13:22 -

引用なし
パスワード
   追記
役員以外のシートには一般と他のシートに両方表示させたいのです。
事務は一般のみ入ります。

【10676】さらに追記
発言  かぷ  - 04/2/5(木) 18:53 -

引用なし
パスワード
   氏名一覧のO4が抜けてました。
=IF(Q4=TRUE,A4,IF(M4="社長",A4,""))
O5
=IF(Q5=TRUE,A5,IF(M5="社長",A5,""))

【10678】Re:プロシジャー分割
質問  ichinose  - 04/2/5(木) 23:54 -

引用なし
パスワード
   ▼かぷ さん:
こんばんは。
沢山記述していただいたのですが・・・・。

>
>>で、知りたいのは、シート「氏名一覧」の4行目氏名にデータの場合には、
>>各シートのほとんどが4行目を表示・非表示の設定、役員シートの役員と監事がそれぞれ
>>100+4、200+4行目を表示・非表示の設定を行っています。
>
>>これが、シート「氏名一覧」の5行目氏名に対しては、各シートの何行目に対して
>>表示・非表示の設定を行うのかということなんです。
>
>氏名一覧の一部ですが(現状)
>A4 は 1 (1)
>B4 は 入力禁則で変更します(掃除)
>C4 は 氏名(A)
>D4 は 口座店名
>E4 は 口座番号
>F4 は 時間給1(1000)
>G4 は 時間給2(1100)
>H4 は 時間給3(1200)
>I4 は 入力禁則で変更します(乙)
>J4 は 人数(0)
>K4 は チェックボックス($Q$4)
>M4 は =IF(Q4=TRUE,B4,IF(B4="社長","社長",""))
>Q4 FALSE (TRUE)
>A5 は (2)
>B5 は 入力禁則で変更します(役員)
>C5 は 氏名(A)
>D5 は 口座店名
>E5 は 口座番号
>F5 は 時間給1(1000)
>G5 は 時間給2(1100)
>H5 は 時間給3(1200)
>I5 は 入力禁則で変更します(乙)
>J5 は 人数(0)
>K5 は チェックボックス($Q$5)
>M5 は =IF(Q5=TRUE,B5,IF(B5="社長","社長",""))
>Q5 FALSE (TRUE)
>A6 (3)
>以下同様です。
はい、ここまではわかりましたし、想像していたとおりです。

で、知りたかったのはこれ以下のレイアウト
何となく、想像つくんですが、はっきりしないんです。


>
>役員シートの
>A4 =氏名一覧!M4
>B4 =氏名一覧!O4
>C4 =IF(B4="","",VLOOKUP(B4,氏名一覧!$A$3:$E$102,2))
>D4 =IF(C4="社長",IF(B4="","",VLOOKUP(B4,氏名一覧!$A$3:$E$102,3)),"")
>E4 =IF(C4="社長",IF(B4="","",(VLOOKUP(B4,氏名一覧!$A$3:$E$102,4))),"")
>・
>・
>・
>A104 =氏名一覧!M4
>B104 =氏名一覧!O4
>C104 =IF(B104="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,2))
>D104 =IF(C104="役員",IF(B104="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,3)),"")
>E104 =IF(C104="役員",IF(B104="","",(VLOOKUP(B104,氏名一覧!$A$3:$E$102,4))),"")
>・
>・
>・
>A204 =氏名一覧!M4
>B204 =氏名一覧!O4
>C204 =IF(B204="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,2))
>D204 =IF(C204="監事",IF(B204="","",VLOOKUP(B204,氏名一覧!$A$3:$E$102,3)),"")
>E204 =IF(C204="監事",IF(B204="","",(VLOOKUP(B204,氏名一覧!$A$3:$E$102,4))),"")

上記は、シート氏名一覧の4行目のデータが役員だった場合ですよね?
では、5行目が役員だった場合は?
A5 =氏名一覧!M5
B5 =氏名一覧!O5
C5 =IF(B5="","",VLOOKUP(B5,氏名一覧!$A$3:$E$102,2))
D5 =IF(C5="社長",IF(B5="","",VLOOKUP(B5,氏名一覧!$A$3:$E$102,3)),"")
E5 =IF(C5="社長",IF(B5="","",(VLOOKUP(B5,氏名一覧!$A$3:$E$102,4))),"")



A105 =氏名一覧!M5
B105 =氏名一覧!O5
C105 =IF(B105="","",VLOOKUP(B105,氏名一覧!$A$3:$E$102,2))
D105 =IF(C105="役員",IF(B105="","",VLOOKUP(B105,氏名一覧!$A$3:$E$102,3)),"")
E105 =IF(C105="役員",IF(B105="","",(VLOOKUP(B105,氏名一覧!$A$3:$E$102,4))),"")



A205 =氏名一覧!M5
B205 =氏名一覧!O5
C205 =IF(B205="","",VLOOKUP(B105,氏名一覧!$A$3:$E$102,2))
D205 =IF(C205="監事",IF(B205="","",VLOOKUP(B205,氏名一覧!$A$3:$E$102,3)),"")
E205 =IF(C205="監事",IF(B205="","",(VLOOKUP(B205,氏名一覧!$A$3:$E$102,4))),"")

という数式が既に入っているということでよろしいのですか?
6行以下も同様の数式が入っているという解釈です。

そして、もしそうだとしたら、「シート氏名一覧には、上限100人までのデータが
入力可能というレイアウトになっている」
ということでよろしいでしょうか?
よって、この役員シートでは、役員ではない方の行を非表示にしたい
という仕様でしょうか?


教えて下さい。

【10679】Re:プロシジャー分割
回答  かぷ  - 04/2/6(金) 0:18 -

引用なし
パスワード
   ▼ichinose さん:
こんばんは。
>>
>>>で、知りたいのは、シート「氏名一覧」の4行目氏名にデータの場合には、
>>>各シートのほとんどが4行目を表示・非表示の設定、役員シートの役員と監事がそれぞれ
>>>100+4、200+4行目を表示・非表示の設定を行っています。
>>
>>>これが、シート「氏名一覧」の5行目氏名に対しては、各シートの何行目に対して
>>>表示・非表示の設定を行うのかということなんです。
>>
>>氏名一覧の一部ですが(現状)
>>A4 は 1 (1)
>>B4 は 入力禁則で変更します(掃除)
>>C4 は 氏名(A)
>>D4 は 口座店名
>>E4 は 口座番号
>>F4 は 時間給1(1000)
>>G4 は 時間給2(1100)
>>H4 は 時間給3(1200)
>>I4 は 入力禁則で変更します(乙)
>>J4 は 人数(0)
>>K4 は チェックボックス($Q$4)
>>M4 は =IF(Q4=TRUE,B4,IF(B4="社長","社長",""))
>>Q4 FALSE (TRUE)
>>A5 は (2)
>>B5 は 入力禁則で変更します(役員)
>>C5 は 氏名(A)
>>D5 は 口座店名
>>E5 は 口座番号
>>F5 は 時間給1(1000)
>>G5 は 時間給2(1100)
>>H5 は 時間給3(1200)
>>I5 は 入力禁則で変更します(乙)
>>J5 は 人数(0)
>>K5 は チェックボックス($Q$5)
>>M5 は =IF(Q5=TRUE,B5,IF(B5="社長","社長",""))
>>Q5 FALSE (TRUE)
>>A6 (3)
>>以下同様です。
>はい、ここまではわかりましたし、想像していたとおりです。
>
>で、知りたかったのはこれ以下のレイアウト
>何となく、想像つくんですが、はっきりしないんです。
>
>
>>
>>役員シートの
>>A4 =氏名一覧!M4
>>B4 =氏名一覧!O4
>>C4 =IF(B4="","",VLOOKUP(B4,氏名一覧!$A$3:$E$102,2))
>>D4 =IF(C4="社長",IF(B4="","",VLOOKUP(B4,氏名一覧!$A$3:$E$102,3)),"")
>>E4 =IF(C4="社長",IF(B4="","",(VLOOKUP(B4,氏名一覧!$A$3:$E$102,4))),"")
>>・
>>・
>>・
>>A104 =氏名一覧!M4
>>B104 =氏名一覧!O4
>>C104 =IF(B104="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,2))
>>D104 =IF(C104="役員",IF(B104="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,3)),"")
>>E104 =IF(C104="役員",IF(B104="","",(VLOOKUP(B104,氏名一覧!$A$3:$E$102,4))),"")
>>・
>>・
>>・
>>A204 =氏名一覧!M4
>>B204 =氏名一覧!O4
>>C204 =IF(B204="","",VLOOKUP(B104,氏名一覧!$A$3:$E$102,2))
>>D204 =IF(C204="監事",IF(B204="","",VLOOKUP(B204,氏名一覧!$A$3:$E$102,3)),"")
>>E204 =IF(C204="監事",IF(B204="","",(VLOOKUP(B204,氏名一覧!$A$3:$E$102,4))),"")
>
>上記は、シート氏名一覧の4行目のデータが役員だった場合ですよね?
>では、5行目が役員だった場合は?
>A5 =氏名一覧!M5
>B5 =氏名一覧!O5
>C5 =IF(B5="","",VLOOKUP(B5,氏名一覧!$A$3:$E$102,2))
>D5 =IF(C5="社長",IF(B5="","",VLOOKUP(B5,氏名一覧!$A$3:$E$102,3)),"")
>E5 =IF(C5="社長",IF(B5="","",(VLOOKUP(B5,氏名一覧!$A$3:$E$102,4))),"")
>・
>・
>・
>A105 =氏名一覧!M5
>B105 =氏名一覧!O5
>C105 =IF(B105="","",VLOOKUP(B105,氏名一覧!$A$3:$E$102,2))
>D105 =IF(C105="役員",IF(B105="","",VLOOKUP(B105,氏名一覧!$A$3:$E$102,3)),"")
>E105 =IF(C105="役員",IF(B105="","",(VLOOKUP(B105,氏名一覧!$A$3:$E$102,4))),"")
>・
>・
>・
>A205 =氏名一覧!M5
>B205 =氏名一覧!O5
>C205 =IF(B205="","",VLOOKUP(B105,氏名一覧!$A$3:$E$102,2))
>D205 =IF(C205="監事",IF(B205="","",VLOOKUP(B205,氏名一覧!$A$3:$E$102,3)),"")
>E205 =IF(C205="監事",IF(B205="","",(VLOOKUP(B205,氏名一覧!$A$3:$E$102,4))),"")
>
>という数式が既に入っているということでよろしいのですか?
>6行以下も同様の数式が入っているという解釈です。
>
>そして、もしそうだとしたら、「シート氏名一覧には、上限100人までのデータが
>入力可能というレイアウトになっている」
>ということでよろしいでしょうか?
>よって、この役員シートでは、役員ではない方の行を非表示にしたい
>という仕様でしょうか?
>
>
>教えて下さい。

はい、その通りです。
今のところは数式が入っていてそれを出したり消したりしていたんですが、とても膨大な数のマクロが必要になってしまって、自分なりに考えてもまとまらなかったので、ここに記載させて貰った次第でございます。

【10680】Re:プロシジャー分割
回答  ichinose  - 04/2/6(金) 1:10 -

引用なし
パスワード
   ▼かぷ さん:
こんばんは。
これで、どうでしょうか?
'====================================================================
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 idx As Long
  Dim jdx As Long
  With Worksheets("氏名一覧")
   For idx = 4 To 102
 
     For jdx = LBound(dsp_row_flg()) To UBound(dsp_row_flg())
      dsp_row_flg(jdx) = True
      Next jdx
     Select Case Range("m" & idx).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(8) = False
      Case "役員"
       dsp_row_flg(9) = False
      Case "監事"
       dsp_row_flg(10) = False
      Case "事務"
       dsp_row_flg(1) = False
      End Select
     Call シート設定(idx, dsp_row_flg())
     Next idx
   End With
  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


プロシジャー「チェックA」を実行してみて下さい。
尚、シート「氏名一覧」4行目から、102行目をチェック対象としています。

確認してみて下さい。

【10683】Re:プロシジャー分割
お礼  かぷ E-MAIL  - 04/2/6(金) 9:50 -

引用なし
パスワード
   ▼ichinose さん:
>'====================================================================
>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 idx As Long
>  Dim jdx As Long
>  With Worksheets("氏名一覧")
>   For idx = 4 To 102
> 
>     For jdx = LBound(dsp_row_flg()) To UBound(dsp_row_flg())
>      dsp_row_flg(jdx) = True
>      Next jdx
>     Select Case Range("m" & idx).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(8) = False
>      Case "役員"
>       dsp_row_flg(9) = False
>      Case "監事"
>       dsp_row_flg(10) = False
>      Case "事務"
>       dsp_row_flg(1) = False
>      End Select
>     Call シート設定(idx, dsp_row_flg())
>     Next idx
>   End With
>  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
>
>
>プロシジャー「チェックA」を実行してみて下さい。
>尚、シート「氏名一覧」4行目から、102行目をチェック対象としています。
>
>確認してみて下さい。

(/゜ο゜)/ オオオオォォォォォォ-
動きましたぁ!
凄い!他のシートに移動しなくても変更できるのですね。
4行目の人だけじゃなくチェックAだけで5行目の人も可変可能なんて・・

どうもありがとうございました。
また、わからない事があったらここに質問させてもらいます。

本当にichinoseさんありがとうございました。

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