マクロ初心者です。
2つ質問です。
①標準モジュールや各シート、thisworkbookにプログラムできますが、利用可能なプログラムの範囲?はどうなっているのでしょうか?また、どうやって使い分けしているのでしょうか?
説明を受けた際に各シートのプログラムはそのシートでしか利用しないもの、標準モジュールはいろんなシートで利用するものとききました。thisworkbookは?と思いました。また、記載場所を分けるだけで、sheet1のプログラムはsheet2で呼び出すことができるのでしょうか?
②コンボボックスの値を設定できずに困っています。
以下のプログラムです。
=================
private sub comb_change()
call change()
end sub
=================
sub change()
処理
thisworkbook.sheets(1).OLEObject("COMB").object.value=○○
end sub
=================
change()に引数としてbyvalでCOMBオブジェクトを渡しても、値を設定できませんでした。
ただ、private sub comb_change()内では、値を設定できるようです。
設定できるできないの違いはどこから来るのでしょうか?
No.2ベストアンサー
- 回答日時:
#1の回答の続きですが、ご質問の内容からこんな感じでしょうか。
添付の画像を御覧ください。
この場合は、直接、ComboBox で処理しないで、一旦、サブプロシージャを用意して、その時に排出するListIndex を利用します。特に、あまり13という数が必要ではなく、「東京都」を選んだ時点で、13という数字は確保しています。(ただし、今回は、あえて13を出すようにしています。)
それを、今度は、本来は、47個分の地域名のリストが入っているのですが、今は、北海道と神奈川だけですが、こんなリストを作ります。カンマの間にセルの範囲のアドレスを入れます。
Const AREALIST = ",c2:c189,,,,,,,,,,,e2:e62,g2:g59"
それを配列にしてあげて、ListIndex の数字で呼び出して、
e2:e62 が出てきたら、ComboBox2 のListFillRangeに入れます。
この配列にきちんと合わせなくてはなりませんが、面倒なら、VLookUp関数などを使うと良いです。
'//
Private Sub ComboBox1_Change()
Dim L_indx As Long
L_indx = ComboBox1.ListIndex + 1
If ComboBox1.ListCount >= L_indx And L_indx > -1 Then
Call AreaChange(L_indx)
End If
End Sub
Sub AreaChange(indx As Long)
Dim myLists
Const AREALIST = ",c2:c189,,,,,,,,,,,,e2:e62,g2:g59"
myLists = Split(AREALIST, ",")
ComboBox2.ListFillRange = "Master!" & myLists(indx)
ComboBox2.ListIndex = 1 '変更になったことを示すため
End Sub
'//
この場合は、#1と話が違うと思われるかもしれませんが、ComboBox1ひとつだけのためなら、そのComboBox1 の直下に置くことも多いですが、これが、他のシートにも関係してくるとなると、標準モジュールに置かざるを得ません。
サブプロシージャは、他のシートからも呼び出せないわけではありませんが、面倒な上に煩雑になります。煩雑ということは、同じものを数多く作ってしまうことです。後になって、異様にシートが重くなってから気がついた時には、手がつけられなくなっています。
ということで、私の方では、最近は、フォーム・コントロールを多く用いるようになりました。シートをコピーしても問題ないということもあります。その上、マクロは一つでたります。
No.1
- 回答日時:
こんばんは。
>change()に引数としてbyvalでCOMBオブジェクトを渡しても、値を設定できませんでした。
マクロの初心者とおっしゃっているわりには、ずいぶん難しいことをされておられるようです。
私は、あまり特殊なことは考えたことがありません。だから、あまり難しいことをお聞きになっても、分からないことだらけになるような気がしますが、分かる範囲を説明させていただきます。
シートやThisWorkbook モジュールのことをオブジェクト・モジュールと言いますが、ThisWorkbookモジュールは、家でいうと玄関口のようなものだという解釈をしています。
だから、開いた時に、真っ先にThisWorkbookモジュールが反応し、次に、標準モジュールが感知します。方法によっては、標準モジュールが感知しないというか、ないと同じことになってしまう現象さえあります。
他の特にWordやOutlookなどは、標準モジュールというのは、それほど多く使いません。
ThisWorkbook の使い方は、そのブック全体のイベントに関わるものや、IEオブジェクトイベントなどが組み込まれます。ThisWorkbookモジュールで、Sheet1などシート・イベントに関しては、共通の設定をさせることが可能です。
例えば以下のような場合、Sh は、それぞれのシートを意味しています。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
End Su
確か、シートの上に載っているActiveX は、シートと共に移動したりするので、孤立していなければならないわけで、つなげてしまうと、エラーの発生の恐れが出たような気がします。
>sheet1のプログラムはsheet2で呼び出すことができるのでしょうか?
できますが、そのようなイレギュラーなふつうはしないと思います。
なぜ、標準モジュールを使わないのか、よくわからないです。
また、ComboBoxの内容を、Changeイベントで書き換えるということも考えたことがありません。
例:
'Sheet1
Private Sub ComboBox1_Change()
Call Sheet2.myChange
End Sub
'シートがアクティベートされると、コンボボックスに値が入る
Private Sub Worksheet_Activate()
Dim ar
ar = Split("赤,白,抹茶,あずき,コーヒ,ゆず,桜", ",")
ComboBox1.List = ar
End Sub
'Sheet2
Sub myChange()
'処理
Sheet1.ComboBox1.List(3) = "あがり"
End Sub
>thisworkbook.sheets(1).OLEObject("COMB").object.value=○○
綴りが間違っていますね。OLEObjects と複数型になります。
オブジェクトモジュールには、親(Parent)がついていますから、一般的には、ThisWorkbook は入りません。
Sheet1.OLEObjects("COMB").Object.Value=○○
これに何の意味があるのかは分かりませんが、ComboBox に現れているValue値が変わるだけだと思います。
回答ありがとうございます。
>Sheet1.OLEObjects("COMB").Object.Value=○○
>これに何の意味があるのかは分かりませんが、ComboBox に現れているValue値が変わるだけだと思います。
マスタデータのシートを持っています。
マスタデータは処理に便利なように、A列に数字、B列に値と別れて保持しています。
A列:都道府県番号とB列:都道府県名です。
コンボボックスの値はファイルを開いたときにコンボボックスのfillrangeにA1:B47と入れるようにしています。
このときの表示内容は13 東京といった感じです。
コンボボックスの値が変わったときに、
Changeイベントでコンボボックス共通のエラーチェックを行い
(例えば、関東地方を選択しているのに、大阪になっている等)
コンボボックスには 13 東京と表示させたいです。
ただ、エラーチェックでは13の方しか利用してないからか、意図的に値を入れないと13のみしか表示されません。
そのため、Changeイベントで表示内容を変えたいと思っています。
すべて標準モジュールに記載しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロのコマンドボタン《Activ...
-
VBAでVlookup機能を使うときに...
-
マクロ実行後、画面がちかちか...
-
VBAマクロ実行時エラーの修正に...
-
VBA シートをコピーする際に Co...
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
マクロの「SaveAs」でエラーが...
-
「段」と「行」の違いがよくわ...
-
エクセルで特定の文字列が入っ...
-
エクセルで離れた列を選択して...
-
特定の文字がある行以外を削除...
-
別ブックをダイアログボックス...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
LEFT関数とIF関数の組み合わせ...
-
エクセルVBAが途中で止まります
-
列方向、行方向の定義
-
【Excel VBA】 B列に特定の文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数シートを一括で保護を掛け...
-
エクセルVBAでオブジェクトが必...
-
Access-VBAでExcelファイ...
-
コンボボックスへ降順に表示す...
-
エクセルを共有にすると、シー...
-
エクセルのVBAについて教えてく...
-
マクロ実行後、画面がちかちか...
-
マクロのコマンドボタン《Activ...
-
VBAでVlookup機能を使うときに...
-
エクセルのマクロ(大量データ...
-
エクセルVBAでフォームの無効化...
-
エクセルで品番を入れると、そ...
-
excelのvbaでのシート指定が時...
-
別のブックを開く時にシートを...
-
Excell VBA にて配列に定数を代...
-
エクセルVBA 別シートの最終セ...
-
ExcelVBA その回のみ...
-
他ブックへの書き込みについて
-
エクセルの全てのシート名を一...
-
マクロのイベントトリガー
おすすめ情報