No.1
- 回答日時:
ふだんはVBAで
worksheets("sheet1").combobox1. ...のように書きますね。
そのかわりに
userform1.combobox1. とかMe.combobox1. ...のように書くだけです。
ただし、同じコントロールでも、シートとuserformで少しだけ
プロパティが異なることがあります。
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
'----------------------------------
この回答への補足
Wendy02様、おはようございます!
いつもお世話になっています。
答えてくださってどうもありがとうございました。
ただ、私のような初心者には難しすぎてよく分かりません^^;
Private Subは単独で実行できないから、教えてくださった2つのPrivate SubをMain Subにまとめる必要があると分かっていますが、書き方が分かりません。
Worksheet_BeforeDoubleClickをシートモジュールに書いて、ComboBox1_ClickをUserForm モジュールに書いて、Main SubをModule1に書いたせいか、「SubまたはFunctionが定義されていません」というエラーが出てきます。
Call Worksheet_BeforeDoubleClickのように書いていますが。
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
この回答への補足
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がなければ動きますが、あるとエラーが出てしまいます。
それと、もう一つお聞きしたいのは、今のコードですと、ある列の全てのセルを対象にしていますね。決まったセルだけを指定することはできないでしょうか。
度々申し訳ありませんが、どうぞよろしくお願いいたします。
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/4774119 …
テキストで、覚えたことを確認して、できればメモを残しておくと、後々参考になります。
Wendy02様、どうもありがとうございました。Wendy02様のご説明はいつも大変勉強になります。
教えてくださった技術評論社『かんたんプログラミング Excel VBA』を2週間?くらい前に購入して、少しずつ勉強しています。ただ、同時に仕事でコードを書こうとしているので、分からないことが多すぎます。分からなくなった時はまず、本で調べたりインターネットで探したりしていますが、それでも答えが見つからなければ、誰か詳しい方に聞くしかないと思いました。聞きすぎて申し訳ありません m_ _m
また、VBAのヘルプなんですが、本の中でもヘルプを読めと書いてありますが、今の段階ではいくら読んでも意味が全く分かりません。
少しずつ慣れていこうと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Access(アクセス) access フォーム 大分類、小分類 1 2022/08/11 18:03
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- Access(アクセス) Accessフォーム 一部のレコードだけを抽出する方法について 1 2022/06/28 18:45
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- JavaScript 空白で入力フォームのボタンをクリックしたら、ブラウザの上部からjavascriptで 表示されるアラ 1 2022/05/20 11:16
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- JavaScript テーブルの中のセレクトボックスの値が0のとき、非表示にしたい 3 2022/05/29 10:13
- JavaScript ラジオボタンによるフォームの開閉を行いたい 3 2022/03/31 21:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access レポート印刷するときに...
-
access2021 メッセージボックス...
-
Accessでフォームに自動入力し...
-
accessのフォームに設置したボ...
-
Accessのフォーム上のテキスト...
-
accessデータを指定したExcel、...
-
アクセスクエリで教えて下さい...
-
accessでlaccdbファイルが削除...
-
Access VBA を利用して、フォル...
-
Accessのリンクテーブルのパス...
-
Accessのクエリで、replace関数...
-
Access Error3061 パラメータが...
-
accessの代わりになるもの
-
Accessのことで教えてください...
-
Accessで作ったデータベースをw...
-
CSVファイルの「0落ち」にVBA
-
AccessVBAについて テーブルの...
-
Access VBA [リモートサーバー...
-
日付のテキストボックスに(例...
-
AccessのDBを理解するコツは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access レポート印刷するときに...
-
Access Error3061 パラメータが...
-
Microsoft365にAccessってあり...
-
Accessのクエリで、replace関数...
-
Accessのリンクテーブルのパス...
-
Access VBA [リモートサーバー...
-
ACCESS VBA でのエラー解決の根...
-
accessデータを指定したExcel、...
-
Accessのスプレッドシートエク...
-
CSVファイルの「0落ち」にVBA
-
【Access】Dcount関数の複数条...
-
Accessのフォーム上のテキスト...
-
Access VBA を利用して、フォル...
-
実行時エラー3131 FROM 句の構...
-
Vba Userformを前面に出すについて
-
Accessでフォームに自動入力し...
-
Accessレポートのチェックボッ...
-
Accessのテキストボックスの入...
-
Access 複数条件検索の設定が上...
-
accessのフォームに設置したボ...
おすすめ情報