

マクロ初心者です。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- Excel(エクセル) エクセルのイベントVBAを複数のシートで動かしたい 1 2022/12/07 16:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのVBAについて教えてく...
-
エクセルVBAでオブジェクトが必...
-
エクセル2007 複数のワークシ...
-
マクロ実行後、画面がちかちか...
-
Access-VBAでExcelファイ...
-
エクセル2013
-
Excelに関数使用を調べる方法
-
エクセルで品番を入れると、そ...
-
エクセルを共有にすると、シー...
-
エクセルで離れた列を選択して...
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
EXCELのSheet番号って変更でき...
-
【Excel関数】UNIQUE関数で"0"...
-
VBA シートをコピーする際に Co...
-
特定の色のついたセルを削除
-
別ブックをダイアログボックス...
-
Excelのシート上のShapeにイベ...
-
エクセルVBAが途中で止まります
-
Cellsのかっこの中はどっちが行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAでオブジェクトが必...
-
エクセルのVBAについて教えてく...
-
複数シートを一括で保護を掛け...
-
Access-VBAでExcelファイ...
-
エクセルマクロ(超初心者)
-
マクロのコマンドボタン《Activ...
-
エクセルを共有にすると、シー...
-
コンボボックスへ降順に表示す...
-
エクセルで品番を入れると、そ...
-
VBAでVlookup機能を使うときに...
-
マクロ実行後、画面がちかちか...
-
Excell VBA にて配列に定数を代...
-
マクロのイベントトリガー
-
Excelに関数使用を調べる方法
-
別のブックを開く時にシートを...
-
エクセルのマクロ(大量データ...
-
EXCELに関する質問
-
Auto_Openマクロ
-
エクセルマクロ 変数をワーク...
-
「段」と「行」の違いがよくわ...
おすすめ情報