早速ですが、エクセルでユーザーフォーム上にある
リストボックスの複数選択した時の値の取得方法を教えてください。

具体的にはアンケート集計をするためのフォームで
"Q6"というワークシートのA列に「項目名」、B列に「数」を
1行目から設定しています(「数」の初期値は"0"です)。

ユーザーフォームのリストボックスにはA列を表示させています。
そのユーザーフォーム上にあるコマンドボックスに
下記のようにコード記述しても、一番上の選択されたものしか"Q6"に
反映されません(2,3,4行目を選択しても2行目の「数」のみ+1になる)。

Private Sub CommandButton1_Click()
 For n = 0 To ListBox1.ListCount - 1
  If ListBox1.Selected(n) = True Then
   Worksheets("Q6").Cells(n + 1, 2) = _
   Worksheets("Q6").Cells(n + 1, 2) + 1
  End If
 Next n
End Sub

エクセルは97で、リストボックスのMultiSelectはMultiでもExtendedでもダメでした。

どなたかご存知の方がいらっしゃいましたらよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

Excel97 で質問のコードを動かしましたが特に問題ないようですが・・・



ListBox1のプロパティMultiSelect を
 fmMultiSelectMulti
 fmMultiSelectExtended
にして、両方とも問題なく動きますよ。プロパティの設定方法が何か違う?

変数の宣言を強制されていないようなので、
 Option Explicit
を先頭に書いてみたらどうでしょうか。nの宣言は必要になりますが、どこか別の場所で無効なプロパティの設定などがされているかもしれません。

ご参考に。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
試しにExcel2002でも動かしてみましたがダメでした。
そこでもう一度見直してみたところ、RowSourceにA列とB列を指定していました。
1~2ヶ月試行錯誤していたのでColumnCountを"1"にしただけで、
RowSourceの設定を忘れていたようです。

>どこか別の場所で無効なプロパティの設定などがされているかもしれません。
と言われて見直してみたので、nishi6さんのおかげでRowSourceの間違いに気がつきました。
まだ確認していませんが、たぶんこれでExcel97でもちゃんと動くと思います。
ありがとうございました。

お礼日時:2002/03/25 19:14

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPrivate Sub Worksheet_Calculate()のことでお聞きします

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の温度変化で
Application.Speech.Speak "温度接近", True
などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか
その場合、Private Sub Worksheet_Change(ByVal Target As Range)内の
Target.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?
それとも、もしかしたら標準モジュールに書くのでしょうか?

うまく説明できていませんが、どなたか教えてください

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の...続きを読む

Aベストアンサー

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用のマクロを持っているはずです。

>特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
>変化した時の処理はどこに書いたらいいのでしょうか?

ふつうは、どこでもよいので、
=Now()
という式を書いて、
Private Sub Worksheet_Calculate()
に、イベントを拾わせるわけです。
しかし、少し、工夫が必要で、時々、これが困った動きをします。

Calculate のイベントが、ワークブック全体に働いてしまい、どこのシートを使っても、Calculateイベントが動いてしまいます。この方針で話が本格的になった時に、この対処法は、あらためて紹介します。

>(Worksheet_Change)のTarget.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?

単に、モジュール変数を使って橋渡しするのか、それとも、同時で働くということなら、 Worksheet_Calculateのイベントでなくてもよいはずです。どのように使うのか、こちらではわかりかねます。本来、別の働きをするものです。もちろん、キーで入力した際は、Worksheet_Calculateのイベントは、起動します。

>Application.Speech.Speak "温度接近", True
>などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか

ActiveX コントロールで入ってきた値が、どのように加わっていくのかにもよりますが、セルの位置は、Worksheet_Changeイベントのようにセルの位置は感知しませんから、インプットの場所が動いていくのでしたら、マクロで最後尾を探さなくてはなりません。

>それとも、もしかしたら標準モジュールに書くのでしょうか?
同様のコマンドで、標準モジュールに書く方法もあります。とても古い方法で、オブジェクト・ウィンドウにも出てこないはずです。しかし、まだ、同様の働きはしますが、今は、シートモジュールが主流になっています。

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用の...続きを読む

Q【EXCEL】条件付き書式、A列、C列、D列、E列が同じ値の時にB列の背景色を変えたい

