• ベストアンサー

Worksheet_SelectionChangeについて

Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim GYO As Long ' 8列目のみを対象とする If Target.Column <> 8 Then Exit Sub Else GYO = Target.Row End If ' 8列目が空欄でなければ計算処理を呼び出す(引数は選択行) If Cells(GYO, 8).Value = "" Then Exit Sub Else: Call KEISAN(GYO) End If End Sub という方法で8列目のセルをクリックするとフォームが立ち上がるようにしているのですが、ドラッグによる範囲選択でも8列目が含まれているとフォームが立ち上がってしまいます。 単一セルの選択時のみにするにはどうしたらいいでしょうか。 それとすべてのシートにこのマクロを書いているのですがworkbook全体でやることはできないのでしょうか? Workbookのところにこのコードを入れてもうまくいきませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

#1のja7awuさん、失礼します。 '#' 8列目のみを対象とする '#If Target.Column <> 8 Then この部分を、 If Target.Column <> 8 Or Target.Count > 1 Then 「Or」とすればよいと思います。排他的条件ですから、And ではないはずですね。 つまり、どこの列でも、Target.Count = 1 の時は、Exit Sub にならないのですから。

nanasupra
質問者

お礼

ありがとうございます。 単一セルの選択時のみになりました。

その他の回答 (2)

  • taocat
  • ベストアンサー率61% (191/310)
回答No.3

こんにちは。 既に回答は出てますが・・・。(^^;;; ワークブックのSheetSelectionChangeイベントに -------------------------------------------- Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)  Dim Gyo As Long  With Target    If .Count > 1 Then Exit Sub    If .Column <> 8 Or .Value = "" Then Exit Sub      Gyo = .Row      Call KEISAN(Gyo)  End With End Sub ------------------------------------------------ 変数Gyoがこれだけしか使用しないのであれば、変数Gyoは入りませんね。    Call KEISAN(.Row) また、KEISANの方でシート名も必要なら    Call KEISAN(Sh, Gyo) とかでしょうか。 以上です。

nanasupra
質問者

お礼

ありがとうございます。 ずいぶんシンプルにできるんですね。 GYOはモジュールで使いますのでこのままです。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.1

If Target.Count > 1 And Target.Column <> 8 Then のようにすればよいと思います。 > workbook全体でやることはできないのでしょうか? ThisWorkbookクラスのSheetSelectionChangeイベントに記述すればいいと思います。 つまり、 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) に記述します。 なお、どのシートからのイベントからは、引数 Sh で認識できます。 あと余分なことですが・・・ > Else: Call KEISAN(GYO) ここだけマルチステートメントですか。チョット体裁良くないのでは? Else   Call KEISAN(GYO) とした方が、読みやすいですよ。

nanasupra
質問者

お礼

ありがとございます。 体裁も重要ですね。 workbook単位でできました。

関連するQ&A

  • 「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つの内容が実行できないものでしょうか。 どうか、お知恵をお貸し下さい。

  • 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列に 表示し、それ以外の場合は何もいれないと言ったものです。 以前はできたんですが最近また入れるとできなくなっていました。 どこかおかしいとこありますでしょうか??

  • VBAでエラートラップがうまくいきません。

    VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Value = " " Then          ~コード~   END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   On Error GoTo エラー処理   If Target.Value = " " Then     On Error GoTo 0           ~コード~   END IF   EXIT SUB エラー処理:   EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。

  • Private Sub Worksheet_BeforeDoubleC

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 4 Then Target.Value = Date End If If Target.Column = 5 Then Target.Value = Date End If End Sub これは、他の方の回答で4列と5列のどこかをダブルクリックすると日付が入力されました。 しかし、シートの保護を入れるとダブルクリックしても入力されません。 それで、例えば、B3セルとかC3セルとかの特定のセルをダブルクリックすると日付が入力されるようにできませんか?宜しくお願いします。

  • SelectionChangeイベント 文字列エラ

    エクセルvbaなのですが セルをクリックしたときに、該当する値ならメッセージを表示させる際に Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = 1Then MsgBox "" End If End Sub ならエラーにならずに動くのに Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = "運賃" Then MsgBox "" End If End Sub のように文字列にすると、型が一致しません。 と言うエラーになります。 If Target.Value = "運賃" Then の時でも、空白セルや数値が入ったセルをクリックした際はエラーになりません。 どのような型にすればいいのでしょうか? 実際、「運賃」と言う値が入ってるセルをクリックしても同じエラーが発生します。

  • イベントを起こすと画面が揺れまくって大変です・・・結構見栄えもきついので回避できないでしょうか?

    以前ワークシートのイベントのプログラムを教えていただきありがとうございました。 参考に作ったプログラムなのですが・・・範囲をもう少しだけでかくしてやると画面がゆれて困っています。 値を入れてコピーしているときが特にひどいです。 複数セルを選択して消去しても大丈夫なようにかつ揺れない方法はないでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) Dim r As Range For Each r In Target MyProc r Next End Sub Sub MyProc(Target As Range) Dim i As Long Application.EnableEvents = False If Selection.Cells.Count <> 1 Then Exit Sub ' 変更したセルに値が入った場合条件成立 If Trim(Target.Value) <> "" Then ' 行番号が10以上65530以内のとき条件成立 If Target.Row >= 10 And Target.Row <= 65530 Then ' BCD列で、5の倍数の行のとき条件成立 If (Target.Column >= 2) And (Target.Column <= 4) Then If (Target.Row Mod 5) = 0 Then If Target.Value <> "" Then For i = 0 To 4 Target.Copy Target.Offset(i, 10).PasteSpecial Paste:=xlPasteValues Next If (Target.Column = 2) Then Worksheets("Sheet4").Range("A2:K6").Copy Target.Offset(5, -1) End If End If Else Exit Sub End If End If End If Application.CutCopyMode = False End If Application.EnableEvents = True End Sub

  • マクロの疑問

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address <> "A2" Then Range("A2").Select End If End Sub とすると、どのセルを選んでもA2に飛ぶのに、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "A3" Then Range("A2").Select End If End Sub とすると、A3を選んでも全く移動しないのはなぜでしょうか。 なにか落とし穴がありそうで。。。 よろしくお願いします。

  • 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 コードはこんな感じです。(動作確認済み) たしかに特定の文字列を察知してシートの色を変えることはできるんですが、今作成しているものは随時セルの中身が更新されるのです。 そこで、別の文字列が入力されたら(もしくは文字列が削除されたら)もとの白色に戻る、という処理はできますでしょうか。

  • SelectionChangeについて

    いろいろ調べながらエクセルのVBAを組んだのですが、どこに問題があるのかわかりません。よろしくお願いします。 セルA5を選択した場合ユーザーフォーム2を、セルO3を選択した場合ユーザーフォーム1を呼び出すためのVBAですが、どちらもユーザーフォームが呼び出されません。 どこが原因か教えていただけないでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(Target, Range("a5", "o3")) Is Nothing Then Exit Sub Cancel = True Select Case Target.Address Case "$A$5" UserForm2.Show Case "$O$3" UserForm1.Show End Select End Sub

  • 複数のセルを選択しているかを取得するプロパティは?

    SelectionChangeイベントで 複数のセルを選択しているかを取得するプロパティってないのでしょうか? 今は、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Len(Target.Address) > 5 Then MsgBox "複数のセルが選択されています" End If End Sub こうしていますが、行数が多くなると文字も多くなってしまうので、このコードでは対応できません。 Rangeオブジェクトに何個セルが入ってるかを知る方法はありますか? ウォッチのTargetのcellsを見ても、どう見ればいいのかわかりません

専門家に質問してみよう