• ベストアンサー

VBAのユーザーフォームの使い方

皆様、こんにちは。 VBAのユーザーフォームを習い始めた初心者です。本の説明を読んでもユーザーフォームの使い方がよく分かりません。例えば、あるセールをクリックしたら、フォームが表示される、そしてフォームの中にあるコンボボックスのリストの中から選ばれた値が最初に選択したセールに入力されるという使い方がありえますか?申し可能でしたら、コード作成の例をいただけないでしょうか? どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 ユーザーフォームは、正直なところ、難しいですね。テキストにちゃんとしたものがないからなのでしょうか?何か、Excelのユーザーフォームの使い勝手が良くないかもしれません。 >セールをクリックしたら、フォームが表示される、 セールではなくて、セル(Cell --小部屋・細胞なんていういう意味があります) ただ、ご質問自体は、ユーザーフォームではなくて、入力規則のリストのほうが良いかもしれません。 以下は、「シートモジュール」に書くのですが、クリックするという「イベント」に確実性がないので、「ダブルクリック」に変えました。 '---------------------------------- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 1 Then Exit Sub '一列目で起動   Cancel = True   UserForm1.Show 0 'モーダルモード Off End Sub 'シートから立ち上げる場合は、モーダルモードはオフのほうがよいです。 'すでに、ComboBox のリストには入っているものとします。 '---------------------------------- 'UserForm モジュール Private Sub ComboBox1_Click()  ActiveCell.Value = ComboBox1.Value End Sub '----------------------------------

lyu05665
質問者

補足

Wendy02様、おはようございます! いつもお世話になっています。 答えてくださってどうもありがとうございました。 ただ、私のような初心者には難しすぎてよく分かりません^^; Private Subは単独で実行できないから、教えてくださった2つのPrivate SubをMain Subにまとめる必要があると分かっていますが、書き方が分かりません。 Worksheet_BeforeDoubleClickをシートモジュールに書いて、ComboBox1_ClickをUserForm モジュールに書いて、Main SubをModule1に書いたせいか、「SubまたはFunctionが定義されていません」というエラーが出てきます。 Call Worksheet_BeforeDoubleClickのように書いていますが。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 >なぜかEnd Ifがなければ動きますが、あるとエラーが出てしまいます。 End If がないのは、If 条件式が、左から右に、一行で完結し、一行で抜けてしまうから書かなくてよいのです。 If Target.Column <> 17 Then Exit Sub こういうスタイルは、どちらかというと、イベント・(ドリブン型)・マクロに登場する書き方だと思ってよいと思います。(初期の頃は、なぜこんな書き方をするのか、疑問に思ったのですが、そのうち、なれてしまいました) こういうイベントは、いくつかの特殊なパターンが出てきます。 はじめの二行は、同じ意味です。 If Intersect(Target, Range("Q1:Q20")) Is Nothing Then Exit Sub If Target.Column <> 17 Or Target.Row > 20 Then Exit Sub セルひとつに対して If Target.Address <> "$Q$1" Then Exit Sub 大事なことは、Excel VBAは、誰に教わらなくても、Excel VBAは、それ自身が教えてくれます。どちらかというと、Excel VBAのみと考えたほうがよいです。同じ仕組みのはずなのに、VB6 でも、自己学習で覚えにくいのです。 デバッグのコツさえ覚えれば、格段に上達します。デバッグというのは、簡単にいうと、 ・VBEditor の左側の縁をクリックして、「ブレークポイント」を付けてあげる。  (イベントは、F8 のステップモードをいきなりすることができませんので、「ブレークポイント」を設けます) ・F8 を押して、ステップモードにして試してみる。 ・ローカルウィンドウを出して、そのオブジェクトのプロパティの内容の確保されている値を確認する。 ・値を確認する方法は、Debug.Print や MsgBox 変数 という方法もある。 ・調べたいプロパティやオブジェクト、コマンドのところで、F1 を押すことで、ヘルプの説明を読む。 ・一行マクロや部分を抜き出して試してみる。 ・最後に、あまり、「どうして」と理屈で考えない。(どうも分からないところが、いつもでもあります。) なお、私を含めてなのですが、掲示板のVBAのコードはなくて七癖で、私個人も自覚はしていても、その人に合わせてという書き方をしていないことが多いのです。教えるためのコードではなく、使うためのコードとして安定してきてしまっています。それが必ずしも正解とは言えません。何が正しいか、何が間違いか、ということは掲示板では得られないことも多いと思ってください。(そういうことが、自己矛盾かもしれませんが) なるべく定評のあるテキストを参考にしたほうがよいです。 例:技術評論社『かんたんプログラミング Excel VBA』 http://www.amazon.co.jp/exec/obidos/ASIN/4774119660 テキストで、覚えたことを確認して、できればメモを残しておくと、後々参考になります。

