質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

6959閲覧

Excel VBA オプションボタンなどのコントロールを別シートに作成する

TakuyaHidaka

総合スコア137

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2016/12/12 05:59

編集2016/12/12 07:36

現在、Excel(Mac)でボタンを押すと
別シートにオプションボタンを生成するマクロを作成中です。

単純にセル値を別シートにコピーすることは
ネットでもありふれていましたが、コントロールに関しては
ほとんどないみたいです。

詳細は、以下の通りです。

・「マスタ」シートには、ある項目の選択肢をセルに記録しています。
(例:牛肉 100,200,300など)
・上記の100, 200, 300をオプションボタンとして別シートに生成します。
・繰り返し生成したいため、オプションボタンはグループボックスで囲みます。

これを実現するために
VBAのコードでどのように書けば良いかを教えていただけないでしょうか?

どうぞよろしくお願いいたします。

以下のようなコードを作成しましたが、
「実行時エラー '1004':

このオブジェクトの作成元アプリケーションを起動できません。メモリが不足している可能性があります。」

というエラーが出てしまいます…。

VBA

1Sub viewInputArea_Click() 2 3 Dim i As Long, j As Long 4 5 Dim workSheetInput As Worksheet 6 Dim workSheetMaster As Worksheet 7 Dim criteriaSheet As Object 8 9 Set workSheetInput = ActiveWorkbook.Worksheets("入力エリア") 10 Set workSheetMaster = ActiveWorkbook.Worksheets("マスタ") 11 12 Dim colsData As Long 13 Dim rowsData As Long 14 rowsData = workSheetMaster.Cells(Rows.Count, 2).End(xlUp).Row 15 16 Dim optBtn As OLEObject 17 Dim criteriaCell As Range 18 19 For i = 1 To rowsData - 1 20 workSheetInput.Cells(7 + (i - 1), 2).Value = workSheetMaster.Cells(6 + (i - 1), 2).Value 21 22 colsData = workSheetMaster.Cells(i, Columns.Count).End(xlToLeft).Column 23 For j = 1 To colsData 24 Set optBtn = workSheetInput.OLEObjects.Add( _ 25 ClassType:="Forms.OptionButton.1", _ 26 Link:=Flase, DisplayAsIcon:=False, _ 27 Left:=6.3, _ 28 Top:=2.1, _ 29 Width:=0.7, _ 30 Height:=0.35 _ 31 ) 32 optBtn.Object.Caption = workSheetMaster.Cells(6 + (i - 1), j).Value & 年 33 Next j 34 Next i 35End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問本文とコードから、以下のような状態のマスターシートを読み、入力エリアシートに出力したいものと推測します。
<マスタシート>
・B列が品目、C列以降に選択候補
・明細の先頭行は6行目

<入力エリアシート>
・B列に品目を出力
・選択候補のオプションボタンを作成
・出力先頭行は7行目

前提の認識が誤っていたらすみませんがご指摘ください。

できていること

・別シートへのオプションボタン作成
まず質問の本題となっている別シートへのオプションボタン作成ですが、これは実現できているのではないでしょうか?

同様の現象を再現できなかったため推測しかできませんが、エラー内容からして単純なオプションボタンの作成でエラーとなっているようには思えません。
何らかの原因で(たとえばオプションボタンを作成しすぎて)メモリが不足し、処理が続行できなくなったものと思います。

マスタデータの量を減らす等して正常に動作するのであれば、エラーは別の問題(端末環境、データ量の問題)だと思います。

できていないこと

提示いただいたコードにはいくつか修正が必要な個所がありそうです。

●行ループの回数
マスタデータの取得位置から察して6行目が明細先頭行ではないかと思います。
行ループを行う回数として、
rowsData = workSheetMaster.Cells(Rows.Count, 2).End(xlUp).Row
でマスタシートのB列最終データ行を取得し、
For i = 1 To rowsData - 1
でループ処理していますが、開始行が6行目であれば必要以上にループすることになると思います。

●列ループの回数
列ループの回数も行ループと同様に
colsData = workSheetMaster.Cells(i, Columns.Count).End(xlToLeft).Column
で各列の最終データ列から取得しようとしていますが、まず取得対象としている行が誤っていると思います。
そしてループ処理を
For j = 1 To colsData
とすることで、A列から最終列まで全てを選択候補としてオプションボタンを作成してしまっていると思います。
選択候補がC列から開始であれば、ループの開始も3からになると思います。

●オプションボタンのキャプション名
オプションボタンのキャプション名の最後に& 年が記述されています。
年という変数を別途定義してあれば別ですが、"年"という文字列を出力したいのであれば& "年"としましょう。

●オプションボタンの出力位置
オプションボタンを常に同じ位置に出力している為、正しく出力されているように見えないと思います。
1つずつLeftとTopの出力位置を調整しましょう。

●オプションボタンのグルーピング
作成したオプションボタンは、おそらく行単位でグルーピングしたいのではないでしょうか?
提示いただいたコードの処理で作成されたオプションボタンは、全て同じグループに属してしまうため、作成したオプションボタンの中で1つしかチェックをつけることができなくなってしまいます。
行単位でグループ名を分けて作成しましょう。

サンプル

Sub viewInputArea_Click() Dim i As Long, j As Long 'ループカウンタ Dim workSheetInput As Worksheet '作成シート Dim workSheetMaster As Worksheet 'マスタシート Dim criteriaSheet As Object Set workSheetInput = ActiveWorkbook.Worksheets("入力エリア") Set workSheetMaster = ActiveWorkbook.Worksheets("マスタ") Dim colsData As Long '列ループ回数 Dim rowsData As Long '行ループ回数 '最終行番号の取得 rowsData = workSheetMaster.Cells(Rows.Count, 2).End(xlUp).Row Dim optBtn As OLEObject Dim criteriaCell As Range '行ループ 'For i = 1 To rowsData - 1 For i = 1 To rowsData - 5 '品目の出力 workSheetInput.Cells(7 + (i - 1), 2).Value = workSheetMaster.Cells(6 + (i - 1), 2).Value '最終列番号の取得 'colsData = workSheetMaster.Cells(i, Columns.Count).End(xlToLeft).Column colsData = workSheetMaster.Cells(6 + (i - 1), Columns.Count).End(xlToLeft).Column '列ループ 'For j = 1 To colsData For j = 3 To colsData 'Set optBtn = workSheetInput.OLEObjects.Add( _ ' ClassType:="Forms.OptionButton.1", _ ' Link:=Flase, DisplayAsIcon:=False, _ ' Left:=6.3, _ ' Top:=2.1, _ ' Width:=0.7, _ ' Height:=0.35 _ ' ) 'オプションボタンの配置(横位置はセルに合わせています) Set optBtn = workSheetInput.OLEObjects.Add( _ ClassType:="Forms.OptionButton.1", _ Link:=Flase, DisplayAsIcon:=False, _ Left:=workSheetInput.Cells(7 + (i - 1), j).Left, _ Top:=workSheetInput.Cells(7 + (i - 1), j).Top, _ Width:=0.7, _ Height:=0.35 _ ) 'オプションボタン項目名 optBtn.Object.Caption = workSheetMaster.Cells(6 + (i - 1), j).Value & "年" 'グループ設定 optBtn.Object.GroupName = "Group" & CStr(i) Next j Next i End Sub

推測を多分に含んだ回答ですので、見当違いでしたら申し訳ありません。
参考になれば幸いです。

投稿2016/12/16 08:27

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakuyaHidaka

2016/12/19 08:16

大変ありがとうございました。 非常に参考になり、こちらの作業も進みそうです。 フォローさせていただきましたのでよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問