OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

Excel VBAでのMultipageの選択

  • すぐに回答を!
  • 質問No.102617
  • 閲覧数10773
  • ありがとう数13
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 45% (22/48)

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

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

  • 回答No.1
レベル12

ベストアンサー率 65% (276/422)

どもども田吾作7です。

MultiPage1.Value=ページのインデックス値

これでページは切り替わります。

でわでわ
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.2
レベル12

ベストアンサー率 65% (276/422)

再び田吾作7です。 締め切ってない所を見ると、見てないのか、あるいは「ページのインデックス値 」がわからなかったのかな? 一応参考までに、、、 1番目のタブを指定 MultiPage1.Value=0 2番目のタブを指定 MultiPage1.Value=1 3番目のタブを指定 MultiPage1.Value=2 ってな感じです。 詳しく言うと、各ページはページという ...続きを読む
再び田吾作7です。

締め切ってない所を見ると、見てないのか、あるいは「ページのインデックス値 」がわからなかったのかな?

一応参考までに、、、
1番目のタブを指定
MultiPage1.Value=0
2番目のタブを指定
MultiPage1.Value=1
3番目のタブを指定
MultiPage1.Value=2

ってな感じです。

詳しく言うと、各ページはページというオブジェクトで、マルチページとはそのページオブジェクトをコレクション化した(束ねた)ものです。
MultiPage1.Pages(1) とするとページの中を操作しますが、今回したい作業は「どのページをアクティブにするか」ということなので、「このコレクションに対して、どれをアクティブにするか」という命令になります。よってMultiPage1の中のページオブジェクトを操作するのではなく、MultiPage1自身を操作することになります。

それにしても、Valueでページを変更するってのはチョット違和感がありますよね。Microsoftさんの思惑が時々わからなくなるのは僕だけでしょうか?
( ̄ロ ̄lll) あっ 愚痴ってしまった。。。

でわでわ
お礼コメント
mygsk

お礼率 45% (22/48)

遅くなりましたが、回答ありがとうございました。
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
と言った感じです。
投稿日時 - 2001-07-12 09:17:21
  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

どもども 再々度 田吾作7です。 >効率よくチェックしたり、設定するには・・・hogehoge とありましたが、チェックロジックは全体の処理を知らないと、答えようが・・・ 設定は、回答No1のお礼に書いてあったソース部分だけでいうと For i = 1 to 100 Userform1("CheckBox" & i).Value = (cell ...続きを読む
どもども 再々度 田吾作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

お礼率 45% (22/48)

田吾作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の値を設定して
行くことくらいなら、コードをたくさん書けば可能なのですが、もっと効率の
良いやり方が有るはずだと思い質問させていただきました。
投稿日時 - 2001-07-12 13:10:08
  • 回答No.4
レベル12

ベストアンサー率 65% (276/422)

結果からいうと無理です。 別々のCheckBoxは個々単体ですので、VBの基本として、 Object.プロパティやObject.メソッド など、一つのコントロールに対しての命令や属性の変更をかけることしかできません。 もし他の方法を望むのであれば、次のロジックはどうでしょうか? (これまた参考です。) 手順1.EXCEL起動時にUserFormをロードしておく 手順2.シート1のC ...続きを読む
結果からいうと無理です。

別々の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


毎回たくさんチェックするのがいやなのであれば、こういった方法もありますよ。


でわでわ
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