🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Q&A

解決済

2回答

5443閲覧

Excel・VBA 結合セルに対するコードのエラー回避

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2019/10/24 08:16

????Excel・VBA 結合セルに対するコードのエラー回避

VBA超初心者????です。
Excel2010です。

あるセルに対し、入力例を薄いグレーの文字で表示させておき、カーソルを置くと表示が消える。
入力をした場合黒文字で入力内容が入り、内容を消すと再度グレーの文字の入力例が表示されるようにしています。

これを1シートの中に複数セル、入力例をそれぞれ変えて設置したいのですが、単一セルに対してはうまくいったのですが、結合されたセルに対してはエラーメッセージが出てしまい、うまく再現できません。

「.MargeArea」や「.MargeCells」をうまく使用して書けばよいのかな?と思ってかなり色々と調べて試行錯誤してみたのですが、何故初心者のため理解が浅く・・・正しい書き方がわかりません。
助けていただけますでしょうか。

発生している問題・エラーメッセージ

実行時エラー'13' 型が一致しません。

該当のソースコード

Private Sub Worksheet_SelectionChange(ByVal Target As Range) Const cell_D4 As String = "[入力例]10/9" With Range("D4:F4") If Not Intersect(Target, Range("D4:F4")) Is Nothing Then If Target = cell_D4 Then Target = "" .Font.ColorIndex = 0 End If Else If .Value = "" Then .Value = cell_D4 .Font.ColorIndex = 16 End If End If End With End Sub

試したこと

.MargeAreaで単一セル指定 や、 .MargeCells で書いてみたり・・・

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

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

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

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

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

guest

回答2

0

ベストアンサー

「.MargeArea」や「.MargeCells」は関係ないですね。

vba

1 If .Value = "" Then

セル範囲をまとめて判断できません。
1セルずつ判断しないと。

あと、複数セルを選択したときとか、複数セルを選択して削除したときとか、いろいろな状況を考慮する必要があります。

とりあえずサンプルコードを作成してみましたので、参考にしてください。

vba

1Option Explicit 2 3Const cell_D4 As String = "[入力例]10/9" 4 5Private Sub Worksheet_Activate() 6 Call cell_D4_Hint 7End Sub 8 9Private Sub Worksheet_SelectionChange(ByVal Target As Range) 10 11 Call cell_D4_Hint 12 13 Dim r As Range 14 Set r = Intersect(Target, Range("D4:F4")) 15 If Not r Is Nothing Then 16 With ActiveCell 17 If .Value = cell_D4 Then 18 .Value = "" 19 .Font.ColorIndex = 0 20 End If 21 End With 22 End If 23End Sub 24 25Public Sub cell_D4_Hint() 26 Dim c As Range 27 For Each c In Range("D4:F4") 28 If c.Value = "" Then 29 c.Value = cell_D4 30 c.Font.ColorIndex = 16 31 End If 32 Next 33End Sub

これを1シートの中に複数セル、入力例をそれぞれ変えて設置したいのですが、

これを考慮してコードを修正してみました。

シートモジュール

vba

1Option Explicit 2 3Private Sub Worksheet_Activate() 4 Call Set_Placeholder 5End Sub 6 7Private Sub Worksheet_SelectionChange(ByVal Target As Range) 8 Call Set_Placeholder 9End Sub 10 11Private Sub Set_Placeholder(ParamArray aRng_Placeholder() As Variant) 12 Call Rng_Placeholder(Range("D4:F4"), "[入力例]10/9") 13 Call Rng_Placeholder(Range("A4"), "[入力例]山田 太郎") 14 Call Rng_Placeholder(Range("B4"), "[入力例]ヤマダ タロウ") 15End Sub 16 17Private Sub Rng_Placeholder(Rng As Range, Placeholder As String) 18 Application.EnableEvents = False 19 Dim c As Range 20 For Each c In Rng 21 If c.Value = "" Then 22 c.Value = Placeholder 23 c.Font.ColorIndex = 16 24 End If 25 Next 26 If Not Intersect(ActiveCell, Rng) Is Nothing Then 27 With ActiveCell 28 If .Value = Placeholder Then 29 .Value = "" 30 .Font.ColorIndex = 0 31 End If 32 End With 33 End If 34 Application.EnableEvents = True 35End Sub

