advanced help
per page, with , order by , clip by
Results of 1 - 1 of about 37670 for IF (0.007 sec.)
[[20130320082734]]
#score: 1591
@digest: bc3ca4543959abb7defc0dbb18dfa1ff
@id: 61834
@mdate: 2013-04-06T09:43:02Z
@size: 19019
@type: text/plain
#keywords: 庫印 (488775), jobid (154997), cknum (105446), 刷3 (58663), 入庫 (49546), ckprint (44285), 刷業 (43943), 刷処 (41164), optionbutton2 (36460), 刷", (35180), 出庫 (32639), 刷対 (32277), optionbutton1 (30815), 刷2 (29354), 世代 (23250), checkbox (22657), 刷( (22104), checkbox2 (20885), done (20281), checkbox1 (17352), ドen (16236), 印刷 (12445), listbox1 (11818), 理コ (9572), 業名 (7438), listbox (5776), 将来 (5326), controls (5105), クボ (4956), userform1 (4380), 増減 (4318), commandbutton1 (3955)
『複数のcheckboxとoptionbuttonの上手な記述について』(くま)
はじめまして。現在下記のようなロジックで記述しています。 (仕様) Userform1にあるcheckbox1かつoptionbutton1が選択されると 入庫印刷対応を行う。 Userform1にあるcheckbox1かつoptionbutton2が選択されると 出庫印刷対応を行う。 checkboxは1〜2個を配置(将来的に増減の可能性有り) optionbuttonは1〜2のみ配置(1・・・入庫/2・・・出庫に対応) (希望) 1.checkboxを1、2を同時選択しても動くようにしたい。 2.将来的にcheckboxは増減する可能性があるため、メンテしやすいようにしたい。 →処理が増減するとcheckboxとoptionbuttonの組み合わせ(if〜elseif)を増やすと 個々の処理は対応できるのですが、複数選択で一括印刷処理はできないかと考えます。 「要はcheckbox1と2(将来的に10個ほど)を選択+optionbutton1を選択で入庫印刷」 「checkbox1と2(将来的に10個ほど)を選択+optionbutton2を選択で出庫印刷」 ができるのが理想です。 まだ変数とかの考えができないレベルの者なのでどなたかご教授お願いできませんでしょうか? よろしくお願いします。 ちなみにExcel2003/Windows7を使用しています。 (ロジック) Private Sub CommandButton1_Click() '印刷ボタン 'チェックボックス値判定 チェックボックスの選択結果を調べる '入庫印刷対応 If UserForm1.CheckBox1.Value = True And UserForm1.OptionButton1.Value = True Then 入庫印刷対応 CheckBox1.Value = False OptionButton1.Value = False '出庫印刷対応 ElseIf UserForm1.CheckBox1.Value = True And UserForm1.OptionButton2.Value = True Then 出庫印刷対応 CheckBox1.Value = False OptionButton2.Value = False 'A世代 入庫印刷対応 ElseIf UserForm1.CheckBox2.Value = True And UserForm1.OptionButton1.Value = True Then A世代入庫印刷対応 CheckBox2.Value = False OptionButton1.Value = False 'A世代 出庫印刷対応 ElseIf UserForm1.CheckBox2.Value = True And UserForm1.OptionButton2.Value = True Then A世代入庫印刷対応 CheckBox2.Value = False OptionButton2.Value = False Else タイトル = "チェックボックスの選択結果" MsgBox "どの処理も選択されていません", vbCritical, タイトル 'Unload Me 'ユーザーフォームを消す Exit Sub End If End Sub ---- まず、順序が逆だと思う。 1.コードの運びを見る限りオプションボタンの初期値(デザインでのプロパティ)は、すべてFalseのようだから 最初に、OptonButtonのいずれかが選択されているかどうかを判定して、いずれも選択されていなければメッセージを出して プロシジャを終了。 2.で、次にチェックボックスの選択により、該当の入庫または出庫処理を実行。 3.必要なら、チェックボックスが選択されていなかった場合は、メッセージ表示。 こんな流れになると思う。 (考え方としては、デザイン時プロパティで、初期値として、どちらかのオプションボタンの値をTrueにする手もある。 そうしておけば、どちらかのオプションボタンは常に選ばれた状態になっていて、コード的には楽になるので) 将来的にチェックボックスが10個ほどになれば、その扱いをループで回すこともできるけど、とりあえずベタな構えで一例。 Private Sub CommandButton1_Click() Dim jobid As Long Dim done As Boolean If OptionButton1.Value Then jobid = 1 If OptionButton2.Value Then jobid = 2 If jobid = 0 Then MsgBox "入庫または出庫を選んでください" Exit Sub End If If CheckBox1.Value Then done = True If jobid = 1 Then 入庫印刷 Else 出庫印刷 End If End If If CheckBox2.Value Then done = True If jobid = 1 Then 入庫印刷2 Else 出庫印刷2 End If End If If CheckBox3.Value Then done = True If jobid = 1 Then 入庫印刷3 Else 出庫印刷3 End If End If If Not done Then MsgBox "印刷業務を選んでください" Exit Sub End If OptionButton1.Value = False OptionButton2.Value = False CheckBox1.Value = False CheckBox2.Value = False CheckBox3.Value = False End Sub (ぶらっと) ---- 少し冗長ですが思いつかないので Case文で書いてみました。 この方法も増やし易いと自分では思っていますが、さて。。。 注)テスト確認用に各サブはMSGBOXにしてます。 Private Sub CommandButton1_Click() ' チェックボックスの選択結果を調べる Select Case True Case CheckBox1.Value = True And OptionButton1.Value = True '入庫印刷対応 MsgBox "入庫印刷対応" Case CheckBox1.Value = True And OptionButton2.Value = True '出庫印刷対応 MsgBox "出庫印刷対応" Case CheckBox2.Value = True And OptionButton1.Value = True 'A世代 入庫印刷対応 MsgBox "A世代入庫印刷対応" Case CheckBox2.Value = True And OptionButton2.Value = True 'A世代 出庫印刷対応 MsgBox "A世代入庫印刷対応" Case Else タイトル = "チェックボックスの選択結果" MsgBox "どの処理も選択されていません", vbCritical, タイトル End Select CheckBox1.Value = False CheckBox2.Value = False OptionButton1.Value = False OptionButton2.Value = False End Sub (Cod) ---- おまけで。(10:40 コード一部変更) 以下のような記述も。この場合、入庫や出庫のプロシジャ(Arrayの中で記述されているもの)は ユーザーフォームモジュールではなく標準モジュールに書いてね。 Private Sub CommandButton1_Click() Dim jobid As Long Dim done As Boolean Dim x As Long If OptionButton1.Value Then jobid = 1 If OptionButton2.Value Then jobid = 2 If jobid = 0 Then MsgBox "入庫または出庫を選んでください" Exit Sub End If For x = 1 To 3 'CheckBox●の数 If Me.Controls("CheckBox" & x).Value Then done = True If jobid = 1 Then Application.Run VBA.Array("入庫印刷", "入庫印刷2", "入庫印刷3")(x - 1) Else Application.Run VBA.Array("出庫印刷", "出庫印刷2", "出庫印刷3")(x - 1) End If End If Next If Not done Then MsgBox "印刷業務を選んでください" Exit Sub End If OptionButton1.Value = False OptionButton2.Value = False For x = 1 To 3 Me.Controls("CheckBox" & x).Value = False Next End Sub (ぶらっと) ---- ぶらっとさん、Codさん 丁寧な解説、ありがとうございます。 確かにOptionButtonからやればif文が少なくてですね。 ちょっとストレートに考え過ぎていました。 Codさん select〜caseも考えていましたが、増減で少し苦労しそうだったので。 でも、冗長的でも参考になります。 ありがとうございます。 ぶらっとさん やはり変数でやるとメンテがしやすいのがよく分かりました。 まだまだ勉強不足です。 とりあえずお昼くらいにもう一度書いてみて試してみたいと思います。 ちなみに >入庫や出庫のプロシジャ(Arrayの中で記述されているもの)は >ユーザーフォームモジュールではなく標準モジュールに書いてね。 とアドバイスいただいた件についてですが、標準モジュールとは ThisWorkbookもしくは通常のマクロ(新規マクロetc)に記述しておく・・・ という意味なのでしょうか? またその際に入庫印刷・出庫印刷がそれぞれ複数(入庫印刷3 exc)記述されていますが、 これはchekboxの増減で変化する感じなのでしょうか? コメントの「CheckBox●の数」が3つのループなので 入庫印刷/出庫印刷が3つずつ記述ということで認識していますが。 まだ分かっていないもので、よろしくお願いします。 (くま) ---- >標準モジュールとは ThisWorkbookもしくは通常のマクロ(新規マクロetc)に記述しておく・・・という意味なのでしょうか? 標準モジュールは、マクロ記録をすると書き込まれるモジュール。 新規に作成する場合はVBE画面のメニューの挿入から標準モジュールを選ぶ。 >またその際に入庫印刷・出庫印刷がそれぞれ複数(入庫印刷3 exc)記述されていますが、 >これはchekboxの増減で変化する感じなのでしょうか? Arrayの中のプロシジャ名が、CheckBox1,CheckBox2,CheckBox3。。。。の順番で対応。 >コメントの「CheckBox●の数」が3つのループなので入庫印刷/出庫印刷が3つずつ記述ということで認識していますが。 そういうこと。 なので、今後、CheckBoxが増えて、4つになった場合は、 ・Arrayの中に、4番目のプロシジャ名を追加 ・2か所ある For x = 1 To ● の ●を変更。 こうするだけで、他のコードはさわらなくてもいい。 ところで、以下のようにしておくと、さらに For x = 1 To ● もさわらなくてもいいようになる。 (Arrayへの追加のみでOKになる) Private Sub CommandButton1_Click() Dim jobid As Long Dim done As Boolean Dim x As Long Dim ckNum As Long Dim inArray As Variant Dim outArray As Variant If OptionButton1.Value Then jobid = 1 If OptionButton2.Value Then jobid = 2 If jobid = 0 Then MsgBox "入庫または出庫を選んでください" Exit Sub End If inArray = VBA.Array("入庫印刷", "入庫印刷2", "入庫印刷3") outArray = VBA.Array("出庫印刷", "出庫印刷2", "出庫印刷3") ckNum = UBound(inArray) + 1 For x = 1 To ckNum 'CheckBox●の数 If Me.Controls("CheckBox" & x).Value Then done = True If jobid = 1 Then Application.Run inArray(x - 1) Else Application.Run outArray(x - 1) End If End If Next If Not done Then MsgBox "印刷業務を選んでください" Exit Sub End If OptionButton1.Value = False OptionButton2.Value = False For x = 1 To ckNum Me.Controls("CheckBox" & x).Value = False Next End Sub (ぶらっと) ---- 補足 たとえば VBA.Array("入庫印刷", "入庫印刷2", "入庫印刷3") と VBA.Array("出庫印刷", "出庫印刷2", "出庫印刷3") という記述であれば 標準モジュールに Sub 出庫印刷() 'この印刷処理コード End Sub Sub 入庫印刷() 'この印刷処理コード End Sub Sub 出庫印刷2() 'この印刷処理コード End Sub Sub 入庫印刷2() 'この印刷処理コード End Sub Sub 出庫印刷3() 'この印刷処理コード End Sub Sub 入庫印刷3() 'この印刷処理コード End Sub こんなプロシジャを書いておく。 (ぶらっと) ---- もう1つ、おまけで。 以下のような構えにしておけば、CHeckBoxが増えたとき、ユーザーフォーム側は、デザインで、そのCheckBoxを追加するだけで コードはいじらなくてもOK。標準モジュールがわのみ、必要なロジックを追加記述する。 ユーザーフォーム上に、この印刷関連のチェックボックスしかなければ、名前は CheckBox1、CheckBox2 等でもいいけど コードでの処理を容易にするために、CheckBoxの名前を "CkPrint_1" とか "CkPrint_2" とかにしておく。 (ユーザーフォーム側) Private Sub CommandButton1_Click() Dim jobid As Long Dim done As Boolean Dim cknum As Long Dim ctrl As Object If OptionButton1.Value Then jobid = 1 If OptionButton2.Value Then jobid = 2 If jobid = 0 Then MsgBox "入庫または出庫を選んでください" Exit Sub End If For Each ctrl In Me.Controls If ctrl.Name Like "CkPrint_*" Then If ctrl.Value Then done = True cknum = Split(ctrl.Name, "_")(1) If jobid = 1 Then Call 入庫印刷(cknum) Else Call 入庫印刷(cknum) End If End If End If Next If Not done Then MsgBox "印刷業務を選んでください" Exit Sub End If OptionButton1.Value = False OptionButton2.Value = False For Each ctrl In Me.Controls If ctrl.Name Like "CkPrint_*" Then ctrl.Value = False Next End Sub (標準モジュール側) Sub 入庫印刷(cknum As Long) Select Case cknum Case 1 '1の場合の入庫印刷処理 Case 2 '2の場合の入庫印刷処理 Case 3 '3の場合の入庫印刷処理 End Select End Sub Sub 出庫印刷(cknum As Long) Select Case cknum Case 1 '1の場合の出庫印刷処理 Case 2 '2の場合の出庫印刷処理 Case 3 '3の場合の出庫印刷処理 End Select End Sub (ぶらっと) ---- ぶらっとさん お礼が遅くなり申し訳ございません。思う動きになり大変感謝しております。 引き続きここに書く事を迷いましたがもう1点教えていただけますでしょうか。 複数CheckBoxを想定していましたが予想以上に増えてきてUserForm上の見栄えが 悪くなり、ListBoxではどうなるのかと考えています。 そこでUserForm2に Private Sub UserForm_Initialize() With ListBox1 .ColumnCount = 2 .RowSource = Worksheets("処理対象").Range("a1:a50").Address End With End Sub でListに対象処理を表示。それを選択→OptionButton1or2+CommandButton1で 処理実行できないかと。 教えていただいたコードより Private Sub CommandButton1_Click() Dim jobid As Long Dim done As Boolean Dim cknum As Long Dim ctrl As Object If OptionButton1.Value Then jobid = 1 If OptionButton2.Value Then jobid = 2 If jobid = 0 Then MsgBox "入庫または出庫を選んでください" Exit Sub End If For Each ctrl In Me.Controls If ListBox1.Selected(i) = True Then If ctrl.Value Then done = True cknum = Split(ctrl.Name, "_")(1) ←←← If jobid = 1 Then Call 入庫印刷(cknum) Else Call 入庫印刷(cknum) End If End If End If Next If Not done Then MsgBox "印刷業務を選んでください" Exit Sub End If OptionButton1.Value = False OptionButton2.Value = False For Each ctrl In Me.Controls If ctrl.Name Like "CkPrint_*" Then ctrl.Value = False Next End Sub でif文を記述してみましたが、「←←←」の箇所が正直分かりません。 CheckBoxで教えていただいた時は CkPrint_*の"_"があればその値をcknumに代入し、入庫/出庫印刷処理の select〜caseに受け渡すと理解しています。 今回ListBoxの場合、どうしていいものか分かりません。 もしよろしければ再度、ご教授お願いできませんでしょうか? よろしくお願いします。 (くま) ---- CheckBoxをListBoxにかえることは大賛成。 で、CommandButton1_Click は以下のように。 入庫印刷や出庫印刷には、選ばれたリスト内行番号(1〜)がわたされる。 Private Sub CommandButton1_Click() Dim jobid As Long Dim done As Boolean Dim cknum As Long If OptionButton1.Value Then jobid = 1 If OptionButton2.Value Then jobid = 2 If jobid = 0 Then MsgBox "入庫または出庫を選んでください" Exit Sub End If For cknum = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(cknum) = True Then done = True If jobid = 1 Then Call 入庫印刷(cknum + 1) Else Call 入庫印刷(cknum + 1) End If End If Next If Not done Then MsgBox "印刷業務を選んでください" Exit Sub End If OptionButton1.Value = False OptionButton2.Value = False For cknum = 0 To ListBox1.ListCount - 1 ListBox1.Selected(cknum) = False Next End Sub ところで、Initialize ルーティンだけど ・.ColumnCount = 2 この意味は? コードではA列1列のみをListBox1にセットしているね。 もちろん、ListBox1 に2列表示させることもできるので、その場合は 2 でいいんだけど? 1列表示なら、初期値 1 なので、ここは何もしなくてもいい。 さらに、2列だったとしても、デザインでプロパティの ColumnCount を 2 にセットしておけば コードは不要。 ・RowSource だけど、処理対象シートの A1:A50 とセットしてるね。おそらく、A50 まで実際の登録があるのではなく これぐらいをセットしておけば、将来増えたときに、コードを直さなくてもいいという思いだろうけど、 もし、51個になるとコード修正しなきゃいけない。それより、当面、何も登録されていない空白行が ListBox1 にずらっと表示されて、そこを選択できるようになってしまう。そうすると、空白行チェックとか よけいなロジックが必要になるね。それと、アップされた形では、シート名のないアドレス、A1:A50 。 なので、実際の表示はユーザーフォームを表示したときのアクティブシートの領域からセットされてしまうよ。 あと、RowSource でもいいけど、List に直接、いれこむこともできる。 ということで、Initialize は以下。 Private Sub UserForm_Initialize() With Sheets("処理対象") ListBox1.RowSource = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)).Address(External:=True) ' または ' ListBox1.List = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)).Value End With End Sub (ぶらっと) ---- ぶらっとさん お礼が遅くなり申し訳ありません。 ListBoxへ変更について問題なく動きました。 まだまだ変数渡しについて勉強が必要ですが。。。 > ところで、Initialize ルーティンだけど これは私の修正漏れでした。 もともとA列に作業名、B列に処理名かを入力しようとしていたのですが、 ListBoxの表示が切れてしまい、統合したところ修正が漏れていました。 ListBoxの表示エリアを広げればとも思ったのですが、 A列に統合する形で収まりました。 ちなみにLisBoxの表示についてですが、 (例) 作業名1 処理A 処理B 作業名2 処理C 処理D 作業名3 処理E のような形で処理*のみ選択可(作業名は選択させない)というのは 可能なのでしょうか? 調べているのですがそれらしい記述がなくて。 もちろん、現状ではご教授いただいた内容で問題ないので もしご存知でしたらでかまいません。あくまで表題みたいな感じですので。 ちなみにfmMultiSelectではとも思ったのですが、違いまして。 しかし、何から何までありがとうございます。 (くま) ---- まず、2列表示で、表示が切れてしまい・・・だけど、デザインでリストボックスそのものの幅を充分な広さにしておくとか 各列、それぞれの幅を適切な長さに広げておくとか、そういったことで大丈夫だと思うんだけど? で、この例なら、操作を考えると1列目に処理名、2列目に備考としての作業名をいれておくといいんじゃないかな? そう思うけど、とりあえず、ご要望の件。 セルに保護をかけて、選ぶことができなくなる、そんなイメージだね。 ほんとは無理なので、ちょっとインチキしてごまかしてみよう。 以下のプロシジャを追加。 Private Sub ListBox1_Change() If Me.Tag = "Skip" Then Exit Sub Me.Tag = "Skip" If Not ListBox1.List(ListBox1.ListIndex) Like "処理*" Then ListBox1.Selected(ListBox1.ListIndex) = False Me.Tag = "" End Sub 追記) もし 処理なんとか の先頭にスペースがついているなら、 ListBox1.List(ListBox1.ListIndex) を Trim(ListBox1.List(ListBox1.ListIndex)) にしてね。 (ぶらっと) ---- ぶらっとさん いつもいつも丁寧な説明、ありがとうございます。 あれから考えていたのですが、作業名を選択しても何も処理をしなければいいのでは? と。逆の発想? ただし、2列配列にするために、もう一度Form_Initialize箇所を考える必要がありますが。 試行錯誤なんとか考えて見ます。 前の Private Sub UserForm_Initialize() With ListBox1 .ColumnCount = 2 .RowSource = Worksheets("処理対象").Range("a1:a50").Address End With はおっしゃるように範囲指定になりますし。。 でもなるほどです。IfでNotですか。なかなか知識がある方でしか思いつかない手では! 正直、全く思いつきませんでした。 本当にいつも助かります。もっと使って習熟せねば。 (くま) ...
http://www.excel.studio-kazu.jp/wiki/kazuwiki/201303/20130320082734.txt - [detail] - similar
PREV NEXT
Powered by Hyper Estraier 1.4.13, with 97017 documents and 608140 words.

訪問者:カウンタValid HTML 4.01 Transitional