• 締切済み

ダブルクリックイベントの質問です。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 オブジェクト と 表示され エラー と 表示されました。 よろしくお願いします

みんなの回答

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 回答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 オブジェクト というエラーが表示されました。

reo9546
質問者

お礼

kagakusukiさん 回答していただき 大変ありがとうございました。 以後、理解に努めたいと おもいます。 今回は、大変ありがとうございました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 御質問文中にある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

回答No.1

こんにちは。 説明が前後しますが、 > ちなみに ,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 イベント が書かれていて、そちらの処理内容の影響を受けている、可能性なども 一応、確認した方が良いでしょう。 今の処、与えられた情報を基に考えられたのは、以上になります。 もし何か思い当たることでも出てきて、補足があれば、また考えてみます。

reo9546
質問者

お礼

realbeatinさん 長文の回答ありがとうございます。 >Rangeの引数に指定できる セル範囲を参照する 参照文字列 の文字長 上限 255文字を超える場合に発生するエラーです。 なんらかの制限が あるとは おもいましたが、そういう理由でしたか? ありがとうございます。 いろいろなパターンで 解説していただきありがとうございます。 なお > 特定の セル以上で その機能が 無効になります。 > 原因は なんでしょうか? は 誤解を与える文章になってしまいましたが、,T106:T107 を 追加 しますとと 同じ意味です。すみません。言葉がたりませんでした。 なお コードの説明で ちなみに ,106:l107,p106:p107のあとに で  107, 正しく 余計なものを 入力していていました。以後 気おつけます。 タブルクリックイベントでの うまく機能しない原因についても 詳細に 回答していただきまして ありがとうございます。 回答して いただいたコードで 無事思い通りの事が できました。 なお 詳細に回答していただいた内容について 理解できるように 努めたいとおもいます。 今回は、長文の詳細な回答ありがとうございます。

