[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ダブルクリックで特定の文字又は数字を』(kiri)
おはようございます。 [[20100731130349]]を参考にさせて頂いて下記コードを書いてみました。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("g1,e3:e31,k3:k31,q3:q26")) Is Nothing Then Exit Sub Cancel = True If Not Intersect(Target, Range("g1")) Is Nothing Then Select Case Target.Value Case "あいうえおかきくけこ" Target.Value = 2 Case "2" Target.Value = 3 Case "3" Target.Value = 4 Case "4" Target.Value = 2 Case Else Target.Value = "あいうえおかきくけこ" End Select Else Target.Value = Date End If End Sub
質問は2点です。 1.「型が一致しません」とのエラーメッセージがでてマクロがとまります。どうすればいいですか? 2.上記のコードの3行目の Cancel = True は何のために必要ですか?
宜しくお願い致します。
>Cancel = True は何のために必要ですか? これは、ダブルクリックという動作で本来は、セル内に制御が移りますが、 それをさせないというということです。 e3でダブルクリックしたときと a1でダブルクリックしたときの 状態の違いを比べてみてください。
>型が一致しません」とのエラーメッセージがでてマクロがとまります。 そのとき、セルg1には、何が入っていますか? どの行で止まりますか? これを記述してください。
セルg1がエラー値の場合、確かに「型が一致しません」とのエラーメッセージが出ますね!! これが原因なら・・・、
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("g1,e3:e31,k3:k31,q3:q26")) Is Nothing Then Exit Sub Cancel = True If Not Intersect(Target, Range("g1")) Is Nothing Then If IsError(Target.Value) Then Target.Value = "" '←これを入れる Select Case Target.Value Case "あいうえおかきくけこ" Target.Value = 2 Case "2" Target.Value = 3 Case "3" Target.Value = 4 Case "4" Target.Value = 2 Case Else Target.Value = "あいうえおかきくけこ" End Select Else Target.Value = Date End If End Sub
でいけそうですが・・・・。
ichinose
>>Cancel = True は何のために必要ですか? >これは、ダブルクリックという動作で本来は、セル内に制御が移りますが、 >それをさせないというということです。 よく理解できました。有難うございます。
>>型が一致しません」とのエラーメッセージがでてマクロがとまります。 >そのとき、セルg1には、何が入っていますか? >どの行で止まりますか? これを記述してください。 このファイルは開いた時には"あいうえおかきくけこ"が入力された状態がデフォルトです。 その状態でg1をダブルクリックすると「型が一致しません」とのメッセージがでて Case "あいうえおかきくけこ"の部分が黄色くなります。 g1の値を手作業で「2」に変更してから、ダブルクリックしても Case "あいうえおかきくけこ"の部分でとまります。 Target.Value = Dateの方はうまく動きました。
書いていただいたコードをコピーしてみたのですが、現象は全く同じでした。 g1セルの書式設定は文字列になっています。 条件付き書式で「=VALUE(G1)=2」の時「;;;"さしすせそ"」というのも設定されて います。 今までg1に2〜4の番号を入力、e3:e31,k3:k31,q3:q26には手作業で日付をいれていたのですが 日付入力が Target.Value = Date で、できると解ったので g1の方もダブルクリックでと思ったのですが、g1の方だけうまくいかないという次第です。 g1セルの書式設定等の関係でうまくいかないのでしたら、g1のダブルクリックの方はあきらめます。
(kiri)
当方で確認が出来ないのですが・・・。取りあえず、明示的に型変換するとどうでしょうか?
Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim mystr As String If Intersect(Target, Range("g1,e3:e31,k3:k31,q3:q26")) Is Nothing Then Exit Sub Cancel = True If Not Intersect(Target, Range("g1")) Is Nothing Then mystr = CStr(Target.Value) Select Case mystr Case "あいうえおかきくけこ" Target.Value = 2 Case "2" Target.Value = 3 Case "3" Target.Value = 4 Case "4" Target.Value = 2 Case Else Target.Value = "あいうえおかきくけこ" End Select Else Target.Value = Date End If End Sub
ichinose
回答有難うございます。
書いていただいたコードをコピペしてみました。 「型が一致しません。 」とのエラーメッセージが出て mystr = CStr(Target.Value) の部分が黄色くなりました。
G1には前述のとおり、書式設定が文字列だったり、条件付き書式が設定してあったりするのですが 試しに空白のセルをコピーしてG1セルに「形式を選択して、書式の貼り付け」をしてみましたら コードが動くようになりました。 変わった書式が設定してあると、「型が一致しません」となるのでしょうか? (kiri)
>このファイルは開いた時には"あいうえおかきくけこ"が入力された状態がデフォルトです。 再現ができません。
いくつか整理しましょう。
Excelバージョンは?
同じ条件で新規ブックにて試しても結果は同じですか? 新規ブックでは、結果が異なるなら、何かそのブックに問題がありそうです。
新規ブックでも結果が同じ場合
Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim mystr As String If Intersect(Target, Range("g1,e3:e31,k3:k31,q3:q26")) Is Nothing Then Exit Sub Cancel = True If Not Intersect(Target, Range("g1")) Is Nothing Then msgbox typename(target.value) 'この結果もエラーになりますか? mystr = CStr(Target.Value) Select Case mystr Case "あいうえおかきくけこ" Target.Value = 2 Case "2" Target.Value = 3 Case "3" Target.Value = 4 Case "4" Target.Value = 2 Case Else Target.Value = "あいうえおかきくけこ" End Select Else Target.Value = Date End If End Sub
何か表示されるなら教えてください。 それともやっぱり、エラー(型が一致しない)になりますか?
Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim mystr As String If Intersect(Target, Range("g1,e3:e31,k3:k31,q3:q26")) Is Nothing Then Exit Sub Cancel = True If Not Intersect(Target, Range("g1")) Is Nothing Then On Error Resume Next mystr = CStr(Target.Value) If Err.Number <> 0 Then mystr = "あいうえおかきくけこ" On Error GoTo 0 Select Case mystr Case "あいうえおかきくけこ" Target.Value = 2 Case "2" Target.Value = 3 Case "3" Target.Value = 4 Case "4" Target.Value = 2 Case Else Target.Value = "あいうえおかきくけこ" End Select Else Target.Value = Date End If End Sub
原因がわかるまでは、エラ−トラップを使う方法も試してみてください。
ichinose
>Excelバージョンは? 2007です
>新規ブックでも結果が同じ場合 まったく同じでした。
>msgbox typename(target.value) 'この結果もエラーになりますか? Variant() が表示された後、型が一致しませんとなって 「 mystr = CStr(Target.Value)」が黄色くなります。 なので「Dim mystr As String」を「Dim mystr As Variant」に変えてみました。 そうすると msgbox で Variant()が表示された後、「型が一致しません」となって mystr = CStr(Target.Value)が黄色くなります。
>エラ−トラップを使う方法 不思議です。 G1に「あいうえおかきくけこ」がある場合はダブルクリックで「2」に変わります。 2の場合は変化しません。 3の場合は2に変わります。 4の場合は2に変わります。 Case Elseの場合は2に変わります。 これはいったい???? (kiri)
>Variant() が表示された後、型が一致しませんとなって >「 mystr = CStr(Target.Value)」が黄色くなります。 ってことは、セルG1の初期値は、"あいうえおかきくけこ" ではない? ダブルクリックでTargetが複数セルってあり得る?
mystr = CStr(Target.Value) ここでエラーになるのは今のところ仕方ないです。
Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) dim mydata as variant Dim mystr As String If Intersect(Target, Range("g1,e3:e31,k3:k31,q3:q26")) Is Nothing Then Exit Sub Cancel = True If Not Intersect(Target, Range("g1")) Is Nothing Then msgbox target.address for each mydata in target.value msgbox mydata next mystr=cstr(target.value) 'ここでエラーにはなります Select Case mystr Case "あいうえおかきくけこ" Target.Value = 2 Case "2" Target.Value = 3 Case "3" Target.Value = 4 Case "4" Target.Value = 2 Case Else Target.Value = "あいうえおかきくけこ" End Select Else Target.Value = Date End If End Sub
上記コードで何が表示されますか?
ichinose
>ってことは、セルG1の初期値は、"あいうえおかきくけこ" ではない? 初期値は「あいうえおかきくけこ」です。
>ダブルクリックでTargetが複数セルってあり得る? あ! 実は結合セルです。 ダブルクリックって結合セルでは駄目なんですか! うわ! 申し訳ありません。
>上記コードで何が表示されますか? $G$1:$i$1 あいうえおかきくけこ 「Ok」のみのメッセージボックス 「Ok」のみのメッセージボックス 「型が一致しません」で mystr = CStr(Target.Value) が黄色くなる です。 大事な情報提供をせずに大変迷惑をかけたみたいです。 申し訳ありません。 (kiri)
>あ! 実は結合セルです。 >ダブルクリックって結合セルでは駄目なんですか! うわ! 申し訳ありません。 駄目ではないです。ただ、複数セルをTargetが取得するので
>型が一致しません
というエラーが発生しますね
Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim rng As Range Set rng = Application.Intersect(Target, Range("g1,e3:e31,k3:k31,q3:q26")) If rng Is Nothing Then Exit Sub Cancel = True If rng.Address = "$G$1" Then Select Case rng.Value Case "あいうえおかきくけこ" rng.Value = 2 Case "2" rng.Value = 3 Case "3" rng.Value = 4 Case "4" rng.Value = 2 Case Else rng.Value = "あいうえおかきくけこ" End Select Else rng.Value = Date End If End Sub
これで試してみてください。
尚、条件付書式の設定による問題点は、当方Excel2002で確認しているので 確認がとれませんが、これでうまくいかないようなら、条件付書式での書式設定も VBAでやってしまう という方法もあります。
ichinose
動きました! 条件付き書式があっても大丈夫でした。 長い間 お付き合い頂いて誠にありがとうございます。 大変勉強になりました。 (kiri)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.