lyu05665
質問者

お礼

Wendy02様、どうもありがとうございました。Wendy02様のご説明はいつも大変勉強になります。 教えてくださった技術評論社『かんたんプログラミング Excel VBA』を2週間?くらい前に購入して、少しずつ勉強しています。ただ、同時に仕事でコードを書こうとしているので、分からないことが多すぎます。分からなくなった時はまず、本で調べたりインターネットで探したりしていますが、それでも答えが見つからなければ、誰か詳しい方に聞くしかないと思いました。聞きすぎて申し訳ありません m_ _m また、VBAのヘルプなんですが、本の中でもヘルプを読めと書いてありますが、今の段階ではいくら読んでも意味が全く分かりません。 少しずつ慣れていこうと思います。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 UserForm を作りながら、「イベント」自体の仕組みを覚えるとよいです。 あまり詳しいことは、後回しでもよいです。 例えば、ByVal とか、Target とか、規定の用語ですが、実際に理解するのは、ずっと先のことです。それまでは、決まりきった用語として使ってください。 「イベント・(ドリブン型)・マクロ」というのは、 例 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) とあれば、「Worksheet」に対して、「DoubleClick」したときに、そのマクロが始まるというものです。「Before」というのは、「Cancel As Boolean」と、キャンセルが効きます、ということです。なぜ、それを選んだ、その理由は後で書きます。 シート1 で起動するなら、シート1 のモジュールに置くだけで良いわけです。 次に、今回のマクロなら、A列のセルのひとつをダブルクリックすると、UserForm1 が立ち上がるという仕掛けになっています。ダブルクリックしたり、セルに入力したりして発生する信号のことを、「イベント」といいます。その信号を拾って、マクロをドリブン(起動)させるから、イベント・(ドリブン型)・マクロと呼びます。(注:私個人の解釈です) Excelには、厳密にワンクリックで起動するイベントがありません。Worksheet_SelectionChange は、カーソルを動いたということで起動しますから、微妙にタイミングが違うのと、大事なことは、セルをワンクリックすると、入力待ち状態になってしまうからです。DoubleClick イベントには、入力待ちをキャンセルできるからです。 簡単に言えば、ダブルクリックして、そのセルが、1列目なら、入力モードをキャンセルして、 UserForm1 をモーダルモードをOff にして、出すということです。 モーダルモードをOff にすれば、ワークシートとUserForm を行き来することが可能になります。 If Target.Column <> 1 Then Exit Sub '一列目で起動   Cancel = True   UserForm1.Show 0 'モーダルモード  End If

lyu05665
質問者

補足

Wendy02様、ありがとうございました!確かに動きました。ご説明も非常に分かりやすくてコードの意味が理解できました。 ちょっと試しにやりましたが、この書き方でも動きました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column <> 17 Then Exit Sub Cancel = True UserForm1.Show 0 End Sub なぜかEnd Ifがなければ動きますが、あるとエラーが出てしまいます。 それと、もう一つお聞きしたいのは、今のコードですと、ある列の全てのセルを対象にしていますね。決まったセルだけを指定することはできないでしょうか。 度々申し訳ありませんが、どうぞよろしくお願いいたします。

  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.1

ふだんはVBAで worksheets("sheet1").combobox1. ...のように書きますね。 そのかわりに userform1.combobox1. とかMe.combobox1. ...のように書くだけです。 ただし、同じコントロールでも、シートとuserformで少しだけ プロパティが異なることがあります。