投稿2019/10/24 09:08

編集2019/10/24 14:19
hatena19

総合スコア34073

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

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

退会済みユーザー

退会済みユーザー

2019/10/25 01:54

haneta19さん、おはようございます。 トンチンカンなことを試していたようですね・・・お恥ずかしいです。 サンプルを頂いたコードで全シートに反映させてみたところ、無事どこも問題なく動きました。 本当にありがとうございます。 色々なパターンやしたいことに合わせてしっかりパターンを考えて指示してあげないとダメなんですね。 大変勉強になりました。 出来ただけで満足せず、この後1つずつ噛み砕いてどこがどうなっているのか「ある」ときと「ない」ときの違いなど、見て理解していこうと思います。 こちらの要望に合わせてパターンをお考え下さった点も考慮し、ベストアンサーとさせていただきます。
guest

0

Else側の処理がWithで指定しているRangeを参照してしまっています。
Targetを参照するようにするべきかと。
またValueでは結合セルに対応できないので、きちんとMergeCellsで結合セルか否か判定してからMergeAreaで値を取得しましょう。
もしくはTextで値参照すると結合セルでも表示されている値を取得できるので、こちらの方がいいかもしれません。
以下、Else内の修正版。

VBA

1 If Target.Text = "" Then 2 Target.Value = cell_D4 3 Target.Font.ColorIndex = 16 4 End If

余談ですが、Worksheet_SelectionChangeよりWorksheet_Changeの方がよくないですか?

投稿2019/10/24 08:43

ttyp03

総合スコア17000

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

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

hatena19

2019/10/24 09:09

Targetだと複数セルを選択したときにエラーになりませんか。 ActiveCellを対象にすべきかと。
ttyp03

2019/10/24 09:19

試してみましたがTargetで大丈夫でした。 ValueではなくTextにしたからだと思います。
退会済みユーザー

退会済みユーザー

2019/10/24 10:00

ttxp03さま、hatena19さま、 早速アドバイスと回答ありがとうございます! すぐにでも試したいのですが、該当ファイルに本日はもう触れるチャンスがなく… 明日いずれも試してみます。 取り急ぎ御礼まで。
退会済みユーザー

退会済みユーザー

2019/10/25 01:50

おはようございます。色々試していてご返信が遅くなりました。 ttyp03さんのご教示いただいた内容も試してみたのですが、エラーが出てしまいました。 これから更に噛み砕いて色々テストしてみますが、そもそも初歩の初歩が判っていなかった点もあるので大変勉強になりました。他にも応用してみます。 ありがとうございました。
ttyp03

2019/10/25 01:58

こちらではエラーは発生していないので何か間違っているのでは? どのようなエラーでしょうか? 本質問に関しては何も難しいことはなく、結合セルの参照の仕方をちょっと変えるだけでよいはずです。
退会済みユーザー

退会済みユーザー

2019/10/25 02:32

すみません。今一度やってみたところ、エラーの再現が出来ませんでした。 エラーについては私の書き間違いだったようです・・・ (エラーが出た後すぐにExcel自体が落ちてしまうのでスクショも取れませんでした) 申し訳ないです。
ttyp03

2019/10/25 02:37

結果として私の回答は間違っていたのかどうかだけ教えてください。
退会済みユーザー

退会済みユーザー

2019/10/25 02:39

大変失礼致しました。大事な点が抜けておりました。 ttyp03の回答は決して間違っていませんでした。 教えていただいた方法で大丈夫でした。
ttyp03

2019/10/25 02:57

それならよかったです。 最小限の修正で済んでいますので、元々のコードはそれほど間違っていなかったと思います。
退会済みユーザー

退会済みユーザー

2019/10/25 08:22

ありがとうございます。 この程度で四苦八苦なので、大変助かりました。 色々トンチンカンなことをしていてお恥ずかしい限りです。 頂いたアドバイスやコードの意味・使い方もしっかり身に着けたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問