• 締切済み

「Worksheet_Change」で2つの操作を

お世話になります。 当方、エクセルの超初心者です。 仕事で、ある作業表の作成を任されたのですが、一部が思い通りに動作しません。 最初は「例1」のような記述によりエラーしました。 【例1】 Private Sub Worksheet_Change(ByVal Target As Range) (内容1) End Sub Private Sub Worksheet_Change(ByVal Target As Range) (内容2) End Sub その後、過去の回答にあった類似案件を参考に「例2」のように書き換えましたが、 実行されるのは1つ目のみで、2つ目の内容は無視され、困っております。 【例2】 Private Sub Worksheet_Change(ByVal Target As Range) (内容1) (内容2) End Sub ちなみに実データは以下の通りです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Count <> 1 Then Exit Sub If Intersect(Target, Range("k6:k55")) Is Nothing Then Exit Sub If Target.Value = "" Then Target.Value = "○" Else Target.Value = "" If Target.Count <> 1 Then Exit Sub If Target.Column <> 2 Then Exit Sub If Target.Row < 6 Or Target.Row > 45 Then Exit Sub Call ShowCalendarFromRange2(Target) End If End Sub 見様見真似で作ったため、恥ずかしながら基本が全く理解できていません。 恐らく簡単なミスだと思うのですが、自力では解決方法を探し出せませんでした。 何とか2つの内容が実行できないものでしょうか。 どうか、お知恵をお貸し下さい。

みんなの回答

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

No.1です。 やっぱりEnd Ifが適切な位置に足りませんね。 それと補足の内容だと逆になりませんか? 説明文の内容で書き直した例を提示しますのでご確認ください。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim RT ' 複数セル選択時は無視 If Target.Count <> 1 Then '共通_Start ' 選択セル範囲の確認 If Intersect(Target, Range("B6:B55")) Is Nothing Then If Intersect(Target, Range("K6:K55")) Is Nothing Then RT = 0 '範囲外 Else RT = 2 'K6-K55 内容2実行フラグOn End If RT = 1 'B6-B55 内容1実行フラグOn End If Select Case RT Case 1 '内容1実行 Call ShowCalendarFromRange2(Target) Case 2 '内容2実行 If Target.Value = "" Then Target.Value = "○" Else Target.Value = "" End If End Select End If '共通_End End Sub

hatena-monkey
質問者

補足

mshr1962さま 忙しい早朝にご対応頂いたようで申し訳ありません。 とりあえず書き直して頂いた例文をそのままコピペしてみました。 結果から申しますと、エラーはしなくなったが、予期せぬ結果が出ます。 具体的に言うと (1)「内容1」は指定域の「B6:B55」ではカレンダーフォームが起動されない。一部には起動するセルも (2)「内容2」は指定域の「K6:K55」を含め、どのセルもクリックによる○表示のオン、オフが利かない といった状態です。 もしかして1つのWorksheet_SelectionChangeで複数の処理することは無理なのでしょうか。 取り急ぎご報告まで。

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.1

内容1と内容2を別々に表示しないとどこから区分するか難しいです。 内容からすると Exit Sub でサブルーチンから抜けてマクロ終了してるのが原因だと思います。 あとは内容1と内容2が同時にあるのか否かです。 同時の場合は If 共通条件 Then If 条件1 Then 内容1 End If '条件1の終了 If 条件2 Then 内容2 End If '条件2の終了 End If '共通条件の終了 同時がない場合は If 共通条件 Then If 条件1 Then 内容1 Else If 条件2 Then 内容2 End If '条件2の終了 End If '条件1の終了 End If '共通条件の終了 このようにElseとEnd Ifの使い方が変わってきます。

hatena-monkey
質問者

補足

mshr1962さま 早速のご回答ありがとうございました。 他の仕事でご連絡が遅れ、申し訳ありません。 恐らく頂いたアドバイスで解決できるレベルのものと思われますが、 あれこれ試しても、基本が理解できていないせいか、希望する動作には至りません。 要するにやりたいことは、同一シートで2つあり、 「内容1」では、B6~B55のセルをクリックすると入力用のカレンダーフォームが起動 「内容2」では、K6~K55のセルでクリックした際、空欄なら「○」を入れ、 逆に入っていた場合には「空欄」にする という処理で、いずれも個別では実現を確認しております。 今回、回答頂いた中で「同時の場合」「同時がない場合」という意味が今ひとつ不明でした。 たぶん自分がやろうとしていることは後者だと思うのですが、それすらも自信がありません。 参考までに現在の最新データをお送りします。 可能であれば、再度、添削頂けないでしょうか。 <最新データ> Private Sub Worksheet_SelectionChange(ByVal Target As Range)   ' 「内容1」スタート ' 複数セル選択時は無視 If Target.Count <> 1 Then ' セルB6~B55以外の選択時は無視 If Intersect(Target, Range("B6:B55")) Is Nothing Then ' カレンダーフォームを起動する Call ShowCalendarFromRange2(Target)   ' 「内容2」スタート ' 複数セル選択時は無視 If Target.Count <> 1 Then ' セルK6~K55以外の選択時は無視 If Intersect(Target, Range("K6:K55")) Is Nothing Then ' クリックしたセルが空欄なら"○"を入力 If Target.Value = "" Then Target.Value = "○" ' クリックしたセルが"○"なら空欄に変更 Else Target.Value = "" End If End Sub 以上です。 あと、これを機にマクロを勉強する際、お奨めのサイトや書籍があればお教え下さい。 よろしくお願い致します。

