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のヘルプなんですが、本の中でもヘルプを読めと書いてありますが、今の段階ではいくら読んでも意味が全く分かりません。
少しずつ慣れていこうと思います。
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.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.1
- 回答日時:
ふだんはVBAで
worksheets("sheet1").combobox1. ...のように書きますね。
そのかわりに
userform1.combobox1. とかMe.combobox1. ...のように書くだけです。
ただし、同じコントロールでも、シートとuserformで少しだけ
プロパティが異なることがあります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access レポート印刷するときに...
-
access2021 強制終了してしまう
-
Accessのクエリで、replace関数...
-
Accessのスプレッドシートエク...
-
実行時エラー3131 FROM 句の構...
-
access2019の起動が遅い
-
Access 複数条件検索の設定が上...
-
Accessでフォームに自動入力し...
-
Access Error3061 パラメータが...
-
Access VBA を利用して、フォル...
-
Microsoft365にAccessってあり...
-
Accessレポートのチェックボッ...
-
access2021 メッセージボックス...
-
ACCESS VBA でのエラー解決の根...
-
accessでlaccdbファイルが削除...
-
テーブルとクエリの相関図は表...
-
アクセスで教えてください。 住...
-
【Access】Dcount関数の複数条...
-
access クエリ yes/no型のクエ...
-
Accessで作ったデータベースをw...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access レポート印刷するときに...
-
access2021 強制終了してしまう
-
Accessのクエリで、replace関数...
-
accessでlaccdbファイルが削除...
-
【Access】Dcount関数の複数条...
-
Access Error3061 パラメータが...
-
Accessのスプレッドシートエク...
-
ACCESS VBA でのエラー解決の根...
-
Accessレポートのチェックボッ...
-
実行時エラー3131 FROM 句の構...
-
access2019の起動が遅い
-
Vba Userformを前面に出すについて
-
Microsoft365にAccessってあり...
-
教えてください! アクセスの書...
-
Access 複数条件検索の設定が上...
-
【至急・画像あり】建物or住所...
-
Access VBA [リモートサーバー...
-
access2021 レコードロックの使...
-
Access VBA を利用して、フォル...
-
Accessのリンクテーブルのパス...
おすすめ情報