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

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

A 回答 (4件)

こんばんは。



ユーザーフォームは、正直なところ、難しいですね。テキストにちゃんとしたものがないからなのでしょうか?何か、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

'----------------------------------

この回答への補足

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

補足日時:2009/05/14 10:11
    • good
    • 0

こんばんは。



>なぜか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/4774119 …
テキストで、覚えたことを確認して、できればメモを残しておくと、後々参考になります。
    • good
    • 0
この回答へのお礼

Wendy02様、どうもありがとうございました。Wendy02様のご説明はいつも大変勉強になります。

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

また、VBAのヘルプなんですが、本の中でもヘルプを読めと書いてありますが、今の段階ではいくら読んでも意味が全く分かりません。
少しずつ慣れていこうと思います。

お礼日時:2009/05/15 10:48

こんにちは。



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

この回答への補足

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がなければ動きますが、あるとエラーが出てしまいます。

それと、もう一つお聞きしたいのは、今のコードですと、ある列の全てのセルを対象にしていますね。決まったセルだけを指定することはできないでしょうか。

度々申し訳ありませんが、どうぞよろしくお願いいたします。

補足日時:2009/05/14 16:39
    • good
    • 0

ふだんはVBAで


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

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

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


人気Q&Aランキング