• ベストアンサー

Excel VBAでのMultipageの選択

フォーム上に配置したマルチページ(ページタブは3つ有ります)のうち、任意のページをアクティブもしくは選択する方法が分かりません。 例えば、1つ目のページをアクティブにするには、どの様なコードを書けば良いのでしょうか?いろいろ本などで調べましたが、見つかりませんでした。 エクセルのバージョンは97です。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

どもども田吾作7です。 MultiPage1.Value=ページのインデックス値 これでページは切り替わります。 でわでわ

その他の回答 (3)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

結果からいうと無理です。 別々のCheckBoxは個々単体ですので、VBの基本として、 Object.プロパティやObject.メソッド など、一つのコントロールに対しての命令や属性の変更をかけることしかできません。 もし他の方法を望むのであれば、次のロジックはどうでしょうか? (これまた参考です。) 手順1.EXCEL起動時にUserFormをロードしておく 手順2.シート1のCells(1,1)からCells(100,1)の値をUserFormのチェックボックスに反映させる。 手順3.Cells(1,1)からCells(100,1)の値の変更イベント時に、対応するチェックボックスだけ、値を変更する(サンプルモジュールがありますのでそちらを見てください。 手順4.必要なときにUserFormをShowする。 手順5.必要ないときはUserFormをアンロードしないで、Visible=Falseにする。 あとは手順3~5の処理をEXCELが終了するまで繰り返します。 以下のコードをシート1のモジュールに記述してください。 (このサンプルは1~5行目までの変更を認識し、対応するチェックボックスの値を変更します。) Private Sub Worksheet_Change(ByVal Target As Range) Dim wkRange As Range Set wkRange = Target(1, 1) '1列目(A)以外は未処理 If Not (wkRange.Column = 1) Then GoTo PGMEND '5行目以上は未処理 If (wkRange.Row > 5) Then GoTo PGMEND UserForm1("CheckBox" & wkRange.Row).Value = (wkRange.Value = 1) PGMEND: End Sub 毎回たくさんチェックするのがいやなのであれば、こういった方法もありますよ。 でわでわ

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

どもども 再々度 田吾作7です。 >効率よくチェックしたり、設定するには・・・hogehoge とありましたが、チェックロジックは全体の処理を知らないと、答えようが・・・ 設定は、回答No1のお礼に書いてあったソース部分だけでいうと For i = 1 to 100 Userform1("CheckBox" & i).Value = (cells(i, 1).value = 1) Next i ってな感じでいいと思います。 Value に設定してある(cells(i, 1).value = 1)の部分がTrue/Falseを返すので、その値をそのままセットしてやると、If文を使用しないで済むと思います。 (σ( ̄ー ̄ ボク If文少ないの好きです) さっきも言ったようにチェックロジックは、全体の処理の流れがわからないと、下手なことを言うことが出来ません。ですので、一応の参考として、チェックロジックのソースを書いておきますが、ご自分の好きなように変更を加えて、今作成中のプログラムに適した形にしてください。 ※必要なコントロール 1.コマンドボタン1 2.リストボックス 3.マルチページ 4.マルチページの中にチェックボックスたくさん(各ページにたくさんチェックボックスがあった方が、実験になると思います) Private Sub CommandButton1_Click() With UserForm1 Call CheckBoxValue_ListBoxOut(.MultiPage1.Pages(0), .ListBox1) End With End Sub '【機能】リストボックスにマルチページ内の指定ページのチェックボックスの状態を出力 '【パラメータ】 '1.ページオブジェクト '2.リストボックスオブジェクト Sub CheckBoxValue_ListBoxOut(inPage As Page, OutListBox As Control) Dim wkCtrlCnt As Long '指定のページに存在するコントロールの数のカウント Dim wkCheckBox As Control 'チェックボックスコントロールの一時セットワーク Dim i As Long 'ループカウンタ '出力先リストボックスをクリア OutListBox.Clear 'ページ内のコントロールの数を得る wkCtrlCnt = inPage.Controls.Count 'コントロールの数だけループする For i = 1 To wkCtrlCnt 'i番目のコントロールのタイプがチェックボックスだった時 If TypeName(inPage.Controls(i - 1)) = "CheckBox" Then 'ワークに一時セットする(別にセットしないでもかまわないけど、この方が見栄えがよい) Set wkCheckBox = inPage.Controls(i - 1) 'リストボックスへ出力 OutListBox.AddItem wkCheckBox.Name & " のValueは " & wkCheckBox.Value End If Next i '開放 Set wkCheckBox = Nothing End Sub あくまでも、参考です・・・ でわでわ

mygsk
質問者

お礼

田吾作7さん、まいどありがとうございます。 For i = 1 to 100 Userform1("CheckBox" & i).Value = (cells(i, 1).value = 1) Next i でとりあえず試してみます。 さっきも言ったようにチェックロジックは、全体の処理の流れがわからないと、 下手なことを言うことが出来ません。 プログラムで行いたいことは、任意のWorksheet(例えばWorksheets(1))の Cell(1,1)からCell(100,1)に入っている値が1(もしくは""以外)ならば、 それに対応するCheckboxをtrueに設定することです。Cell(1,1)がcheckbox1 にCell(2,1)がcheckbox2,,,,Cell(100,1)がcheckbox100に対応しています。 CheckboxはMultipage1上に配置してあります。 初心者の私には、Cellの値を一つ一つチェックして、Checboxの値を設定して 行くことくらいなら、コードをたくさん書けば可能なのですが、もっと効率の 良いやり方が有るはずだと思い質問させていただきました。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

再び田吾作7です。 締め切ってない所を見ると、見てないのか、あるいは「ページのインデックス値 」がわからなかったのかな? 一応参考までに、、、 1番目のタブを指定 MultiPage1.Value=0 2番目のタブを指定 MultiPage1.Value=1 3番目のタブを指定 MultiPage1.Value=2 ってな感じです。 詳しく言うと、各ページはページというオブジェクトで、マルチページとはそのページオブジェクトをコレクション化した(束ねた)ものです。 MultiPage1.Pages(1) とするとページの中を操作しますが、今回したい作業は「どのページをアクティブにするか」ということなので、「このコレクションに対して、どれをアクティブにするか」という命令になります。よってMultiPage1の中のページオブジェクトを操作するのではなく、MultiPage1自身を操作することになります。 それにしても、Valueでページを変更するってのはチョット違和感がありますよね。Microsoftさんの思惑が時々わからなくなるのは僕だけでしょうか? ( ̄ロ ̄lll) あっ 愚痴ってしまった。。。 でわでわ

mygsk
質問者

お礼

遅くなりましたが、回答ありがとうございました。 No1の回答で十分なところを、さらに詳しく解説していただき 恐縮しております。問題は無事に解決しました。 それにしても、Valueでページを変更するってのはチョット違和感がありますよね。Microsoftさんの思惑が時々わからなくなるのは僕だけでしょうか? 私も以下の様なコードを書いてしまい、エラーが起きました。 Userform1.MultiPage1.Page1.ActivateとかSelect Userform1.MultiPage1.Pages(1).Activate まさか、MultiPage本体のValueで設定するとは思いもつきませんでした。 ついでに、もう一つ教えていただきたいのですが、Multipage1上に配置した Checkbox(例えば100個、Checkbox1-100)のvalueがTrueかFalseかを 効率よくチェックしたり、設定するにはどの様なコードが最適でしょうか? 例えば、 For i = 1 to 100 If cells(i, 1).value = 1 then Checkbox(i).value=True Else Checkbox(i).value=false End if Next i と言った感じです。

関連するQ&A