
お世話になります。
複数行にわたって選択しているときに実行するとエラーメッセージを出したいとします。現状では、
If Selection.Rows.Count <> 1 Then
subMsgBox "You are selecting two or more rows"
Exit Sub
End If
としていますが、これではドラッグで連続した行を選択している場合には正しくエラーになりますが、Ctrlクリックでポンポンと飛ばし飛ばしクリックしている場合はエラーになりません。
If Selection.Cells.Count <> 1 Then
だと同じ行の複数個所を選んだ場合もエラーになってしまいます。
If Selection.Cells.EntireRow.Count <> 1 Then
If Selection.Cells.EntireRow.Rows.Count <> 1 Then
でもCtrl+クリックの場合にダメです。
どうしたらいいでしょうか。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
'MSDNライブラリのApplication.SelectionがObjectで
'つなげられるプロパティが書かれていないってのは問題があると思う。
'いくつかのサイトではAreasというプロパティがあると
'述べていたのでそれを使って自力で実装した
Option Explicit
Sub hoge()
Dim x As Collection
Dim i As Range
Dim j As Object 'Cell型がないようなので
Dim k As Integer
Dim flag As Boolean
Set x = New Collection
For Each i In Selection.Areas '1から始まるらしい
For Each j In i.Cells
If Not CollectionhasItem(x, j.Row) Then
x.Add (j.Row)
End If
Next j
Next
If x.Count > 1 Then
MsgBox ("You selected more than 2 rows")
End If
End Sub
Function CollectionhasItem(ByRef c As Collection, ByVal v As Integer)
Dim i As Integer
'For Each i In c ' For Each i in cってかけないらしい
'GenericsのあるVB.NETならともかく
For i = 1 To c.Count
If c(i) = v Then
CollectionhasItem = True
Exit Function
End If
Next
CollectionhasItem = False
End Function
No.2
- 回答日時:
こんなんでどうすか
Sub test()
Dim TempRG As Range
Dim TempRow As Long
TempRow = Selection.Row
'選択しているセルのアドレスをRangeで包んでループ
For Each TempRG In Range(Selection.Address)
If TempRG.Row <> TempRow Then
MsgBox "You are selecting two or more rows"
Exit Sub
End If
Next
End Sub
みなさん、回答ありがとうございます。
マッチポンプですみません、過去の質問の回答を眺めていたらこれでいしのげそうな気がします。
If Intersect(Selection.Cells.EntireRow, 1).Count <> 1 Then
MsgBox "You are selecting two or more rows"
Exit Sub
End If
みなさんのコードも研究します。
ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
String""から型'Double'への変...
-
お助けください!VBAのファイル...
-
UserForm1.Showでエラーになり...
-
【VBA】ワークブックを開く時に...
-
ACCESSで値を代入できないとは?
-
文字列内で括弧を使うには
-
VB.NETでMessageBoxが表示され...
-
ADO 「認証に失敗しました」
-
Findプロパティを取得できません
-
現在、QueryTableが設定されて...
-
ApplicationとWorksheetFunctio...
-
VBA データ(特定値)のある最...
-
Access クリップボードにデータ...
-
エクセル関数式=ABSで#VALUE!...
-
【Access】Excelインポート時に...
-
VBAで変数を含むSQL文を使用し...
-
【エクセル】UserFormで作った...
-
Nullの使い方が不正ですのエラ...
-
ExecuteNonQueryメソッドの戻り値
-
VB6でEndステートメントに変わ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
【VBA】ワークブックを開く時に...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
実行時エラー 438 の解決策をお...
-
マクロで"#N/A"のエラー行を削...
-
文字列内で括弧を使うには
-
レコード登録時に「演算子があ...
-
【Access】Excelインポート時に...
-
インポート時のエラー「データ...
-
Filter関数を用いた結果、何も...
-
ApplicationとWorksheetFunctio...
-
On ErrorでエラーNoが0
-
Excel vbaについての質問
-
ACCESSで値を代入できないとは?
-
VBA データ(特定値)のある最...
-
【VBAエラー】Nextに対するFor...
-
「実行時エラー '3167' レコー...
-
実行時エラー'-2147467259(8000...
おすすめ情報