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」が表示される方法は有りませんでしょうか?
ありましたら、詳しいコードを教えてください。
よろしくお願いいたします。
No.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
No.4
- 回答日時:
おはようございます。
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
No.3
- 回答日時:
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で無いので大丈夫かと・・・思います
No.2
- 回答日時:
>M3に別のセルからコピーした場合
L3:M3に貼り付けるとか
単純に貼り付け範囲のインデックス1が
If (2 <= R And R <= 23) And C = 13 Then
この条件の外にあるのだた思いますが・・
なさりたい処理が出来ているのであれば、
実行条件を再考するか
最後にボタンクリックや特定セルのダブルクリックとか
トリガーを考え直した方が簡単ですかね。
>詳しいコードを教えてください。
・・・
No.1
- 回答日時:
こんばんは。
何回か読んだのですが、イマイチ良く分かりませんが、M列に計算式が
入っていて、その参照先が変わっても、(M列が参照結果によって:●)に
なっても、思った様にマクロが動作しないという事でしょうか?
因みに、Worksheet_Change でないとダメなのでしょうか?
M列を変更する度に、マクロが動作している様ですが、2行~23行までの
対象データを連結している様に見えるので、ボタンを設置して、●の設定が
終わってから、最後にボタンクリックで動作させるでは、ダメでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel VBA】指定行以降をクリ...
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
任意フォルダから画像をすべて...
-
Excel VBA マクロ ある列の最終...
-
VBA コピーして次の値まで貼り...
-
i=cells(Rows.Count, 1)とi=cel...
-
Application.Matchで特定行の検索
-
数字でピラミッドを出力させる...
-
DataGridViewの各セル幅を自由...
-
Excelのマクロについて
-
Excel VBA、 別ブックの最終行...
-
セル色なしの行一括削除
-
Excelのハイパーリンクにマクロ...
-
エクセルVBAでコピーして順...
-
Excel2003 複数セル1列の入力済...
-
Excelで指定した日付から過去の...
-
マクロ セルの値に応じてセルに...
-
特定の文字を条件に行挿入とそ...
-
セルの数式を集計個数の変動に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
i=cells(Rows.Count, 1)とi=cel...
-
ExcelVBAを使って、値...
-
【Excel VBA】指定行以降をクリ...
-
特定のセルが空白だったら、そ...
-
EXCELで変数をペーストしたい
-
Excelで指定した日付から過去の...
-
VBAの間違い教えて下さい
-
【Excel】指定したセルの名前で...
-
Excelのプルダウンで2列分の情...
-
エクセルVBAでコピーして順...
-
Excel vbaで特定の文字以外が入...
-
Excel VBA、 別ブックの最終行...
-
【VBA】指定したセルと同じ値で...
-
特定の文字を条件に行挿入とそ...
-
TODAY()で設定したセルの日付...
-
screenupdatingが機能しなくて...
-
VBA初心者です。次のVBAコード...
-
指定した条件で行セルを非表示...
-
VBAでセルをクリックする回...
-
DataGridViewの各セル幅を自由...
おすすめ情報
回答ありがとうございます。
説明が悪く、申し訳ありません、
おっしゃる通り、(M列が参照結果によって:●)に
なっても、思った様にマクロが動作しないという事です。
ボタンを設置して、●の設定が
終わってから、最後にボタンクリックで動作させるでは、ダメでしょうか?
出来れば、M列を参照結果又はプルダウン選択にて
O24にそのまま表示させたいのですが、
現状のボタンを設置して、●の設定が
終わってから、最後にボタンクリックで動作させるでは、ダメでしょうか?
現状の「VBAコード」で設定不可能な場合は、
貴者のおっしゃる通りに「最後にボタンクリックで動作」で問題ありません。
よろしくお願いいたします。
尚、本日これからパソコンから離れてしまいますので、確認は明日の朝以降になります。
勝手申しますがよろしくお願いいたします。
おはようございます。
回答ありがとうございました。
ご指示の通りに
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に上手く表示が出いません、
申し訳ありません
解決方法をよろしくお願いいたします。