関連するQ&A

  • Excel VBA ユーザーフォームのコンボボックスに表示する値の入力方法

    Excel Xを使用して、VBAのユーザフォームにコンボボックスを作りましたが、どうしてもコンボボックス内に表示する値の入力方法が分かりません。 WEBや本などで「これ」と思われるものを実験していますが、どれも表示することができません。 できるだけ詳しく教えていただけませんか? したいことは、  cbocenter というコンボボックスに値を出します。  値は List シートの A2 から A18 に入力済みです。  それと値から選択した値を data シートの J列 に  表示させたいのです。(行の指定はできています) 本当に困ってます。よろしくお願いします。

  • EXCEL ユーザーフォームを使ったマクロ

    データの登録をするのにユーザーフォームを使おうと思うのですが、なかなかうまくいきません。教えてください。 ユーザーフォームにはコンボボックス、テキストボックス、コマンドボタンが貼り付けてあります。(コンボボックスのリストには呼び出したいシートの名前が入っています) コンボボックスのリストの中から呼び出したいシートを選択し、テキストボックスに入力した内容を、コマンドボタンを押すことで選択されたシート上の、あるセルに登録したいのですがどうすればよいでしょうか?

  • エクセルVBAのユーザーフォームのコンボボックス

    エクセルVBAのユーザーフォームのコンボボックスの入力と ファイルの保存で質問です。 エクセルVBAで ユーザーフォームのコンボボックスを使用して 1月から12月までを選択してもらい、 選択した月を コマンドボタン押した際に、 セルにその値を入力するような マクロを作成しようとしています。 またコンボボックスは標準で6月が表示されるようにしたいと思います。 ユーザーフォームのコードの一部です。 Private Sub UserForm_Initialize() Dim m As Integer For m = 1 To 12 UserForm1.ComboBox1.AddItem m Next ComboBox1.ListIndex = 6 Private Sub CommandButton1_Click() 'ユーザーフォームを閉じる Unload UserForm1 mold  '↑フォームを閉じた後に実行される標準モジュールのマクロ名です End Sub 標準モジュールのコード 名称 「mold」 Sub mold() ActiveWorkbook.SaveAs _ Filename:="C:\_" & UserForm1.ComboBox1.Text & "月", _ FileFormat:=xlOpenXMLWorkbook ActiveWorkbook.Close ThisWorkbook.Activate ' End Sub の様に作成して実行してみたのですが、 コンボボックスで11月を選択しても 6月のままのファイルになってしまいます。 どのようにしたら、 コンボボックスで選択した値を ファイル名として保存できるでしょうか? 全部のコードを記載しますと 長くなってしまうと思い、 関連するコードを記載して質問しました。 分かりづらい所もあるかと思いますが よろしくお願いします。

  • Excel VBA ある値が入力されたときだけユーザーフォームを出したいです

    ExcelのVBAを教えてください。 D15は、リストで入力する値を選択できるようになっています。 D15で選択された値によって、B15に反映されるようになっています。 たとえば、 D15の値をリストで105を選んだら、B15に「AAA」と入り、 D15の値をリストで109を選んだら、B15に「ccc」と入ります。 これらは、B15にIF関数が入っていて制御されています。 ところが、D15の値をリストで108と選んだ時だけ、B15に「BBB」と入る場合と「DDD」と入る場合の2パターンあり、これは人間の判断でどちらにするか考えるので、IF関数を使えません。 なので、 D15のリストボックスで108を選んだときだけ、 ユーザーフォームを出し(UserForm1.Show)、ユーザーフォームにBBBとDDDのコマンドボタンがあって、Tabでコマンドを選択し、Enterで確定し(マウスは使いたくない)、確定したコマンドの値をB15に反映させるようにしようと思いました。 ・・・が、ユーザーフォームを出すタイミングのVBAの組み方がわかりません。 D15の値をリストから選択する・・・というのは、他の方が作った仕組みなので変えることはできません。

  • excel vba ユーザーフォーム

    現在、セルa101からa110までに「商品名」、セルb101からb110までに「金額」が 入力済みです。 このデータを、ユーザーフォーム上にコンボボックスを2つ作成し、セルa1へ 商品名を選択後、入力。また、b2へ金額を選択後、入力させたいのです。 また、ユーザーフォーム上にテキストボックスを作成し、ここに入力した 「備考」の全角10文字をc1へ移動したいです。 今のところ、ユーザーフォーム、コンボボックス、テキストボックスを作成した だけで 立ち往生しています。 どなたか、ご教授お願いいたします。

  • VBAユーザーフォームで

     エクセルVBAでユーザーフォームより、テキストボックスで入力させたものをセルに表示させようとしています。  テキストボックスは1と2があり、テキストボックス1で入力した値の最初の5文字+固定値をテキストボックス2に自動で入力(表示)したいのですがなかなかうまくいきません。(自動入力後、手動で一部修正します。)  VBAをはじめたばかりの初心者ですが、どうぞよろしくお願いします。

  • VBA ユーザーフォームで

    VBAのユーザーフォームで、時間を入力し、何分だったかを出したいのです。 例えば、コンボボックス1~4を用意して、1にスタートの時間、2にスターの分、3にエンドの時間、4にエンドの分を入力し、エンドの時間からスタートの時間を引けば、何分かかったが出せると思うのですが、hhmm時間ではなく、mm分で出したいのですがそのようなことは出来ますか? コンボボックス1に、hhの意味を持たせて、2にmmの意味を持たせ、1と2を合わせると1つの時間(hhmm)になるようにしたいのです。そのような関数はありますか? また、コンボボックスに入力する際に、時間なので、2バイト入れれば次のコンボボックスにカーソルが移動するような制御はありますか? 宜しくお願いします。

  • Excel VBAのユーザーフォームについて

    Excel VBAでユーザーフォームを作成しています。 ユーザーフォームで出力したファイル 「出力ファイルA」 ユーザーフォームで使用するファイル 「ファイルB」 を、起動していると必ず「インデックスが範囲内にありません」 といった内容のエラーが表示されます。 ユーザーフォームで使用するファイルの表示中に そのようなエラー画面が出てきても仕方がないと思うのですが、 ユーザーフォームはマルチ画面を作成したので ファイルは「出力ファイルC」も出すことができる仕様です。 また、「出力ファイルA」「出力ファイルC」は コンボボックスで選択した西暦がファイルの先頭に付くので (例:2014_出力ファイルA.xls) 必ず同じファイル名が出力されるとは限りません。 なので、そのようなエラーが表示されないようにしたいのですが可能でしょうか? また、特別なコードは記述していないのですが、 なのでボタンとかコンボボックスのコードを書けばよいのか・・・という感じなのですが、 どのように対処すればよいかわかりません。 それと、出力したファイルの内容を確認するためにアクティブには、 ユーザーフォーム画面を終了させるしかならず、 そもそもそうゆう仕様なのかがわかりません。 ユーザーフォームを作成するのは初めてなので初心者丸出しで お恥ずかしい限りなのですが、 どなたかアドバイスいただけますと幸いです。 こんな抽象的ですが、どうお伝えすればよいのかがそもそもわからず困っていて、 それに時間もなく頭を抱えているので お手柔らかに願います。 よろしくお願い致します。

  • エクセルVBAについて質問です。

    エクセルVBAについて質問です。 シート1のユーザーフォームにコンボボックスとテキストボックスが各1つずつ、 シート2のA列には1行目から順に「あ」「い」「う」と文字が入っていて、B列には「1」「2」「3」と値が入っています。 コンボボックスのリストにはシート2のA列の文字が選択できる状態にあります。 この状態で、例えばコンボボックスで「い」を選んだら、テキストボックスに自動的に「2」と入る、というように、コンボボックスのリストの中から任意の文字を選択したときに、テキストボックスにB列の値が入るようにするにはどのようにすればいいのでしょうか?よろしくお願いします。

  • ユーザーフォーム上にあるコンボボックスの重複選択をできなくするには?

    ユーザーフォーム上に10個のコンボボックスがあり それぞれ名前をcb1からcb10とします。 これらのコンボボックスには同じリストを取得して 表示していますが、選択するときには重複させないように したいと思っています。 例を挙げると、 リストの値が”東京”、”大阪”、”名古屋”として、 cb1で”東京”を選択している場合は、残りのcb2~cb10では ”東京”を選択できないように、もしくは選択したときに ”すでに選択済みです”みたいなメッセージを表示させて キャンセル状態に戻す、みたいにしたいのですが スマートな書き方がわかりません。 ※力業でそれぞれのコンボボックスのチェンジイベントで 他のコンボボックスの値を見に行って、重複があれば メッセージを表示させるという方法ならわかるのですが 実際のコンボボックスの数が50近くあるためできれば 避けたいと思っています。 達人の皆様、どうぞ宜しくお願いします。

専門家に質問してみよう