お世話になります。

エクセルの条件付き書式の数式の使い方について教えて下さい。
A列、C列、D列、E列の値が同じ時にB列のセルの背景を青に
塗りつぶしたいと思っています。

なので、「数式を使用して、書式設定するセルを決定」、
「次の数式を満たす場合に値を書式設定」で、数式を
「=A1=C1=D1=E1」と入力し、書式、塗りつぶし、青、
を選択して、条件付き書式を設定しました。
すると、、、画像のような結果になります。

私の感覚だと画像でセルの値が「11」~「15」の時だけ
B列が青になると思うのですが実際の結果は画像の通りです。

先の話の通りA列、C列、D列、E列の値が同じ時だけ
B列のセルの背景を青にしたい場合はどうい数式になるのでしょうか?

すいませんが、詳しい方、数式(関数?)で説明できる方よろしくお願い致します。

追記
可能でしたらA列、C列、D列、E列が空白の時はB列の背景色をなしにしたいと思っております。
→A列、C列、D列、E列に値があって、かつ同じ値の場合のみB列の背景を青にしたいです。

お世話になります。

エクセルの条件付き書式の数式の使い方について教えて下さい。
A列、C列、D列、E列の値が同じ時にB列のセルの背景を青に
塗りつぶしたいと思っています。

なので、「数式を使用して、書式設定するセルを決定」、
「次の数式を満たす場合に値を書式設定」で、数式を
「=A1=C1=D1=E1」と入力し、書式、塗りつぶし、青、
を選択して、条件付き書式を設定しました。
すると、、、画像のような結果になります。

私の感覚だと画像でセルの値が「11」~「15」の時だけ
B列が青にな...続きを読む

Aベストアンサー

AND関数を使えば判定ができるのでは?
 =AND(A2<>"",A2=C2,C2=D2,D2=E2)

A列には常に判定する数値が入っているなら「A2<>""」は不要です。

参考サイト
http://www.relief.jp/itnote/archives/003940.php

QエクセルVBAで列名が#N/Aとなった列を削除するプログラムはどのように組めばよいのでしょうか?

エクセルVBAで列名が#N/Aとなった列を削除するプログラムはどのように組めばよいのでしょうか?
下記のような表です。
   A      B      C      D・・・・・
1 イチゴ   #N/A    リンゴ   #N/A
2  100     1      75      1
3  250     2      50      4
4  150     2      25      5

       ↓
   A      B  ・・・・・
1 イチゴ   リンゴ 
2  100     75
3  250     50
4  150     25

よろしくお願いいたします。

Aベストアンサー

こんばんは。

一例です。

Sub test()
  Dim i As Long, myLastCol As Long
  
  myLastCol = Cells(1, Columns.Count).End(xlToLeft).Column

  Application.ScreenUpdating = False
  For i = myLastCol To 1 Step -1
    If IsError(Cells(1, i).Value) Then
      If Cells(1, i).Value = CVErr(xlErrNA) Then
        Columns(i).Delete
      End If
    End If
  Next i
  Application.ScreenUpdating = True
End Sub

Qエクセルで、A列に日付をB列に曜日、C列からF列までにデータを入れるよ

エクセルで、A列に日付をB列に曜日、C列からF列までにデータを入れるように作成しています。
条件付書式で土日祭日の場合はC列からF列に色を表示させています。
この色付セル(土日祭日)の場合にはデータ入力が無いので自動で0を表示させ、なおかつデータ入力が出来ないようにしたいのですが、そのようなことは出来るでしょうか。エクセルは2003を使ってます。

Aベストアンサー

C2セルに以下の数式を入力します。

=IF(AND($A2<>"",WEEKDAY($A2,2)>5),0,"")

同様にC2セルに以下の入力規則を設定します。

「データ」「入力規則」で「ユーザー設定」にして数式欄に以下の式を入力します。

=WEEKDAY($A2,2)<6

最後にC2セルを右方向および下方向にオートフィルします。

QVBA のフォームでTxtボックスとコンボボックス

エクセル2013で、やっとのことでマクロのフォーム(txt入力のみを5項目)を完成させることができました。
次に、そのうちの一つは曜日の入力なのでこれをコンボボックスにして、一覧を出してマウスで選択するように変更したいのですがどうもうまくいきません。マクロは初めてなので基本的な考え方ができていないのです。
 
