皆様、こんにちは。
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を見た人が検索しているワード

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

QATOK 2006 は User ID 必須?

Atok 2006 の中古品を先日購入しました。ユーザー登録はできないが、
使用する事はできるとの記述でした。が、到着後インストールをしようと
した所、シリアルナンバーの入力だけでは「user IDが空欄」とウィンドウが
開き、次の画面に進むことができませんでした。

これは、落札したソフトがAAA優待(バージョンアップ)版だったという
ことなのでしょうか。それとも、ATOKは全てUser ID入力が必須で、
私の知識が不足していただけでしょうか。

販売者に連絡を取るべきかどうか迷っています。
宜しければ、何かアドバイス頂けると有り難いです。

Aベストアンサー

UserIDを求められるということはバージョンアップ版なのだと思います。
通常版であれば、UserIDの入力は不要です。

その画面の前に、以前のバージョンが見つからないといったメッセージ
が出ていませんか。

販売者に連絡を取って、確認した方がよいと思います。

Qユーザーフォーム上にコンボボックス作成

ここの書き込みでも何度も書きましたが、まだ解決できません。
sheet1:にボタンをクリックすると、ユーザーフォームが現れ、その上にコンボボックスを作成しました。
sheet2:には、リストの項目を書いています。それをコンボボックスに表示させたいのですが、上手くいきません。すいません何度、本当に知りたいです
下記を記述しても表示できません。
Private Sub 記入フォームAC_Initialize()
For I = 0 To 7
コンボA.AddItem Worksheets("データ").Cells(I + 2, 2).Value
Next
End Sub

Aベストアンサー

No3, onlyromです。

>papayukaさんの記述をしたところ、リストは開く事は出来ました。
>全て空白状態になっています

上手くいかない方がおかしいですよ。
シート「データ」のB2~B8までにちゃんと値は入っていますか???
再度確認してください。

またリストの元の値がシートにある場合は、
No.4さんの回答にあるRowSourceプロパティを使うのがふつうです。
 
'-------------------------------------------
Private Sub UserForm_Initialize()
Dim LastRow As Long
LastRow = Sheets("データ").Range("B65536").End(xlUp).Row
コンボA.RowSource = "データ!B2:B" & LastRow
End Sub
'-------------------------------------------

上記は、リストが、シートデータのB2からB列の値が入ってる最後までをとる方法です。

何れにしろ、質問者のコードをアップするのが解決の一番の早道でしょう。

No3, onlyromです。

>papayukaさんの記述をしたところ、リストは開く事は出来ました。
>全て空白状態になっています

上手くいかない方がおかしいですよ。
シート「データ」のB2~B8までにちゃんと値は入っていますか???
再度確認してください。

またリストの元の値がシートにある場合は、
No.4さんの回答にあるRowSourceプロパティを使うのがふつうです。
 
