[[20100801074021]] 『ダブルクリックで特定の文字又は数字を』(kiri) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ダブルクリックで特定の文字又は数字を』(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


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


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


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
 


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


ichinoseさんへ
 動きました!
 条件付き書式があっても大丈夫でした。
 長い間 お付き合い頂いて誠にありがとうございます。
 大変勉強になりました。
 (kiri)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.