- 締切済み
ダブルクリックイベントの質問です。2010
特定のセルをダブルクリックすると 現在時刻を 表示するコードがあります。 特定の セル以上で その機能が 無効になります。 原因は なんでしょうか?以下 そのコードです。 Private Sub worksheet_beforedoubleclick(ByVal Target As Excel.Range, cancel As Boolean) If Not Application.Intersect(Target, Range("d8:d9,h8:h9,l8:l9,l8:l9,p8:p9,r8:r9,t8:t9,x8:x9,ab8:ab9,af8:af9,aj8:aj9,an8:an9,ar8:ar9,av8:av9,d57:d58,h57:h58,l57:l58,p57:p58,r57:r58,t57:t58,x57:x58,ab57:ab58,af57:af58,aj57:aj58,an57:an58,ar57:ar58,av57:av58,d106:d107,h106:h107,l106:l107,p106:p107")) Is Nothing Then If Target = "" Then Target = Time cancel = True End If End If End Sub 以上です。 ちなみに ,106:l107,p106:p107のあとに ,T106:T107 を 追加 しますと 実行時エラー1004 Range メソッドは失敗しました。Worksheet オブジェクト と 表示され エラー と 表示されました。 よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kagakusuki
- ベストアンサー率51% (2610/5101)
回答No.2です。 失礼しました、私のパソコンで ,T106:T107 を追加してもエラーとはならなかったのは、 Range("d8:d9,h8:h9,l8:l9,l8:l9,p8:p9,r8:r9,t8:t9,x8:x9,ab8:ab9,af8:af9,aj8:aj9,an8:an9,ar8:ar9,av8:av9,d57:d58,h57:h58,l57:l58,p57:p58,r57:r58,t57:t58,x57:x58,ab57:ab58,af57:af58,aj57:aj58,an57:an58,ar57:ar58,av57:av58,d106:d107,h106:h107,l106:l107,p106:p107") の中に ,l8:l9,l8:l9 という重複して指定している箇所がありましたので、 ,l8:l9 を一つ削除して、 Range("d8:d9,h8:h9,l8:l9,p8:p9,r8:r9,t8:t9,x8:x9,ab8:ab9,af8:af9,aj8:aj9,an8:an9,ar8:ar9,av8:av9,d57:d58,h57:h58,l57:l58,p57:p58,r57:r58,t57:t58,x57:x58,ab57:ab58,af57:af58,aj57:aj58,an57:an58,ar57:ar58,av57:av58,d106:d107,h106:h107,l106:l107,p106:p107,T106:T107") としていたため、255文字を超えていなかったからの様です。 回答No.1様の御回答を拝見した後で ,x106:x107 を追加して Range("d8:d9,h8:h9,l8:l9,p8:p9,r8:r9,t8:t9,x8:x9,ab8:ab9,af8:af9,aj8:aj9,an8:an9,ar8:ar9,av8:av9,d57:d58,h57:h58,l57:l58,p57:p58,r57:r58,t57:t58,x57:x58,ab57:ab58,af57:af58,aj57:aj58,an57:an58,ar57:ar58,av57:av58,d106:d107,h106:h107,l106:l107,p106:p107,T106:T107,x106:x107") としました処、仰る様に 実行時エラー1004 Range メソッドは失敗しました。Worksheet オブジェクト というエラーが表示されました。
- kagakusuki
- ベストアンサー率51% (2610/5101)
御質問文中にあるVBAをコピー&ペーストで適当なシートモジュールに入力してみましたが、私のパソコンでは ,106:l107,p106:p107 の後に ,T106:T107 を追加した上で、T106セルやT107セル等をダブルクリックしてみましてもエラーとはならず、正常に時刻が入力されました。 そこで、 ,T106:T107 の所の中の「:」(コロン)を「;」(セミコロン)に変えて、 ,T106;T107 としました処、仰る様な 実行時エラー1004 Range メソッドは失敗しました。Worksheet オブジェクト というエラーが表示されました。 従って、断言は出来かねますが、おそらく質問者様がVBAの構文を入力された際に入力ミスで間違った文字を入力されたのではないかと思います。 後、余談になりますが、 ,T106:T107 の後にも時刻を入力したいセル範囲が存在していて、106、107行目に関してもAV列まで同じパターンで続いているのであれば、一々、セル範囲のアドレスを記述せずとも、以下の様にされては如何でしょうか? Private Sub worksheet_beforedoubleclick(ByVal Target As Excel.Range, cancel As Boolean) Dim myBoolean As Boolean Dim i, j, myColumn As Long myBoolean = True For i = 8 To 106 Step 49 myColumn = 18 GoSub label For j = 4 To 48 Step 4 myColumn = j GoSub label Next j Next i If Target = "" And Not myBoolean Then Target.Value = Time Exit Sub label: If myBoolean Then myBoolean = Application.Intersect(Target, Cells(i, myColumn).Resize(2)) Is Nothing Return End Sub
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 説明が前後しますが、 > ちなみに ,106:l107,p106:p107のあとに > ,T106:T107 を 追加 しますと > 実行時エラー1004 > Range メソッドは失敗しました。Worksheet オブジェクト と 表示され エラー と 表示されました。 この点については、 Rangeの引数に指定できる セル範囲を参照する 参照文字列 の文字長 上限 255文字を超える場合に発生するエラーです。 255文字を超えないように参照文字列の書き方を以下、提示します。 ' ' /// RE:w8970377 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) Const S_REF = "(D:D,H:H,L:L,P:P,R:R,T:T,X:X,AB:AB,AF:AF,AJ:AJ,AN:AN,AR:AR,AV:AV) (8:9,57:58,106:107)" If Application.Intersect(Target, Range(S_REF)) Is Nothing Then Exit Sub If Not IsEmpty(Target(1)) Then Exit Sub Target = Time Cancel = True End Sub ' ' /// 対象とするセル範囲が、格子状に並んでいるという想定で、 ご提示の記述から拡大解釈したものでお答えしています。 忠実に再現するなら、 Const S_REF = "(D:D,H:H,L:L,P:P,R:R,T:T,X:X,AB:AB,AF:AF,AJ:AJ,AN:AN,AR:AR,AV:AV) (8:9,57:58)" _ & ",(D:D,H:H,L:L) (106:107)" "ちなみに...追加..."するなら Const S_REF = "(D:D,H:H,L:L,P:P,R:R,T:T,X:X,AB:AB,AF:AF,AJ:AJ,AN:AN,AR:AR,AV:AV) (8:9,57:58)" _ & ",(D:D,H:H,L:L,T:T) (106:107)" のような書き方になります。 ご指摘のエラーの原因を排除する為には、 '参照文字列 の文字長'を MsgBox Len(S_REF) 255文字以内に収まるように指定する、ということになります。 どれだけ最適化した参照方法を選んでも、255文字を超えてしまう場合、 への対策としては、'セル範囲を参照する 参照文字列'に依存する方法を避け、 基本通りに'列位置''行位置'のそれぞれで条件分岐するのが、 結果的にも、無駄なく、簡潔に書け、他人にも理解され易い、 、、、記述になるかと思います。 以下、'列位置''行位置'で条件分岐する例。(格子状に並んでいる場合) ' ' /// RE:w8970377_a Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) Select Case Target.Column Case 4, 8, 12, 16, 18, 20, 24, 28, 32, 36, 40, 44, 48 Case Else: Exit Sub End Select Select Case Target.Row Case 8 To 9, 57 To 58, 106 To 107 Case Else: Exit Sub End Select If Not IsEmpty(Target(1)) Then Exit Sub Target = Time Cancel = True End Sub ' ' /// 最初の質問点ですが、 > 特定の セル以上で その機能が 無効になります。 > 原因は なんでしょうか?以下 そのコードです。 すみません、"セル以上で"、という意味を、察することが出来ませんでした。 "以上"という単語を抜いて読み下したとして、お応えしますが、 可能性として考えないといけないのは、 ダブルクリックしているつもりが、実際にはダブルクリックされていない。 ということです。 ダブルクリックする→期待したように時刻設定が出来ない という処までは状況が説明されていますが、 その時、セルは[入力]モードに切り替わっているのでしょうか? Excel画面左下、ステータスバーに、[入力]と表示されているならば、 それは、確かにダブルクリックされているのに、 BeforeDoubleClickが期待した動作をしていない、ということになります。 ステータスバーが[コマンド]のままだったならば、 それは、実際にはダブルクリックされていない、ということになります。 さしあたり、 ご提示の記述だけを見た限りでは、 指定しているセル範囲をダブルクリックした場合の日付設定は、 (#ダブルクリックしたセル が 空白だった場合#) 正しく実行される内容になっています。 '確かにダブルクリックされているのに'うまく行かないのだとすると、 (こちらが想定できない未知の状況が原因かも知れませんが、、、) 同じシートに Worksheet_SelectionChange イベント が書かれていて、そちらの処理内容の影響を受けている、可能性なども 一応、確認した方が良いでしょう。 今の処、与えられた情報を基に考えられたのは、以上になります。 もし何か思い当たることでも出てきて、補足があれば、また考えてみます。
お礼
realbeatinさん 長文の回答ありがとうございます。 >Rangeの引数に指定できる セル範囲を参照する 参照文字列 の文字長 上限 255文字を超える場合に発生するエラーです。 なんらかの制限が あるとは おもいましたが、そういう理由でしたか? ありがとうございます。 いろいろなパターンで 解説していただきありがとうございます。 なお > 特定の セル以上で その機能が 無効になります。 > 原因は なんでしょうか? は 誤解を与える文章になってしまいましたが、,T106:T107 を 追加 しますとと 同じ意味です。すみません。言葉がたりませんでした。 なお コードの説明で ちなみに ,106:l107,p106:p107のあとに で 107, 正しく 余計なものを 入力していていました。以後 気おつけます。 タブルクリックイベントでの うまく機能しない原因についても 詳細に 回答していただきまして ありがとうございます。 回答して いただいたコードで 無事思い通りの事が できました。 なお 詳細に回答していただいた内容について 理解できるように 努めたいとおもいます。 今回は、長文の詳細な回答ありがとうございます。
お礼
kagakusukiさん 回答していただき 大変ありがとうございました。 以後、理解に努めたいと おもいます。 今回は、大変ありがとうございました。