'-------------------------------------------
Private Sub UserForm_Initialize()
Dim LastRow As Long
LastRow = Sheets("デー...続きを読む

QRecipient address rejected: User unknown in local recipient tableのエラーについて

自動配信しているメールがあるのですが、
ある所からここ2週間ほど続けて以下のエラーメッセージが出ます。

< #5.0.0 X-Postfix; host xxx.xxx.xx.xxx[xxx.xxx.xx.xxx] said: 550 <メールアドレス>: Recipient address rejected: User unknown in local recipient table (in reply to RCPT TO command)>

User unknown in local recipient table とありましたので、アドレスのユーザー部分の間違いだろうと思い確認したところ、エラーは出ているもののそのメールは相手側には届いているとの返事が返ってきました。
となると、アドレスの登録間違いではないということになると思うのですが、これ以外で原因として考えられるものはあるのでしょうか?
もしお分かりになる方がいらっしゃっいましたら、是非教えてください。

Aベストアンサー

メールボックスが存在しないというエラーです。
相手のメールサーバ管理者へ、このメールのヘッダを添えて問い合わせた方が良いです。

Qカレンダーフォームの日付をユーザーフォームに登録したい

ユーザーフォームにいくつかの入力欄としてテキストボックスを作成しました。
その中に日付を入力したい欄があるため同じユーザーフォーム内にカレンダーを作成しました。
このカレンダーをクリックした日付がユーザーフォーム内の任意のテキストボックスに入力されるようにしたいのですが、可能でしょうか?

教えてください。よろしくお願いします。

Aベストアンサー

こういう事ですか?

Private Sub Calendar1_Click()
TextBox1.Text = Calendar1.Value
End Sub

QUserModeLinuxを転送されたファイルで起動

UserModeLinuxという仮想化技術について学んでいます。
UserModeLinuxを起動するためには、
カーネルとルートファイルシステムが必要だと考えていました。
そこで、自分のパソコンでは
https://help.ubuntu.com/community/UserModeLinux
を参考にUMLを起動できるようになりました。
次にJavaでファイル転送プログラムを作成し、
ファイル転送にも成功しました。
そこで受信した側のPCの端末から起動しようとしたのですが、
「user-mode-linuxをインストールしてください。」
というエラーが出てしまいます。
カーネルとルートファイルシステム以外に必要なものがあるのでしょうか。

Aベストアンサー

転送中にファイルが壊れたのでなければJavaとは関係ない話なので、Linuxカテゴリで尋ねたほうがいいでしょう。
そもそも、先日まで起動できていたんじゃないのですか?

QAccessで、フォームAからダイアログモードで立ち上げたフォームBを開き、フォームBを閉じた時にフォームA側でマクロを実行したい

タイトルのままなのですが、

フォームA(メインとなる画面)と
フォームB(コードの検索画面)があり、
フォームAからフォームBをダイアログモードで開いている状態から、
フォームBを閉じたときに、フォームA側でマクロを実行したいと思っています。

具体的には、フォームAにコード入力用のテキストボックスがあり、コード検索のためにフォームBを立ち上げ、コードを選択した後フォームAのテキストボックスにそのコードを入れて、そのコードの値を元にフォームAにあるコンボボックスの再クエリを行いたいのです。

コンボボックスの再クエリの方法等は理解しているのですが、
上記のような場合に、どのイベントがキックされるのかが分かりません。
どのようにすれば(どのイベントを選んでマクロを指定すれば)適切に実行できるでしょうか。

Aベストアンサー

フォームBの処理
「値の代入」
「オブジェクトの選択」
  オブジェクトの種類:フォーム
  オブジェクト名:フォームA
「再クエリ」
  コントロール名:コンボボックス名
でいかがでしょうか?

Quser idはwinに記憶させられぬか

xpです。siteに入るときにuser idとpasswとを打ち込まされます。
enterを押すときにwinにpasswを記憶させるかと尋ねてくるが、
user idはさにあらず。当然user idは再度打ち込む手間を掛けさせられる。
user idを同時に記憶させることが出来たらやり方を教えてください。

Aベストアンサー

ロボフォームを使ってください。僕も使ってますが便利ですよ。

参考URL:http://www.roboform.com/jp/

QAccess フォームコンボボックス空白をクエリで抽出したい

現在access2000を使って、
フォーム1内にコンボボックスを作って
コンボボックス内に1,2,3
と項目を入れています。
一方、クエリを使って、上記フォーム内のコンボボックスをつなげて1,2,3をそれぞれ抽出することはできるのですが、
1から3まで全てをiif関数などで
抽出したいと考えてします。
僕が考えた関数は
iif(isnull([フォーム1][コンボ1]),is not null ,[フォーム1][コンボ1])
とクエリ抽出条件内に入力すると、結果は、
1、2、3をそれぞれフォームコンボボックスで選択すれば、クエリに反映されるのですが、コンボボックス内を「空白」の状態にすると、1,2,3すべてがクエリで抽出されるのではなく、何も抽出されないという結果になってしまいます。
どうすれば、クエリで1から3すべてを抽出することができるのでしょうか?多分、iif関数内の「空白」は空白として処理されないような気がします。
よろしくお願いします。

Aベストアンサー

現在の抽出条件は
=Forms![フォーム1]![コンボ1]
でしょうか

コンボが空白(未選択)時に全て表示としたければ
=Forms![フォーム1]![コンボ1] or Forms![フォーム1]![コンボ1] is null

QLinuxServerにlogin

LinuxServer上のホルダーに2003WindowsServerからデータを書き込んでいました
今回WindowsServer2008R2に変わり、同じPC名同じIPアドレスで連携を継続しようとしましたが、同じID.パスワードでLinuxServerにログイン出来ない状況になりました
今回の変更点は、Windows側がドメインServerからワークグループになった事
ドメイン名とワークグループ名も違うことです
LinuxServer側は、設定変更が必要なのでしょうか
又、その方法は
因みにLinuxServerのバージョン情報はわかりません
LinuxServer側のSEはServerの再起動をしていません

Aベストアンサー

Sambaサーバのことでしょうが、基本、/etc/samba/smb.confをいじりますよね。

>ドメイン名とワークグループ名も違うことです
というわけで、
globalセクションの
workgroup = ・・・
の部分は変えるとして、
security = の部分はどうでしょうね。
ユーザー認証をどうしてたのか、どうするのか、ということで変わってきますが。
security = userで、smbpasswdコマンドでユーザ追加するのでいいと思うというか、現状そうなってるかもしれませんが、よく分かりません。

/var/log/samba(か、どこか)に出来るlogを見るのもお勧めします。

Q困ってます!Accessフォームのコンボボックス

初心者です。とーっても困っています・・・。
顧客データを登録しているのですが、テーブルを元に登録フォームを作成しました。
商品がたくさんあって、4つのコードに分かれています。フォームの中に[A][B][C][D]と4つのコンボボックスを作成し、絞込み検索ができるようにはしました。

が、しかし、選んだデータがテーブルに表示されません。例えば[A]のコンボボックスの中から[1010]を選択、テーブルを見ると、他のテキストボックスに入力した情報は保存されているけど、コンボで選んだデータは空白です。

誰か助けてください!!よろしくお願いします。

Aベストアンサー

> 他のテキストボックスに入力した情報は保存されているけど、コンボで選んだデータは空白です。

このコンボボックスのプロパティを確認してください。
コントロールソース欄にフィールド名が入っていなければ、非連結のコントロールという
ことなので、その場合はテーブルには値が入りません。


人気Q&Aランキング