プロが教えるわが家の防犯対策術!

ExcelのVBAコードについて教えてください。
シート№3のシート名が「1」に下記のコードがあります。
「Private Sub Worksheet_Change(ByVal Target As Range)
Const Temp1 = "○○市○○条例 第"
Const Temp2 = "条 適用"
Dim R, C, RM, Temp
R = Target(1).Row
C = Target(1).Column
If (2 <= R And R <= 23) And C = 13 Then
Temp = ""
For RM = 2 To 23
If Cells(RM, 13) = "●" Then
Temp = Temp & Cells(RM, 14) & "・"
End If
Next RM
Temp = Replace(Temp & "@@", "・@@", "")
Application.EnableEvents = False
If Temp = "@@" Then
Range("O24").ClearContents
Else
Range("O24") = Temp1 & Temp & Temp2
End If
Application.EnableEvents = True
End If
End Sub」
このコードはM列にプルダウン設定して「●」を選択すると
その横のセルN列番号がセルO24に表示されるコードです。
M列をプルダウン選択して「●」を表示すると上手くセルO24に表示に表示されるのですが、
例えばM3に別のセルからコピーした場合「例:=受付シート!C185」M3が●にN3が6なります。
しかし、セルO24に「6」が表示されず、例えば、まったく違うセルM22を●を表示・非表示にするとセルO24に「6」が表示されます。

1. 例えば、M3に別のセルからコピーした場合でもセルO24に「6」が表示される方法は有りませんでしょうか?
ありましたら、詳しいコードを教えてください。
よろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    回答ありがとうございます。
    説明が悪く、申し訳ありません、
    おっしゃる通り、(M列が参照結果によって:●)に
    なっても、思った様にマクロが動作しないという事です。
    ボタンを設置して、●の設定が
    終わってから、最後にボタンクリックで動作させるでは、ダメでしょうか?
    出来れば、M列を参照結果又はプルダウン選択にて
    O24にそのまま表示させたいのですが、
    現状のボタンを設置して、●の設定が
    終わってから、最後にボタンクリックで動作させるでは、ダメでしょうか?
    現状の「VBAコード」で設定不可能な場合は、
    貴者のおっしゃる通りに「最後にボタンクリックで動作」で問題ありません。
    よろしくお願いいたします。
    尚、本日これからパソコンから離れてしまいますので、確認は明日の朝以降になります。
    勝手申しますがよろしくお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/01/20 17:30
  • うーん・・・

    おはようございます。
    回答ありがとうございました。
    ご指示の通りに
    Dim R, C, RM, Temp
    If Not Intersect(Target, Range("M3:M23")) Is Nothing Then
    Temp = ""
    For RM = 2 To 23
    If Cells(RM, 13) = "●"
    と設定しましたが
    「If Cells(RM, 13) = "●" 」の部分が赤くなりエラー表示が出てしまします。
    元の
    「If Cells(RM, 13) = "●" Then」
    に戻すとエラーが出ませんが
    O24に上手く表示が出いません、
    申し訳ありません
    解決方法をよろしくお願いいたします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/01/21 09:02

A 回答 (5件)

>赤くなりエラー これコンパイルエラーですよね


タイプミスや文法が間違っているなどの時に出るエラー

If Cells(RM, 13) = "●" に関する部分を変更するようなアドバイスはしていないと思います。
そもそも IF文になぜThenを付けないのか・・・

#3の説明が悪かったのか、、通じんかった。。すみません。、#3の文

後に If Cells(RM, 13) = "●"  で
Target.Valueで無いので大丈夫かと・・・思います

これは、実行(メイン処理)コードでTargetを使用していないから
1004などのエラーは出ないであろうと示唆したもので
逆に変数Targetを使用する場合、複数セルの操作を行うと
複数セル範囲.Valueはエラーになると言う事
なので、Target(1) とか Target.count=1 やTarget.count>1
みたいな取得方法や条件設定が必要になると言う事です。

余計な事を書いたから混乱したのでしょうか

ご質問コードを添削しました。(コード全文)

Private Sub Worksheet_Change(ByVal Target As Range)
Const Temp1 As String = "○○市○○条例 第"
Const Temp2 As String = "条 適用"
Dim RM As Long, Temp As String
' As Long は 23行までなら As Integer で良いが
'習慣的に行ループで使うカウント変数はAs Longで宣言しています
If Not Intersect(Target, Range("M3:M23")) Is Nothing Then
Temp = ""
For RM = 2 To 23
If Cells(RM, 13) = "●" Then
Temp = Temp & Cells(RM, 14) & "・"
End If
Next RM
Temp = Replace(Temp & "@@", "・@@", "")
Application.EnableEvents = False
If Temp = "@@" Then
Range("O24").ClearContents
Else
Range("O24") = Temp1 & Temp & Temp2
End If
Application.EnableEvents = True
End If
    • good
    • 0
この回答へのお礼

ありがとうございました。
全て解決いたしました。
感謝いたします。

お礼日時:2022/01/21 14:54

おはようございます。



No.1の者です。

先ず、No.3は、3行のコードを、1行にできますよ。の回答かと思います。
>R = Target(1).Row
>C = Target(1).Column
>If (2 <= R And R <= 23) And C = 13 Then
>を
>If Not Intersect(Target, Range("M3:M23")) Is Nothing Then

No.2の方の回答と同様に、計算で変わったセルをWorksheet_Changeで
捉える事はできないです。
中々処理が大変なので、ボタン設置などが手軽で良いかと思います。

他のイベントですと、Worksheet_Calculate でしょうか?
どこかのセルに、下記の様に式を入れておけば、計算結果が変わった時に
イベントは発生しますが、どこのセルで計算されたかが分かりません。
=COUNTIF(M2:M23,"●")
例えば、対象範囲のM2:M23セルの内容を、配列に入れておいて、
Calculateのイベントが発生したら、その配列の中で変化があったかを
調べて、変化があれば、処理を行うとかでしょうか?
また、全く関係ないセルで計算がおきても、イベントが発生しますので、
色々と対策が必要になるかと思います。

下記、検索した記事になります。
https://oshiete.goo.ne.jp/qa/5021956.html
    • good
    • 0

R = Target(1).Row


C = Target(1).Column
If (2 <= R And R <= 23) And C = 13 Then

If Not Intersect(Target, Range("M3:M23")) Is Nothing Then

後に If Cells(RM, 13) = "●"  で
Target.Valueで無いので大丈夫かと・・・思います
この回答への補足あり
    • good
    • 0

>M3に別のセルからコピーした場合


L3:M3に貼り付けるとか
単純に貼り付け範囲のインデックス1が
If (2 <= R And R <= 23) And C = 13 Then 
この条件の外にあるのだた思いますが・・

なさりたい処理が出来ているのであれば、
実行条件を再考するか
最後にボタンクリックや特定セルのダブルクリックとか
トリガーを考え直した方が簡単ですかね。

>詳しいコードを教えてください。
・・・
    • good
    • 0

こんばんは。



何回か読んだのですが、イマイチ良く分かりませんが、M列に計算式が
入っていて、その参照先が変わっても、(M列が参照結果によって:●)に
なっても、思った様にマクロが動作しないという事でしょうか?

因みに、Worksheet_Change でないとダメなのでしょうか?
M列を変更する度に、マクロが動作している様ですが、2行~23行までの
対象データを連結している様に見えるので、ボタンを設置して、●の設定が
終わってから、最後にボタンクリックで動作させるでは、ダメでしょうか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!