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

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

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

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

Q&A

解決済

1回答

5206閲覧

VBAのシェイプオブジェクトを結合セルに生成する

hokosugi

総合スコア63

VBA

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

0グッド

0クリップ

投稿2018/06/23 06:20

編集2018/06/23 06:21

前提・実現したいこと

エクセルを利用した報告書形式のxlsmファイルに評価・判定用の丸型のシェイプオブジェクト
を背景色の付いたセルに生成するマクロを作成する。

発生している問題

結合セルに背景色が付いている場合に、結合前の単体セル単位で〇がついてしまう。

該当のソースコード

vba

1Subobject書き込み() 2 Dim myShp As Shape 3 Dim cell As Variant 4 Dim c As Variant 5 For Each c In ActiveSheet.Range(Cells(1, 24), Cells(45, 300)) 6 If c.MergeCells And c.Interior.Color = RGB(255, 0, 0) Then 7 With ActiveSheet.Range(c.Address) 8 Set myShp = ActiveSheet.Shapes.AddShape _ 9 (Type:=msoShapeFlowchartConnector, Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) 10 11 With myShp 12 .Name = "丸印" 13 .Line.ForeColor.SchemeColor = 0 '黒 14 .Line.Weight = 1 '線の太さ 15 .Fill.ForeColor.RGB = RGB(255, 0, 0) 16 .Fill.Transparency = 1 '透過 17 End With 18 End With 19 20 ElseIf c.Interior.Color = RGB(255, 0, 0) Then 21 With c 22 Set myShp = ActiveSheet.Shapes.AddShape _ 23 (Type:=msoShapeFlowchartConnector, Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) 24 25 With myShp 26 .Name = "丸印" 27 .Line.ForeColor.SchemeColor = 0 '黒 28 .Line.Weight = 1 '線の太さ 29 .Fill.ForeColor.RGB = RGB(255, 0, 0) 30 .Fill.Transparency = 1 '透過 31 End With 32 End With 33 Set myShp = Nothing 34 End If 35 Next 36End Sub 37

結果

イメージ説明

試したこと

7行目にoffsetプロパティで2列単位で〇オブジェクトを指定出来るようにした。
'''vba
With ActiveSheet.Range(c.Address, c.Offset(0, 1)) '7行目
'''

結果(offset後)

芳しくありません。
結合セル内のセルにオフセット指定セルがついてきてしまうだけで、狙い通りにはいかない。
書き込まれた2種類の〇のうち、ひとつでも結合セルに当てはまっていれば片方を消せばいいのですが
悪いことに結合セルであっても一つのセルと見なされているのか3列に渡って丸が付けられてしまいます。

検索を含め、かなりの時間、頭をひねって考えましたが解決策が見つかりません。
何卒宜しくお願い致します。

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じに、個々のセルのアドレスと
そのセルを含む結合セルの範囲の中の左上のセルと
アドレスで比較して、不要なセルを操作対象から外します。

VBA

1Sub 丸object書き込み2() 2 Dim c As Range 3 Dim shp As Shape 4 5 For Each c In ActiveSheet.Range("AD25:AJ60") 6 '見ているセルが結合セルの左上の時だけ 7 '(それ以外は無効化されているので無視) 8 If c.Address = c.MergeArea(1).Address Then 9 '塗りつぶしの色が赤かの判定をする 10 If c.Interior.Color = vbRed Then 11 '真面目に引数を与えると右に長くなるから0で仮に書いて後で変える 12 '1でもいいけど^^;あと丸はOvalでいいと思う。 13 Set shp = ActiveSheet.Shapes.AddShape(msoShapeOval, 0, 0, 0, 0) 14 With shp 15 .Top = c.Top 16 '結合セル範囲の真ん中に 17 .Left = c.Left + c.MergeArea.Width / 2 - c.Height / 2 18 'セルの高さに幅を合わせて真ん丸に。長丸がいい? 19 .Width = c.Height 20 .Height = c.Height 21 .Line.ForeColor.SchemeColor = vbBlack '線の色=黒 22 .Line.Weight = 1 '線の太さ=1 23 .Fill.Visible = msoFalse '塗りつぶし=なし 24 End With 25 End If 26 End If 27 Next 28End Sub

投稿2018/06/23 07:59

mattuwan

総合スコア2163

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

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

hokosugi

2018/06/23 08:31

早速のご返答ありがとうございます。 おーー、結合セル内のセルアドレスを指定できるプロパティ(MergeArea)があるんですね。 VBA始めて間がないので知りませんでした。これだけでも有難いのに、コピペするだけで 完成してしまうコードまで書いていただき感謝いたします。あとでシッカリ読みます。 取り急ぎお礼まで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問