関連するQ&A

  • WorkSheet_Changeを2つ反映させる

     下記のコードをWorkSheetで2つ反映させるにはどうしたらいいでしょうか?どちらか一つなら反映するのはわかりますが、どう名前を変更すればいいのかお教え願えませんでしょうか? windows7・SP1 Office2010 Private Sub WorkSheet_Change(ByVal Target As Range) If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub '検査範囲 Application.EnableEvents = False '再帰実行の停止 If Range("C1").Value <> Sheets("祝祭日").Range("A1").Value Then MsgBox ("祝日の設定を反映するため年度を同じにしてください。") End If Application.EnableEvents = True End Sub Private Sub WorkSheet_Change(ByVal Target As Range) Dim MyRow As Long Dim MyCol As Integer MyRow = Target.Row MyCol = Target.Column With Worksheets("メイン・1").Select If MyRow = 1 And MyCol = 7 Then If Target = 4 Then 'または If Target = 1 Then メインデータの復元 '動かしたいマクロ名 End If End If End With End Sub

  • VBA/Worksheet_Changeがうまくいかない

    エクセル2000です。 以下のワークシートチェンジイベントがうまくいきません。 Targetに値が入る場合は問題ないのですが、TargetをクリアしてもRange("F5").MergeAreaがクリアされません。 Targetをクリアした後、TargetをダブルクリックしてからEnterキーを押せばRange("F5").MergeAreaがクリアされるのですが、いちいちそうさせるわけにもいきません。 どうしたらよいのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$C$5" Then Exit Sub If Target.Value <> "" Then Range("F5").Value = Range("D42").Value Else Range("F5").MergeArea.ClearContents End If End Sub

  • Worksheet_Changeが動かない

    エクセル自動実行のマクロを作成中にうまく動かないので サンプルをコピーして、変更してみたのですが そのサンプルも動いません、マクロとは違う何か悪いのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Dim intColor As Integer If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("B2:B11")) Is Nothing Then Exit Sub Select Case Target.Value Case Is <= 20 intColor = 3 Case 21 To 40 intColor = 46 Case 41 To 60 intColor = 9 Case 61 To 80 intColor = 10 Case Is > 80 intColor = 5 End Select Target.Font.ColorIndex = intColor Application.EnableEvents = True End Sub

  • Excelのworksheetどこ間違えてますか?

    Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1:A65536")) Is Nothing Then Exit Sub If 0 < Target.Value And Target.Value < 6 Then Target.Offset(0, 1).Value = Format(Time, "h時m分s秒") Else Target.Offset(0, 1).Value = "" End If End Sub 以前、このサイトで教えてもらったワークシートのプログラムです。 簡単に言えばA列に1から5までの値を入れれば現在時間をB列に 表示し、それ以外の場合は何もいれないと言ったものです。 以前はできたんですが最近また入れるとできなくなっていました。 どこかおかしいとこありますでしょうか??

  • linkとWorksheet_Change

    LINK してあるセルを ターゲットにして Worksheet_Change をとっても 反応しない。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$B$2" Then Exit Sub   Msg = MsgBox("bが変更されました。", vbOKCancel)   tensou この$B$2は 他の部分からデータを得ています。時間でこのセルの値が自動で変化するのですが Worksheet_Change 起きないのか、捉えられないのか、分かりかねますが その下$B$3に =$B$2 もしくは =Value($B$2) で 飛ばして Target.Address <> "$B$3"にしても 同じ。 このLINKした セルの Worksheet_Change イベントを ひらう方法を お教え願えませんでしょうか IF 分を =で置き換えても同じでした。

  • エクセルVBAの記述法(Worksheet_Changeで)

    入力があればセルが黄色のなり、入力がなければ無色とするマクロです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Value <> "" Then Target.Interior.ColorIndex = 6 Else Target.Interior.ColorIndex = xlNone End If End Sub このように書くと、通常は正しく動きますが、ドラッグした場合や、複数セルを一度にクリアした場合、エラーになってしまいます。 ただしく作動させるにはどう直せばいいのでしょうか?

  • エクセルのマクロ

    セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub

  • WorkSheet _Change について

    いつもお世話になっています。 今、セルにある特定の文字列が入力されたら、セルの色を変えるという処理を作成しています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim sTitle As String sTitle = Target.Value If sTitle = "aaa" Then Target.Interior.ColorIndex = 16 End If End Sub コードはこんな感じです。(動作確認済み) たしかに特定の文字列を察知してシートの色を変えることはできるんですが、今作成しているものは随時セルの中身が更新されるのです。 そこで、別の文字列が入力されたら(もしくは文字列が削除されたら)もとの白色に戻る、という処理はできますでしょうか。

  • Worksheet_changeイベントが動作しない

    Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$D$224" If Target.Value = "" Then Range("D224").Value = "-" End If End Select End Sub DeleteキーでD224をクリアした場合、D224に"-"が入力されません。 D224はD225と結合してあります。 select~caseを使ってdeleteキーで"-"が入力されるような動作を教えてください・・よろしくおねがいします。。。

  • こんばんは、watabe007さん。

    961awaawaです。 >シートモジュールに貼り付けてお試しください。 Private Sub Worksheet_Change(ByVal Target As Range) With Target If Intersect(.Cells, Range("L:M")) Is Nothing Then Exit Sub If .Row < 3 Or .Value = "" Then Exit Sub If Not IsNumeric(.Value) Then Exit Sub .Offset(, 3).Value = Cells(.Row, .Value).Value End With End Sub というソースを作って頂いたのですが、既に各sheetにprivate sub からなるソースが入ってましてコンパイルエラー(名前が適切ではありません Worksheet_Change)となります。他に方法等頂けましたらありがたいです。

専門家に質問してみよう