Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


931 / 13644 ツリー ←次へ | 前へ→

【77427】あるセルに手入力したら、その下のセルの中身をクリアにしたい kouka 15/9/30(水) 18:31 質問[未読]
【77428】Re:あるセルに手入力したら、その下のセル... β 15/9/30(水) 20:52 発言[未読]
【77437】Re:あるセルに手入力したら、その下のセル... kouka 15/10/2(金) 16:43 質問[未読]
【77438】Re:あるセルに手入力したら、その下のセル... Jaka 15/10/2(金) 17:07 発言[未読]
【77439】Re:あるセルに手入力したら、その下のセル... β 15/10/2(金) 17:28 発言[未読]
【77449】Re:あるセルに手入力したら、その下のセル... kouka 15/10/8(木) 18:59 お礼[未読]

【77427】あるセルに手入力したら、その下のセルの...
質問  kouka  - 15/9/30(水) 18:31 -

引用なし
パスワード
   いろいろ試行錯誤してみたのですが、
どうにも解決策が浮かばないので、
質問させていただきます。

例えば、A1セルとA2セルが入力欄で、
A1セルを手入力した場合、A2セルの中身をクリアしたいのですが、
うまくいかないのです。

|A
――――
1|りんご
――――
2|300円



|A
――――
1|みかん←A1に入力したら
――――
2|   ←A2がクリアにしたい

・worksheetに下記のコード

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim 商品名 As String

  If Range("$A$1") <> 商品名 Then Call Macro1
End Sub

・標準モジュールに下記のコード

Sub Macro1()
  Range("A2").ClearContents
  商品名 = Range("$A$1")
End Sub

このままだとループしてるっぽいのですが、
どうしたら良いでしょうか??
すみませんが教えてくださいm(_ _)m
よろしくお願いします。

【77428】Re:あるセルに手入力したら、その下のセ...
発言  β  - 15/9/30(水) 20:52 -

引用なし
パスワード
   ▼kouka さん:

ループしているというのは勘違いじゃないですか?
ループはしていないと思いますよ。ただ、思ったような結果にならないだけでは?

う〜ん・・・
コードとしては(これだけ短いこーどなのに)間違い部分が満載です。

まず、SelectionChageイベントは適切ではありません。
Changeイベントを使うべきですね。

次に、通常、イベント処理においては、動きのあったセルが、マクロで対象としているかどうかのチェックをします。
(対象外のせるなら無視)
それをしていませんね。

そもそもが、Changeイベント と 標準モジュールにわけて処理することが、めずらしいですね。
もちろん、それが妥当かつ必要なら、わけることもありますけど、今回は全く不要ですね。

最大の間違いは、この Macro1 には商品名という変数定義はありません。
モジュールの先頭に Option Explicit の記述がないと思われますが、それがないので
たまたまコンパイルエラーにはなりませんが、ここでの宣言のない変数は、テンポラリーに
生成されます。同姓同名ですけど、SelectionChangeイベントの商品名という名前の変数とは、まったく別物。
なので、これが実行されたとしても、SelectionChangeイベントでは やはり <> です。

まずはイベントを適切なもの(Changeイベント)にした上で、対象のセル(A1)の変更かd峰かを判定するのが第一歩。
次に同姓同名だけど別の変数というところをどうするか、これが第二歩。
これについては、Changeイベント内で、完結させれば解決します。

がんばってください。
壁にぶつかればSOSをどうぞ。

【77437】Re:あるセルに手入力したら、その下のセ...
質問  kouka  - 15/10/2(金) 16:43 -

引用なし
パスワード
   βさん、ヒントありがとうございました!
・・・ですが、また壁に当たってしまったので、質問させてください。

worksheetに下記のコードを作ったのですが・・・

Private Sub Worksheet_Change(ByVal Target As Range)

  Dim 商品名 As String

  If Range("$A$1") <> 商品名 Then
    Range("A2").ClearContents
    商品名 = Range("$A$1")
  End If

End Sub

『実行時エラー'28':スタック領域が不足しています。』と出てきて、
Excel自体が再起動してしまいます。

ちなみに前回書き忘れましたが、Win7のExcel2010です。

それと同姓同名の場合でも同じ処理をしたいので、
それは考えなくていいです。

こんな短いコードでこんなにうまくいかないのは久しぶりで、
どうしたらいいのか、わけわからん状態ですが、
すみませんが、教えてください。。。
よろしくお願いします。

【77438】Re:あるセルに手入力したら、その下のセ...
発言  Jaka  - 15/10/2(金) 17:07 -

引用なし
パスワード
   >Range("A2").ClearContents
これでセルの内容を変更しているので、また
Worksheet_Change イベントが発生します。
で、またクリアすると、Worksheet_Change イベントが発生します。
で、なんかしらが溜まり積もって、スタックオーバー・・。
こんな感じに書き込む前にイベントを中止しましょう。

Application.EnableEvents = False 'イベント中止
Range("A2").ClearContents
Application.EnableEvents = True '書き終わったら戻す。

【77439】Re:あるセルに手入力したら、その下のセ...
発言  β  - 15/10/2(金) 17:28 -

引用なし
パスワード
   ▼kouka さん:

同姓同名というのは 変数 にお名前のことです。
それはさておき、要件を誤解しているかもしれませんが

Private Sub Worksheet_Change(ByVal Target As Range)
  'A1変更があった時のみ処理
  If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
  '今回はマクロ内での変更はA2なのでなくてもいいけどたしなみとして
  Application.EnableEvents = False  'イベント発生抑止
  Range("A2").ClearContents
  Application.EnableEvents = True   'イベント発生再開
End Sub

【77449】Re:あるセルに手入力したら、その下のセ...
お礼  kouka  - 15/10/8(木) 18:59 -

引用なし
パスワード
   こんばんは、koukaです。
βさん、Jakaさん質問に付き合ってくれてありがとうございました!

あれから、どうもしっくりこないので、VBA参考書をみていたら、
『Target.Address』でセルをしてしちゃえばいいのでは、
と、自問自答が起こり、下記のようなコードに変えてみました。

Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Address = "$A$1" Then
    Range("A2").ClearContents
  End If

End Sub

同じ名前を入れてもクリアさせるのが前提ですので、
セルを指定してあげればいいのですよね!?

変に難しく考え過ぎていたようです。。。
いろいろ教えていただきありがとうございました!

931 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free