![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
Excel2007
VBAにてWorksheet_BeforeRightClickを使用しています。
列セル(行セル)の全選択をして、右クリックでセルの書式設定を一括で出来ますが、
BeforeRightClickに引っかかってしまいます。
そこで、セル以外を選択されているかを調べる方法はあるのでしょうか?
Target.Addressも試しました。
これだと、セル以外を選択時「$D:$D」、1つのセル選択時「$D2」などと返って来ます。
前者は数字が含まれていませんので特定のセルではありませんが、
列位置によっては文字数が変わってしまいます。
後者はセルを指定されている時ですが、範囲ではありません。
説明が分かりにくいかも知れませんが、
列セルの全選択時はBeforeRightClickを無視、
1つのセル選択時はセルの行位置を取得、
複数のセル選択時は選択セルの開始行位置を取得したい訳です。
どなたか御存知でしたら教えて下さい。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
こんな感じで如何でしょうか。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Selection.Rows.Count = Cells.Rows.Count Or _
Selection.Columns.Count = Cells.Columns.Count Then
Cancel = True
Else
MsgBox "列 Or 行 選択状態以外で右クリックされました。"
End If
End Sub
直接比較だけなんですね。
VBなら、基本的な部分は理解出来るのですが(仕事で)
VBAは今回初めてなので、なかなか難しいところがあります。
似た言語でも環境が違うと全く別物です。
まぁ、仕事とはいっても今回のエクセルは社内用なので適当です(^^;;
元々、誰かが作ったマクロがあったのですが、
全てのセルにマクロが埋め込まれていて、キー操作毎にマクロが走るため、
動作が異様に遅いという欠点がありました。
(数千セル以上にマクロがある)
そこで、勉強も兼ねてマクロを変更しようと試みたのですが、
とてもとても、さわれるものではないと分かり、
これなら1から作る方が早いと考え、VBかVBAか悩んだあげく、
エクセルなら全てのマシンに入っているのでVBAで組み上げる事にした訳です。
もっともっと努力しないと駄目ですね。
ありがとうございました。
No.4
- 回答日時:
こんにちは。
> 複数のセル選択時は選択セルの開始行位置を取得したい訳です。
例えば、A5:C10, D1:D5, F15:F20 などと複数のセル範囲が選択されている
ときに、右クリックされた場合の開始行とは?
開始行の定義によって返すべき行番号は異なりますよ。この辺も考慮して
みて下さい。
# もう一例) A5:A10、C:C のときは?
察するに、Target.Areas.Count > 1 の場合は終了させてしまえば、
・ひとつのセルを選択している時
・ひとつのセル範囲(例:A1:C10)を選択している時
ともに、Target.Cells(1).Row で先頭セルの行番号は取得できます。
こんな感じ。IF のネストが深くなるのでベタ書きです。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
' // 終了条件::
If Target.Areas.Count > 1 Then Exit Sub
If Target.Rows.Count = Me.Rows.Count Then Exit Sub
If Target.Columns.Count = Me.Columns.Count Then Exit Sub
' // メインとなる処理
MsgBox Target.Cells(1).Row
End Sub
>例えば、A5:C10, D1:D5, F15:F20 などと複数のセル範囲が選択されているときに、
>右クリックされた場合の開始行とは?
離れたセルの複数範囲選択は今のところ考えていません。
(最終的には機能として利用したいところですが)
列は関係なく、必要な情報としては行だけです。
あくまで連続したセルを指定するだけです。
1行に必要とする複数のデータを書き込んで別シートにコピーするだけの動作です。
例えば、範囲指定をD8:D19としてもA8:M19としても、
取得する情報は「開始:8行」「終了:19行」となります。
入力側のシートは1行ですが、コピー先は複数行ありますので、
入力側の現在セル位置情報(行のみの値)を元に計算でコピー先セルに複写しています。
この計算(基準+オフセット)が面倒でした(^^;;
>こんな感じ。IF のネストが深くなるのでベタ書きです。
なるほど、単純に比較だけと考えれば良い訳ですね。
「小さい」か「同じ」だけだとは・・・
参考にさせて頂きます。
ありがとうございました。
No.3
- 回答日時:
回答ではないのでなんですが。
。VBAに馴染みのない質問者にはちょっぴりためになるかも。(^^;;;
'----------------------------------------------
Sub test()
Dim Absolute_Reference
Dim Relative_Reference
Absolute_Reference = Selection.Address
Relative_Reference = Selection.Address(False, False)
MsgBox Absolute_Reference & " @ " & Relative_Reference
End Sub
'---------------------------------------------
以上。
範囲選択については「Selection.Cells.Address」から文字列を分解して開始、終了アドレスを取得していますが、
こんなに短いコードで同じ事が出来るのですね。
ホント、もの凄く「ため」になりました。
ありがとうございました。
No.1
- 回答日時:
InStr() 関数で単一セルか範囲が選択されているのかを確認し、範囲であれば Split() 関数を使って分割。
$D:$D → [:] の前後の文字 [$D] と [$D] が一致したら BeforeRightClick を終了する。
そうでなければ開始アドレスを取得する。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim tmp As Variant
Dim ADR As Range
Set ADR = Target
If InStr(Selection.Address, ":") > 0 Then
tmp = Split(Selection.Address, ":")
On Error Resume Next
If tmp(0) = tmp(1) Then
Exit Sub
Else
Set ADR = Range(tmp(0))
End If
End If
Cancel = True '右クリックメニューの抑止
'MsgBox ADR.Address
MsgBox ADR.Row
End Sub
標準モジュールで似た事をしている部分があります。
えらく長ったらしいコードになっていますが(^^;;
このコード量で行アドレスが取得出来るのですね。
よく考えられていると感心しました。
参考にさせて頂きます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Excel(エクセル) 余計なお世話的な「入力規則」?対策は? 2 2023/01/14 12:39
- Excel(エクセル) エクセルでシート保護のかかり方の違いとセルの非保護の設定 3 2022/08/09 10:02
- Excel(エクセル) excelで可視セルのみ置換 3 2022/08/04 11:02
- Excel(エクセル) エクセルについて教えてください。 2 2023/06/14 11:11
- Excel(エクセル) エクセルの数式で教えてください。 1 2022/10/25 09:26
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/02 10:20
- Excel(エクセル) Excelにの以下の設定方法について教えてください! C列にデータ入力の設定をしています。(出、入を 3 2022/06/22 01:33
- Excel(エクセル) ユーザー定義について質問です。 2 2023/06/28 13:21
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【エクセル】IF関数 Aまたは...
-
エクセル 足して割る
-
エクセルで指定したセルのどれ...
-
エクセルの一つのセルに複数の...
-
Excelで数式内の文字色を一部だ...
-
貼り付けで複数セルに貼り付けたい
-
Excel 例A(1+9) のように番地の...
-
セルをクリック⇒そのセルに入力...
-
セルの高さ(行高)を求めるには?
-
複数のセルのいずれかに数字が...
-
エクセルで住所と建物名を分け...
-
エクセル “13ヶ月”を“1年1ヶ月...
-
(Excel)数字記入セルの数値の後...
-
【Excel】 セルの色での判断は...
-
エクセル オートフィルタで絞...
-
数式を残したまま、別のセルに...
-
excelの特定のセルの隣のセル指...
-
Excelでのコメント表示位置
-
対象セル内(複数)が埋まった...
-
EXCEL VBA セルに既に入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで指定したセルのどれ...
-
【エクセル】IF関数 Aまたは...
-
セルをクリック⇒そのセルに入力...
-
Excelで数式内の文字色を一部だ...
-
エクセル 足して割る
-
対象セル内(複数)が埋まった...
-
貼り付けで複数セルに貼り付けたい
-
Excelでのコメント表示位置
-
エクセルのセルの枠を超えて文...
-
エクセル オートフィルタで絞...
-
エクセルの一つのセルに複数の...
-
EXCEL VBA セルに既に入...
-
【Excel】 セルの色での判断は...
-
(Excel)数字記入セルの数値の後...
-
エクセル “13ヶ月”を“1年1ヶ月...
-
excelのCOUNTIF関数で、『範囲=...
-
Excel2003 の『コメント』の編...
-
枠に収まらない文字を非表示に...
-
Excelで住所を2つ(町名迄と番...
-
複数のセルのいずれかに数字が...
おすすめ情報