そこで質問なのですが、参考書には 

Private Sub UserForm_Initialize

End Sub

にマクロを記入するとなっていますが、これをもとの曜日入力ボックスと置き換えることはできないのでしょうか。それとも、終了ボタンのマクロと同じように、別のプロシージャにしないといけないのでしょうか。

それから、これはあまり重要ではないかもしれませんが、私がコンボボックスを作成するとマクロに
Combbox_Changed
のようなプロパティ(?)が表示されて、ヘルプを見てもよくわかりません。これはどういうことなのでしょうか。

よろしくお願いします。

Aベストアンサー

目についたので回答してみます。
私もそんなに詳しくないので間違っていたらすみません。

基本的な概念がわかればご自身でも勉強できそうなので
VBAの初歩の考え方を少しご説明します。

-------------------------------
Private Sub UserForm_Initialize

End Sub
-------------------------------

まずVBA(及びVB)の基本的なコードの見方として以下の様な見方をします。
オブジェクト名:好きに付ける事ができます。
イベント名:VBの中で決まっており、オブジェクトによって可能な動作に違いがあったと思います。
------------------------------------
Private Sub オブジェクト名_イベント名
ここには処理を書くよ!
End Sub
------------------------------------

上記の「イベント名」と表現したのは、VBAのプログラムが
イベント駆動型プログラミングだからです。
どういった物がイベントになるかというと、「クリック」や「選択」(チェクボックスのチェックなど)が
それに当たります。

そしてオブジェクト名というのはVBAの世界でフォーム、ボタン、ラベル、コンボボックスなど
すべて「オブジェクト」と呼ばれる物になります。

これらの内容を合わせて先ほどのコードを見ると以下の様な感じになります。
--------------------------------------
※オブジェクト:UserForm・・・フォームを作成した時の元から設定されているフォーム名
※イベント名:Initialize・・・イニシャライズなので初期化とかの意味

Private Sub フォームの_初期化時

'フォームが表示された時に動かす処理

End Sub
---------------------------------------

これは後に書いている質問の回答になります。
バージョンによって少し違うのかもしれませんが・・・

イベントとの中で、コンボボックスはChangedイベントというイベントが存在します。
何かというと、ComboBoxで何かが選ばれたら処理をするというイベントです。

以下が日本語で表した場合の例になります。
-------------------------------------------------
Private Sub ComboBox1_Change()
   'ComboBox1のリストの中から何か選ばれた場合の処理
   処理1:ComboBox1の値が土曜か日曜の場合は画面に「今日は休日です」を表示
   処理2:ComboBox1の値が月曜日~木曜日の場合は「今日は平日です」を表示
End Sub
-------------------------------------------------


######### ↓ここからが今回の本題↓ ###############

なぜCombBoxの値の設定に、フォームの初期化の処理がでてくるのか・・・
それは、フォームの初期化時にCombBoxのリストの内容を追加しているからです。

※ComboBox1の部分は作成しているCombBox名によって変わります。
  (Excel2007の一つ目に作成したComboBoxはComboBox1)
------------------------------------
Private Sub UserForm_Initialize
'ここには処理を書くよ!
  ComboBox1.AddItem "月"
  ComboBox1.AddItem "火"
  ComboBox1.AddItem "水"
  ComboBox1.AddItem "木"
  ComboBox1.AddItem "金"
  ComboBox1.AddItem "土"
  ComboBox1.AddItem "日"
End Sub
------------------------------------

なかなか説明は難しいものですね。
参考になれば幸いです。

目についたので回答してみます。
私もそんなに詳しくないので間違っていたらすみません。

基本的な概念がわかればご自身でも勉強できそうなので
VBAの初歩の考え方を少しご説明します。

-------------------------------
Private Sub UserForm_Initialize

End Sub
-------------------------------

まずVBA(及びVB)の基本的なコードの見方として以下の様な見方をします。
オブジェクト名:好きに付ける事ができます。
イベント名:VBの中で決まっており、オブジェクトによって可能な動作に違いがあったと思い...続きを読む


人気Q&Aランキング

おすすめ情報