
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
それは、次のコードに誤りがあるからです。
> Dim str As String
> str = rngTarget.Value
> MsgBox str
#4 のコードでは A1、B1 ともに実行が許可されるセルとなってます。
つまり、A1:B1 を選択して Delキーを押せば、rngTarget には A1:B1 の
2つのセルが参照されています。
--> #5 のご回答2.の内容です。
この時、rngTarget.Value は A1 と B1 の2つの値を配列で返してますが、
それを受ける変数 str は、一つの値しか代入できない通常の文字列型変数
なので代入に失敗し、エラーになってます。
次のコードならエラーになりません。Address プロパティーは例え rngTarget
が複数のセルであっても、「アドレスという一つの文字列データ」しか返さ
ないからです。
str = rngTarget.Address
#4 は複数セルの場合に対応させるコードで、Range コレクション という
ものの理解が必須です。ちょっとイキナリ過ぎて、例示としては良くな
かったですね。すみません。
まずは、単純に一つのセルのみで動作するコードを考えてみましょう。
' Sample: A1 セルのときのみ実行する
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
MsgBox Target.Value '<-- A1 単一セルであることが保証されている
End If
End Sub
とてもシンプルです。まずは、この使い方から理解を深めてみて下さい。
今後の話として説明しておきますが、このコードの場合、例えば A1:C10 セルに
対してデータの貼り付け、またはデータの削除などの操作を行った場合、A1 の
値が変化するにも係わらず、MsgBoxが実行されません。それは、Target.Address
が A1:C10 となるので
If Target.Address = "$A$1" Then の論理式が False になる
からですね。これでは困る場合、#4 のようなコードで対応することになります。
No.5
- 回答日時:
「フォーカスが隣に移動する」かどうかは入力後のセル移動設定の問題であり、本質ではありません。
Changeイベントは「隣に移動する」かどうかにかかわりなく、ワークシートのセルが変更されたときに発生します。
Changeイベントの認識する「Target」はあくまで変更されたセルです。移動先ではありません。念のため。
ここで注意すべきは、
1.セルの内容を削除した場合にも発生する。
2.セル範囲に対してコピーしたり削除した場合、セル範囲が「Target」と認識される。
3.Changeイベントのプロシージャ内でセルに変更を加えた場合にもイベントは発生するので、そのような処理をする場合は堂々巡りを回避する必要がある。(普通は一時的に EnableEvents プロパティの値を変更してイベントが発生しないようにする。)
以上。
No.4
- 回答日時:
> フォーカスのセルの内容だけが変更・確定された場合にだけ起きるイベント
> があれば、安全なのだと思いますが‥。
いや、、、だからそのイベントが Worksheet_Change イベントですよ。使い方
の問題です。
#3 のご回答は、プログラムに不慣れな方が扱うにはある意味でその通りだと
思いますが、、
> こんなの自分で使う場合以外の人が使う例では使えないと思います。
そんなことはありません。Change イベントはごく一般的に使われますよ。
Change イベントに致命的欠陥があるわけではありませんし、意図通り動作
しない、エラーが発生するなどの多くの場合はプログラムに問題があるの
であって、それを回避するコードを書くまでです。
#3 のご回答の真意は、「よくよくテストして下さい」だと思いますが、
それはどのようなプログラムであっても共通して言えることですしね。
Change イベント使い方のサンプルを提示しておきます。下記のソースコード
ではセル A1,B:B,C1:D10,E1 以外が変化しても、コードの実行を終了させて
何事もなかったように振舞います。これは、
> フォーカスのセルの内容だけが変更・確定された場合にだけ起きるイベント
と同意の動作ではないですか?
' シート上のセルの値が変化したとき発生
Private Sub Worksheet_Change(ByVal Target As Range)
' 以下のコードの動作を許可するセルのアドレスを
' カンマ区切りの文字列で定義しておきます
Const CELL_ADDRESS = "A1,B:B,C1:D10,E1"
Dim rngTarget As Range
' Target には変化したセルが参照されていますので、
' それを調べて、VBA コード動作させたいセル以外なら
' 終了するようにします
' また余計なセルが処理対象とならないように、
' Set rngTarget = Intersect(Target, Me.Range(CELL_ADDRESS))
' として Target を rngTarget に再定義します
Set rngTarget = Intersect(Target, Me.Range(CELL_ADDRESS))
If rngTarget Is Nothing Then Exit Sub
' CELL_ADDRESS で定義したセルに対して実行させる処理を以下に記述
MsgBox "選択セル中、処理対象となったセルのアドレス:" & rngTarget.Address
End Sub
余談ですが、ワークシート上で Enter イベントに相当するのは、
Selection_Change イベントですね。
遅くなりまして、すみませんでした。
お教えいただきましたコードで実行してみました。
Dim str As String
str = rngTarget.Value
MsgBox str
としてみたのですが、おっしゃる通り、例えばA1とA2を一緒に選択してDeleteすると、
str = rngTarget.Value
のコードのところで、”型が一致しません。”というエラーが出てしまいます。A1セルだけ選択してDeleteしても確かにエラーはでないのですが‥。
No.3
- 回答日時:
Enterイベントがないですね。
Changeイベントしかないが、Changeイベントは怖いですよ。
キャンセルやコピー貼り付けやDelete やよくテストしてください。
こんなの自分で使う場合以外の人が使う例では使えないと思います。
Application.EnableEvents=Falseを入れなければならない場合にも気をつけて。
経験のおありの方のご指導、ありがとうございました。本来は、フォーカスのセルの内容だけが変更・確定された場合にだけ起きるイベントがあれば、安全なのだと思いますが‥。
No.2
- 回答日時:
特定のシートならシートのモジュールに
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "Changed " & Target.Address
End Sub
ブック全体なら、ThsWorkBook のモジュールに
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
MsgBox "Changed Sheet " & Sh.Name & " " & Target.Address
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
excelで セルの移動時にマクロ実行を設定したい。
Excel(エクセル)
-
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
値を入力後、自動的にアクティブセルが移動するマクロ
Excel(エクセル)
-
-
4
セルが移動した時に値の代入を行いたい
その他(コンピューター・テクノロジー)
-
5
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
6
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
7
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
8
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
9
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
10
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
11
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
12
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
13
Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる
Visual Basic(VBA)
-
14
エクセルのVBA 特定のセルでエンターキーでマクロ実行
Excel(エクセル)
-
15
Changeイベントでの複数セルのクリアの処理について
Visual Basic(VBA)
-
16
VBA ユーザーフォーム ボタンクリック後にセルにフォーカス
Visual Basic(VBA)
-
17
Excel:いまフォーカスがあるセルを特定し、その行のセルのデータをA列から順に参照したい。
Excel(エクセル)
-
18
セルに入力するたびにマクロを実行する
Visual Basic(VBA)
-
19
【VBA】Worksheet_changeイベントで特定のキーが押されたときだけ無効にしたい
Visual Basic(VBA)
-
20
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの複雑なシフト表から...
-
【マクロ】変数に入れるコード...
-
エクセルの関数について
-
【マクロ】実行時エラー '424':...
-
【マクロ】数式を入力したい。...
-
【マクロ】【配列】3つのシー...
-
エクセルのリストについて
-
【マクロ】元データと同じお客...
-
【マクロ】左のブックと右のブ...
-
【マクロ】【相談】Excelブック...
-
他のシートの検索
-
【画像あり】オートフィルター...
-
エクセルのVBAで集計をしたい
-
Office2021のエクセルで米国株...
-
vba テキストボックスとリフト...
-
【関数】3つのセルの中で最新...
-
【マクロ】excelファイルを開く...
-
LibreOffice Clalc(またはエク...
-
エクセルシートの見出しの文字...
-
Amazonでマイクロソフトオフィ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【マクロ】元データと同じお客...
-
エクセルの関数について
-
【画像あり】オートフィルター...
-
エクセルのVBAで集計をしたい
-
エクセルのリストについて
-
【マクロ】数式を入力したい。...
-
【マクロ】【相談】Excelブック...
-
Office2021のエクセルで米国株...
-
【マクロ】実行時エラー '424':...
-
他のシートの検索
-
エクセルの複雑なシフト表から...
-
【マクロ】【配列】3つのシー...
-
vba テキストボックスとリフト...
-
【マクロ】左のブックと右のブ...
-
【マクロ】変数に入れるコード...
-
エクセルシートの見出しの文字...
-
【マクロ】別ファイルへマクロ...
-
【関数】同じ関数なのに、エラ...
-
Amazonでマイクロソフトオフィ...
-
ページが変なふうに切れる
おすすめ情報