エクセルVBAのユーザーフォームでアンケートシートを作っています。
オプションボタン3つとコンボボックス1つで、和暦西暦とそれに対応する年数を表示したいと思っています。
オプションボタン3つのオブジェクト名はそれぞれ、
showa
heisei
seireki
となっており、コンボボックスは
bd_year
としています。
下記のように作ってみたのですが、うまくいきません。
どなたか、教えていただけませんか。
よろしくお願いします。
Private Sub bd_year_DropButtonClick()
Dim A1 As String, B1 As String, C1 As String
Dim i As Integer
A1 = v
For v = 1 To 64
Next v
B1 = w
For w = 1 To 30
Next w
C1 = x
For x = 1925 To 2020
Next x
If showa.Value = True Then
Me.bd_year.List = A1
End If
If heisei.Value = True Then
Me.bd_year.List = B1
End If
If seireki.Value = True Then
Me.bd_year.List = C1
End If
End Sub
No.1ベストアンサー
- 回答日時:
こんにちは。
ご提示のように、bd_year_DropButtonClick イベントを使う
方法でも、出来なくはないのですが、珍しいやり方ですし、扱いが難しくなります。
普通は、オプションボタンのイベントから、コンボボックスのリストを変更します。
コンボボックスの_DropButtonClick イベントの難点は、
ドロップボタンを押した時だけではなくて、
表示中のリストから選択した時にも発生することや、
表示中のリストから再度選択し直したい時にも
ドロップボタンを押すことで余計なイベントが発生し、
不必要にリストの再設定をすることになるからです。
どちらかというと、無駄な処理をする回数の方が、
必要な処理をする回数よりも多くなってしまいます。
無駄な処理を回避することも可能ですが、
不自然な位、冗長な記述になります。
一番のデメリットは、メンテナンスに困った時に、
助けてくれる人が殆どいないであろう程に風変わりだということです。
私としても_DropButtonClick イベントを奨める訳にはいかないので、
オプションボタンの_Change イベントを
代替え案として提示します。
_Click イベントではなく、_Change イベントを奨める理由も、
同様に、無駄な処理を省いて煩雑さを軽減する意図です。
以下の記述を活かす場合は
現在お使いの Private Sub bd_year_DropButtonClick()
を、同時並行に使用することは出来ませんので、
コメントブロックするか、削除するか、してから、
試すようにしてください。
修正を加える必要があるとすれば、"年"を指す数値の部分だけです。
Private Sub heisei_Change()
Dim i As Long
If heisei.Value = False Then Exit Sub
With Me.bd_year
.Clear
For i = 1 To 30
.AddItem i
Next i
End With
End Sub
Private Sub seireki_Change()
Dim i As Long
If seireki.Value = False Then Exit Sub
With Me.bd_year
.Clear
For i = 1925 To 2020
.AddItem i
Next i
End With
End Sub
Private Sub showa_Change()
Dim i As Long
If showa.Value = False Then Exit Sub
With Me.bd_year
.Clear
For i = 1 To 64
.AddItem i
Next i
End With
End Sub
cj_moverさん
ご回答ありがとうございました。
DropButtonClickの方法は、スタンダードなやり方ではなかったのですね。
勉強になります。
教えていただいた方法で問題なくできました!
ありがとうございました。
No.2
- 回答日時:
こんばんは。
なるべく、分かりやすく、そして元のコードの雰囲気を残したつもりです。
元のコードは、もう少しテクニックが足りなかったところだったように思います。
'//
Private Sub bd_year_DropButtonClick()
Dim op As OLEObject
Dim gName As String '元号
Dim Ar() As Variant '配列用変数
Dim i As Long, j As Long, k As Long, v As Long
ReDim cmbYear(2, 2)
cmbYear(0, 0) = "showa": cmbYear(0, 1) = 1: cmbYear(0, 2) = 64
cmbYear(1, 0) = "heisei": cmbYear(1, 1) = 1: cmbYear(1, 2) = 30
cmbYear(2, 0) = "seireki": cmbYear(2, 1) = 1925: cmbYear(2, 2) = 2020
For Each op In Me.OLEObjects
If TypeName(op.Object) = "OptionButton" Then
If op.Object.Value = True Then
gName = op.Name
Exit For
End If
End If
Next
i = Switch(gName = "showa", 0, gName = "heisei", 1, gName = "seireki", 2)
j = cmbYear(i, 2) - cmbYear(i, 1)
ReDim Ar(0 To j)
k = 0
For v = cmbYear(i, 1) To cmbYear(i, 2)
Ar(k) = v '配列を使う
k = k + 1
Next v
Me.bd_year.List = Ar() 'そのまま配列を入れる
End Sub
WindFallerさん
ご回答ありがとうございました。
WindFallerさんの方法でもうまく動きました。
For Each op In Me.OLEObjects から始まる文は使ったことがありませんでした。
勉強になりました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Visual Basic(VBA) ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし 4 2022/08/03 17:34
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) 今日の日付が過ぎたらその行を削除したい 1 2023/04/01 20:06
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
VBA コンボボックスで選んだ値を取得するには
その他(Microsoft Office)
-
オプションボタンとリストボックスの連動
Visual Basic(VBA)
-
VBAでシートからコンボボックスにデータを設定する方法
Visual Basic(VBA)
-
-
4
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
5
ExcelのComboboxでマウスのスクロールを有効にしたい
Excel(エクセル)
-
6
EXCEL VBA コンボボックス、テキストボックスが未入力のときメッセージを表示する方法
Excel(エクセル)
-
7
VBA コンボボックスとテキストボックスを連結させたい
Visual Basic(VBA)
-
8
【Excel VBA】コンボボックスで選択した値の取得
Excel(エクセル)
-
9
コンボボックスの文字によるif文の作成
Visual Basic(VBA)
-
10
コンボボックス ▼ボタンをクリックしたらイベント
PowerPoint(パワーポイント)
-
11
エクセルVBAでフォームのListboxをスクロールするには?
その他(Microsoft Office)
-
12
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
13
UserForm1.Showでエラーになります。
工学
-
14
ユーザーフォームに最小化・最大化ボタンを付ける
Access(アクセス)
-
15
エクセルVBAでUserFormを起動した時
Excel(エクセル)
-
16
ユーザーフォーム スクロールバー 非表示にしたい
Excel(エクセル)
-
17
VBA コンボボックスで選んだものを各テキストボックスに反映
Visual Basic(VBA)
-
18
オプションボタンを別シートに連動
Excel(エクセル)
-
19
入力した値をコンボボックスにすぐに反映させる方法
Excel(エクセル)
-
20
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
ユーザーフォームに別シートか...
-
フォームの再読み込み
-
セルをマクロのボタンにしたい。
-
VBAのボタンの位置が変わって困...
-
VBA CommandButtonの文字ずれ
-
回数のカウント
-
CommandButtonのCaptionを変化...
-
コマンドボタンやイメージにマ...
-
ボタンにセットフォーカスする...
-
バックスペース機能の作り方
-
閉じると「+」になり開くと「-...
-
VBAでオプションボタンによって...
-
VBA IE ダウンロード ダイアロ...
-
C♯初心者で、四則演算の電卓を...
-
エクセル 検索マクロ オート...
-
Vba 電卓 一文字消すボタン
-
Access VBA でデータペーストを...
-
コントロールの背景色を
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
ユーザーフォームに別シートか...
-
VBA CommandButtonの文字ずれ
-
フォームの再読み込み
-
セルをマクロのボタンにしたい。
-
Excel VBA Application.caller...
-
コマンドボタンやイメージにマ...
-
プロシージャからイベントをコ...
-
Access VBA でデータペーストを...
-
VBAのボタンの位置が変わって困...
-
閉じると「+」になり開くと「-...
-
[Excel VBA]コマンドボタンの入...
-
ASP.Net ラベルの内容をすぐに...
-
Excel マクロ 閉じるボタン
-
ボタン
-
CommandButtonのCaptionを変化...
-
VB.NETでマウスクリックイベン...
-
ボタンの枠線の様なものを消したい
-
C#で動的に作ったtextboxを消す。
おすすめ情報