関連するQ&A

  • EXCELのセルの参照(関数)について

    よろしくお願いします。 セル(A1)~(AZ)の範囲における(AZ),(AV),(AR),(AN),(AJ),(AF),(AB),(X),(T),(P),(L),(H),(D)の各セルに文字列が入っている (または入っていない)場合で(BA)に「もし(AZ)が入力されていたら(AZ)の値を表示、もし(AZ)がブランクなら(AV)の値を表示、もし(AV)がブランクなら(AR)の値を表示、もし(AR)がブランクなら(AN)の値を表示・・・・」といった具合で関数を作成したいです。また(AZ),(AV),(AR),(AN),(AJ),(AF),(AB),(X),(T),(P),(L),(H),(D)のセルで穴あき状態で入力されていた場合は最も(AZ)寄りのセルを表示させたいです。 EXCEL2003で作成するいい方法はありますでしょうか?

  • 複数のダブルクリックイベントを同一シートで

    以前 質問して回答をいただいたシートで他のダブルクリックイベントを記述したいのですが・・・ 単独だと できるようですが 複数できるようにしたいのですが エクセル2010です。 >http://okwave.jp/qa/q7230128.html A1:N1 のセルをダブルクリックしたら 色が黄色 また ダブルクリックしたら 色なし 教えをうけたマクロコードが 以下です。 ダブルクリックイベント その1 Private Sub worksheet_beforedoubleclick(ByVal Target As Excel.Range, cancel As Boolean) If Application.Intersect(Target, Range("A1:N1")) Is Nothing Then Exit Sub If Target.Interior.ColorIndex = xlNone Then Target.Interior.Color = vbYellow Else Target.Interior.ColorIndex = xlNone End If cancel = True End Sub ダブルクリックイベントその2 J8:J9,L8:L9,N8:N9,P8:P9,R8:R9,T8:T9,V8:V9,J29:J30,L29:L30,N29:N30,P29:P30,R29:R30 上の セルをダブルクリックしたら 現在時刻を表示したい 記述コードは 以下です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("J8:J9,L8:L9,N8:N9,P8:P9,R8:R9,T8:T9,V8:V9,J29:J30,L29:L30,N29:N30,P29:P30,R29:R30")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Time Cancel = True End If End Sub 2つのコードをうまくまとめたいのですが 知識不足でとまどっております。 詳しいかた、アドバイスお願いいたします。 よろしくお願いします。

  • エクセルVBAで結合セルなどの色が一部消えません

    色を付けてある結合セルセルが一部消えません。下のはマクロ記録してそのまま使っているものですが、なぜ消えないのか分かりません。 ちょっとたくさんありすぎてゴチャゴチャしていて恐縮ですが、消えない部分は。 AM42:AO43,AR42:AX43,BD42:BJ43,F45:T46,V45:AJ46の部分です。 使用上のクセとかなんかあるんでしょうか? Union(Range( _ "F57:T58,V57:AJ58,AM57:AO58,AR57:AX58,BD57:BJ58,F60:T61,V60:AJ61,AM60:AO61,AR60:AX61,BD60:BJ61,AV7:BC8,AU9:BC10,D16:AC17,G18:H19,O22:P23,W24:AE25,R32:AV34,F42:T43,V42:AJ43,AM42:AO43,AR42:AX43,BD42:BJ43,F45:T46,V45:AJ46,AM45:AO46,AR45:AX46,BD45:BJ46,F48:T49" _ ), Range( _ "F51:T52,V51:AJ52,AM51:AO52,AR51:AX52,BD51:BJ52,F54:T55,V54:AJ55,AM54:AO55,AR54:AX55,BD54:BJ55" _ )).Select Range("BD60").Activate Union(Range( _ "F57:T58,V57:AJ58,AM57:AO58,AR57:AX58,BD57:BJ58,F60:T61,V60:AJ61,AM60:AO61,AR60:AX61,BD60:BJ61,G65:T66,AM65:AO66,BD65:BJ66,G69:T70,AM69:AO70,BD69:BJ70,BB76:BJ78,AI80:AM81,AV7:BC8,AU9:BC10,D16:AC17,G18:H19,O22:P23,W24:AE25,R32:AV34,F42:T43,V42:AJ43" _ ), Range( _ "AM45:AO46,AR45:AX46,BD45:BJ46,F48:T49,V48:AJ49,AM48:AO49,AR48:AX49,BD48:BJ49,F51:T52,V51:AJ52,AM51:AO52,AR51:AX52,BD51:BJ52,F54:T55,V54:AJ55,AM54:AO55,AR54:AX55,BD54:BJ55" _ )).Select Range("AI80").Activate Selection.Interior.ColorIndex = xlNone

  • ダブルクリックイベントで良いのかどうか?

    お世話になります。 ダブルクリックイベントで、そのセルを赤く色を塗り、尚且つ、 そのセルをダブルクリックした事により、別のワークブックを開き、 また、開いたワークブックのシートの中からある単語を検索して その属性を現在アクティブにしている、ブックのシートに記入しよう としていますが、 まず、下記の様に、ダブルクリックイベントで、セルを赤く塗るまではうまくいったのですが、別のブックを開く事がうまく出来ません。 記述が悪いのか、または標準モジュールに記述するべきなのか分からなく困っています。 どなたかご教授頂きたく宜しくお願い申し上げます。        記 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim Rng As Range, myRng As Range Set Rng = Range("c2:d2,f2") Set myRng = Intersect(Target, Rng) If myRng Is Nothing Then Exit Sub Rng.Interior.ColorIndex = xlColorIndexNone myRng.Interior.ColorIndex = 3 Cancel = True If Intersect(Target, Range("c2")) Then Workbooks.Open Filename:="C:\Documents and Settings\Owner\デスクトップ\台帳.xls" End If End Sub

  • VBAで条件付き書式の文字色

    下記のコードを、条件付き書式で変化した文字色によって作動させたいのですが、変化した赤字を認識せずに作動しません。 どこを修正したら良いでしょうか? Private Sub CommandButton1_Click() Dim cell As Range For Each cell In Range("L28,P28,T28,X28,AB28,AF28,AJ28,AN28,AV30,BC30,BG30,BK30,BO30,BS30,CE28") If cell.Font.ColorIndex = 3 Then ' 赤文字の場合 ユーザフォーム1.Show ' ユーザフォーム1を表示する Exit Sub End If Next cell Range("CI28").Value = "ok" ' セル"CI28"に"ok"を入力する End Sub

  • エクセルVBAのイベントについて教えてください。

    エクセルVBA初学者のです。 "C9"にいれるとchangeイベントが発生するコードなんですが、 "C9"のほかに"D1"においてもchangeイベントを発生させたいのですが 下記のコードに続けて書いてもイベントが発生しないのですが どのように書けばよいのでしょうか? private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("C9")) Is Nothing Then Exit Sub Range("H14:H56").Interior.ColorIndex = 2 If Intersect(Target, Range("D1")) Is Nothing Then Exit Sub Range("G14:G56").Interior.ColorIndex = 2 End Sub よろしくお願いします。

  • VBA CHANGEイベントに複数イベントを

    いつもお世話になっています。 色々しらべて試してみたんですが、うまくいかないんで教えてください。 CHANGEイベントに複数のイベントを書き込みたいんですが。 今現在、問題なく動いている以下のイベントがあります。 (1) Private Sub Worksheet_Change(ByVal Target As Range) Dim rang3 As Range Dim rang4 As Range Dim ■■ As String Dim LastRow1 As Long LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row Set rang4 = Worksheets("○○").Range("b:I" & LastRow) Set rang3 = Range("h4") If Intersect(Target, rang3) Is Nothing Then Exit Sub On Error Resume Next ■■ = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0) If Err.Number > 0 Then MsgBox Target.Value & "はありません。基本情報台帳に入力してください。" Range("h4").Select Else Application.EnableEvents = False Range("I4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 2, False) Range("j4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 3, False) Range("k4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 7, False) Range("l4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 8, False) Range("m4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 5, False) Application.EnableEvents = True Range("K4").Select End If End Sub このシートにもう一つ、イベントを入れたいのですが。 (2) If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("E4")) Is Nothing Then Exit Sub Else If Range("e4").Value = "1" Then Target.Offset(0, 19).Value = "☆" End If どこに入れればいいのかわかりません。 (3) また、(2)のイベントの他に、 (1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。 (2)のみなら動くことは確認できましたが、(1)のexit sub の直前に入れたり、end ifの前に入れたりしましたが、片方は動くが、もうひとつが動かないです。 (3)については、まったくわかりません。 マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。 どなたか、教えてください。 お願いします。

  • エクセルVBAのイベントで質問です。

    ある範囲のセルの色をダブルクリックにより変えていますが、 下の("D5:D50,F5:F50,K5:K50,M5:M50"))の範囲を例えばSheet1の A2以下に始めの範囲、B2以下に終りの範囲を下に書いていって、 対象とする範囲を可変にしたいのですが、どのようにすれば いいでしょうか。 例えば("D5:D50,F5:F50,K5:K50,M5:M50"))であれば A2に「D5」 B2に「D50」 A3に「F5」 B3に「F50」 などとセルにセル番地をいれておいて、コードを変えなくても シート上で範囲を変えていけるようにできないでしょうか。 やり方があれば教えてください。 よろしくお願いします。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim r As Range Set r = Intersect(Target, Range("D5:D50,F5:F50,K5:K50,M5:M50")) If r Is Nothing Then Exit Sub With r.Interior If .ColorIndex = xlNone Then .ColorIndex = 3 ElseIf .ColorIndex = 3 Then .ColorIndex = 4 ElseIf .ColorIndex = 4 Then .ColorIndex = xlNone End If End With Cancel = True End Sub

  • エクセル ダブルクリックで処理日の入力

    お世話になります。 先般、お教え頂きました別のダブルクリックイベントプロシージャと 下記の当日の日付を入力するという処理を同じシート上で行いたいのですが、VBエディターにどのように記述したら良いかわかりません。 当方、かなりの初心者です。 よろしくご教授くださいませ。 【新しく加えたい処理】 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("b4:C999")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Date Cancel = True End If End Sub 【もともと使っている処理】 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("h1:h999")) Is Nothing Then With Target If .Value = "" Then .Value = "有" ElseIf .Value = "有" Then .Value = "無" ElseIf .Value = "無" Then .Value = "" End If End With ElseIf Not Intersect(Target, Range("i1:i999")) Is Nothing Then With Target If .Value = "" Then .Value = "要" ElseIf .Value = "要" Then .Value = "不要" ElseIf .Value = "不要" Then .Value = "" End If End With End If End Sub よろしくお願いします。

  • Range型とチェンジイベント

    特定のセルに値を入力されると、対象セルの横のセルに数式を代入するエクセルを組んでいます。 セルの内容がクリアされた場合は数式もクリアする形で考えているのですが、 ドラッグしてまとめてクリアすると[型が一致していない]というようなエラーが出てしまいます。 入力されたセルの監視はRange型の変数を用い、ターゲットセルが範囲内にいるかどうかで分岐させています。 対処法をご存知であれば、ご指導よろしくお願いします。 以下にソースを抜粋いたします。 ---------------------------- Set Name_R = _ Worksheets("main").Range(Cells(6, 3), Cells(Point, 3)) Set NT_R = Intersect(Target.Cells, Name_R) If NT_R Is Nothing Then ' Application.EnableEvents = True GoTo Name_END Else If Target.Cells.Value = "" Then Target.Cells.Offset(0, 2).FormulaR1C1 = "" Target.Cells.Offset(0, 3).FormulaR1C1 = "" Target.Cells.Offset(0, 11).FormulaR1C1 = "" ' Application.EnableEvents = True Else Target.Cells.Offset(0, 2).FormulaR1C1 = Range("Z6").FormulaR1C1 Target.Cells.Offset(0, 3).FormulaR1C1 = Range("AA6").FormulaR1C1 Target.Cells.Offset(0, 11).FormulaR1C1 = Range("AB6").FormulaR1C1 ' Application.EnableEvents = True End If End If Name_END: ----------------------------

専門家に質問してみよう