質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

3566閲覧

VBAで文字をクリックしたら丸囲みになるようにしたいです。

nagadora

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

3クリップ

投稿2019/02/27 02:54

現在、以下VBAを組んでおりますが、「実行エラー13 型が一致しません。」というのが、「Case ""」の部分で出てしまい原因不明でデバックできません。
恐れ入りますが、ご対策を御存じの方ご教授頂けないでしょうか。何卒よろしくお願い申し上げます。

win10 64bit
office 2016ただし2010でも対応のVBAで構築したいです。何卒よろしくお願い申し上げます。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Cancel = True
If Intersect(Target, Range("a1:af99")) Is Nothing Then Exit Sub
'↑の("a1:af99")の部分に、対象の範囲を自分で書き込む

Select Case Target.Value
Case ""
Target.Value = "○"
Case "○"
Target.Value = ""
End Select
End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

date

2019/02/27 02:57

エラーが出るセルの状態は結合セルですか?
nagadora

2019/02/27 04:05

結合セルではありません。
takito

2019/02/27 04:18

ご提示のコードは私の手元では動きました。win10,64bit,excel2013 Date さんのおっしゃるように結合セルの場合は同エラーが出ます。結合セルはtargetが配列になるためです。targetに何が入ってきてるか確認できますか?
ttyp03

2019/02/27 06:53

質問タイトルと困っていることの内容があっていないので、タイトルの編集をお願いします。
guest

回答1

0

「質問への追記・修正の依頼」欄ですでにあげられているものも含めて、エラー原因がいくつか考えられます。

①引数として複数セルを受け取っている

例えばTarget引数として結合セルを受け取った場合です。
この場合Target.Valueでは値の取得ができず、エラーが発生します。

取得した複数のセルのうち、どのセルを対象に判定・書き込みを行うかを特定したコードにすることで解消できます。

②引数で受け取ったセルの値が、文字列と比較できない

例えばTarget引数として#VALUEのようなエラーとなっているセルを受け取った場合などです。
この場合、Taregt.Valueを暗黙的に文字列と比較することができず、エラーが発生します。
※エラー発生個所からみて今回はこちらが原因と思われます。

多くの場合Taregt.Textで比較することで回避できます。

サンプル

最終的に、上記2点はどちらも対応しておいた方がいいものです。
下記は、これを考慮したサンプルコードです。

サンプル① 複数セルの場合、先頭セルで処理をする

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True 'If Intersect(Target, Range("a1:af99")) Is Nothing Then Exit Sub ''↑の("a1:af99")の部分に、対象の範囲を自分で書き込む Dim rngArea As Range Dim c As Range '対象範囲内のセルを抽出 Set rngArea = Intersect(Target, Range("a1:af99")) If rngArea Is Nothing Then Exit Sub '先頭セルを対象として取得 Set c = rngArea.Cells(1) '対象セルを判定し、書き込みを行う Select Case c.Text Case "" Target.Value = "○" Case "○" Target.Value = "" End Select End Sub

DoubleClickイベントにおいて、引数で複数セルを受け取るのは結合セルを指定したときくらいかと思います。
結合セルの対応であればサンプル①で事足りますが、他のイベントなどで「複数セルを受け取った時は、全てのセルを処理したい」ということもあるかと思いますので、参考までにサンプルコード②も作ってみました。

サンプル② 複数セルの場合、全てのセルに処理をする

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True 'If Intersect(Target, Range("a1:af99")) Is Nothing Then Exit Sub ''↑の("a1:af99")の部分に、対象の範囲を自分で書き込む Dim rngArea As Range Dim c As Range Set rngArea = Intersect(Target, Range("a1:af99")) If rngArea Is Nothing Then Exit Sub '複数のセル範囲から対象セルを1つずつ取り出すループ処理 For Each c In rngArea.Cells '結合セルの場合、先頭セルのみ処理を行う If c.Address = c.MergeArea.Cells(1).Address Then '対象セルを判定し、書き込みを行う Select Case c.Text Case "" Target.Value = "○" Case "○" Target.Value = "" End Select End If Next End Sub

注意しなければいけないのは、結合セルでもそれぞれのセルに対してループ処理が行われるという点です。
A1とA2を結合したセルに対してはA1で1回、A2で1回ループ処理が行われます。
このためA1で""⇒"○"に書き換えても、その後のA2の判定で"○"⇒""に戻されたりしかねません。

これを回避するため、結合セルではその先頭セルでのみ処理するようc.MergeArea.Cells(1).Addressの判定を追加しています。
結合セルであればその先頭セルの座標が返されますし、単一セルの場合はそのセルの座標が返されます。
これにより結合セルの先頭以外のセルでは処理が行われないようになります。

参考になれば幸いです。

投稿2019/02/27 06:23

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問