[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロによるオートシェイプ制御』(さら)
はじめまして。
よろしくお願いします。
C2〜C3、E2〜E3、G2〜G3
それぞれにIF関数の結果により、「なし」「甲」「乙」が入力されています。
D2〜D3、F2〜F3、H2〜H3
それぞれの上のセルが
「なし」何もしない+オートシェイプが存在したら削除する
「甲」ならD2、F2、H2にセルサイズでオートシェイプの〇
「乙」ならD3、F3、H3にセルサイズでオートシェイプの〇
としたいです。
どのようなマクロが可能でしょうか?
ボタンで制御したいと考えております。
< 使用 Excel:Excel2013、使用 OS:Windows7 >
※2019.2.26 18:35修正させていただきました。
C2、C4、C6
それぞれにVLOOKUP関数の結果により、「なし」「甲」「乙」が入力されています。
C3〜D3、C5〜D5、C7〜D7
それぞれの上のセルが
「甲」ならD2、F2、H2にセルサイズでオートシェイプの〇
「乙」ならD3、F3、H3にセルサイズでオートシェイプの〇
「なし」何もしない+オートシェイプが存在したら削除する
としたいです。
どのようなマクロが可能でしょうか?
ボタンで制御したいと考えております。
イメージとしては下記になります。
C4 甲
C5 ○ D5
C6 乙
C7 D7 ○
どなたかよろしくお願い致します
(さら) 2019/02/26(火) 18:39
(マナ) 2019/02/26(火) 18:53
あと記載ミスがありました...
C2 甲
C3 ○ D3
C4 甲
C5 ○ D5
C6 乙
C7 D7 ○
(さら) 2019/02/26(火) 20:02
>C3〜D3、C5〜D5、C7〜D7
(マナ) 2019/02/26(火) 20:11
事前準備(少ないなら手作業で) 1)所定のセルに ○ を用意 2)○にセル番地を含む名前(丸C3,丸D3など)をつける
ここからマクロ 3)C2、C4、C6を順番に調べ 4)「甲」なら、 4-1)一つ下のセルの ○ のVisible=True 4-2)一つ下で、一つ右のセルの ○ のVisible=false 5)「乙」なら 5-1)一つ下のセルの ○ のVisible=false 5-2)一つ下で、一つ右のセルの ○ のVisible=True 6)それ以外なら 6-1)一つ下のセルの ○ のVisible=false 6-2)一つ下で、一つ右のセルの ○ のVisible=false
例えばC2が「乙」なら C 3セルの ○ (丸C3)を非表示にするということです。 activesheet.Shapes("丸C3").Visbe=False
(マナ) 2019/02/26(火) 21:35
まず前提条件の1と2は手作業でも大丈夫です。
個数は28個になるのですが、自動化とかできるのでしょうか?
もしくは過去ログであったのですが、オートシェイプを書くという方法も良いのかなと勝手に想像しています...
条件の方ですが、
If Range("C2").Value Like "*甲*" Then
という感じで順番に記載していくっていうことですか?
全くの素人なのですみませんがご教授いただければと思います
(さら) 2019/02/26(火) 22:28
(マナ) 2019/02/26(火) 22:39
あと、ThenとElseの時のセル番地の指定ですが、Rangeで記載していくしかありませんか?
もう1つCell.Offsetとかでしたか?これで繰り返し処理みたいなことは可能でしょうか?
(さら) 2019/02/26(火) 23:04
まずは自力でできる書き方↑で構いません。
>繰り返し処理的な記載で簡略化
はそのあとで。
(マナ) 2019/02/26(火) 23:18
Dim L, T, W, H As Variant Dim L2, T2, W2, H2 As Variant
With Selection L = .Left T = .Top W = .Width H = .Height End With
If W > H Then L2 = L + (W - H) / 2 T2 = T Else L2 = L T2 = T + (H - W) / 2 End If
If W > H Then W2 = H H2 = H Else W2 = W H2 = W End If If Range("C2").Value = "甲" Then Range("C3").Select With ActiveSheet.Shapes.AddShape(msoShapeOval, L2, T2, W2, H2) .Fill.Visible = msoFalse .Line.ForeColor.RGB = RGB(0, 0, 0) .Line.Weight = 1 End With Else If Range("C2").Value = "乙" Then Range("D4").Select With ActiveSheet.Shapes.AddShape(msoShapeOval, L2, T2, W2, H2) .Fill.Visible = msoFalse .Line.ForeColor.RGB = RGB(0, 0, 0) .Line.Weight = 1 End With End If End If End Sub
他の掲示板より引用したものを少し改造しただけですが、○の位置がまばらでうまくいきません。
ご教授ください。。。
(さら) 2019/02/27(水) 06:13
図形を表示/非表示したり削除するのではなく、全ての〇を削除後、改めて〇を全部描く、というロジックの方が、図形が既にあるかどうか等の処理が不要になります。
あと、注意点としては、〇の大きさや位置は、セルサイズが統一されていない場合におかしくなるSelectionなんてあてにならないものではなく、〇を置くセルの情報から得るべきだ、という事でしょうか。
(???) 2019/02/27(水) 11:20
Sub test() Dim i As Long Dim L As Single Dim T As Single Dim W As Single
For i = ActiveSheet.Shapes.Count To 1 Step -1 If ActiveSheet.Shapes(i).Name Like "test*" Then ActiveSheet.Shapes(i).Delete End If Next i
For i = 2 To Cells(Rows.Count, "C").End(xlUp).Row Step 2 If Cells(i, "C").Value <> "" Then With Cells(i, "C").Offset(1, IIf(Cells(i, "C").Value = "甲", 0, 1)) If .Width < .Height Then W = .Width L = .Left T = .Top + (.Height - W) / 2 Else W = .Height L = .Left + (.Width - W) / 2 T = .Top End If With ActiveSheet.Shapes.AddShape(msoShapeOval, L, T, W, W) .Name = "test" & Cells(i, "C").Address(0, 0) .Fill.Visible = msoFalse .Line.ForeColor.RGB = RGB(0, 0, 0) .Line.Weight = 1 End With End With End If Next i End Sub (???) 2019/02/27(水) 11:25
図形を表示/非表示したり削除するのではなく、全ての〇を削除後、改めて〇を全部描く、というロジックの方が、図形が既にあるかどうか等の処理が不要になります。 全ての〇を消すしてから新たに書くがやりたかったです!
説明下手ですみませんm(_ _)m
現状では必要な箇所以外のセルには〇やオートシェイプはないのですが、今後出てきた場合に備えて範囲を指定して削除は可能でしょうか?
あと、注意点としては、〇の大きさや位置は、セルサイズが統一されていない場合におかしくなるSelectionなんてあてにならないものではなく、〇を置くセルの情報から得るべきだ、という事でしょうか。 運用の上で仮にセルサイズが変わるとと思いましてSelectionとしてみた(コピペですが)のですが、現状としてはサイズは固定でも大丈夫な状況です。
(さら) 2019/02/27(水) 12:30
サイズについては、3行目と4行目の高さが違うのに、3行目の高さで4行目に〇を置く、なんてすると崩れます。 それに、マクロ実行前に何処を選択しているのかなんて不定ですし、複数の行や列を選択する事だってできる訳です。 セルではなく、画像を選択している場合もあります。 それらの場合でも、正しいサイズで〇を置くにはどうするか、を考えましょう。 貼り先セルを元にすると、行毎に高さが違っていても追従します。(縦横どっちが大きいかを判断していたので、行高さがバラバラな場合を考慮しているのだろうと推測しました)
逆に、全て同じ大きさの〇にしたいなら、例えばRange("A1")からだけサイズを得ておいて、行毎に変えるのは縦位置だけにすると良いです。
(???) 2019/02/27(水) 13:00
別シートでもいいので、○を表示させるセルを別に用意した方がいいと思います。
で、図のリンク貼り付けで持ってくる。
(でれすけ) 2019/02/27(水) 13:32
1.条件
現状→「甲」は正常に動きます。
「甲」以外の空白ではない場合は全て○に統一されている
希望→「甲」はそのままで大丈夫です
最初の投稿で書きました通り、「乙」ならD列に○、「なし」又は空白セルの場合は何もしないとしたい
2.範囲
希望→処理範囲を限定したい
マクロ有効範囲→【B22:E31】と【B69:E78】
条件入力セル→それぞれ【B22、B24、B26、B28、B30】【B69、B71、B73、B75、B77】
上記を踏まえて修正してみたものが下記です
Sub test() Dim i As Long Dim L As Single Dim T As Single Dim W As Single For i = ActiveSheet.Shapes.Count To 1 Step -1 If ActiveSheet.Shapes(i).Name Like "test*" Then ActiveSheet.Shapes(i).Delete End If Next i For i = 22 To Cells(Rows.Count, "B").End(xlUp).Row Step 2 If Cells(i, "B").Value <> "" Then With Cells(i, "B").Offset(1, IIf(Cells(i, "B").Value = "甲", 0, 2)) If .Width < .Height Then W = .Width L = .Left T = .Top + (.Height - W) / 2 Else W = .Height L = .Left + (.Width - W) / 2 T = .Top End If With ActiveSheet.Shapes.AddShape(msoShapeOval, L, T, W, W) .Name = "test" & Cells(i, "B").Address(0, 0) .Fill.Visible = msoFalse .Line.ForeColor.RGB = RGB(0, 0, 0) .Line.Weight = 1 End With End With End If Next i End Sub
この状態だと範囲の指定が出来ておりません。
範囲の指定をして、実行ボタンを作成して完了としたいです。
完成した場合、このシートをコピーしても全て正常に動くでしょうか?
また仮にの話ですが、○のサイズをセルサイズの90%で描きたい場合は、L、T、Wの式のどの場所に「 * 0.9」とすれば良いでしょうか?
なかなか適当に入れてみたのですが、位置がずれてしまいます...
よろしくお願いします!
(さら) 2019/02/27(水) 18:14
1.条件のところも改善出来てません。
よろしくお願いしますm(_ _)m
(さら) 2019/02/28(木) 01:07
そして、C列を見て、C列またはD列に〇だったのが、B列をみて、B列またはD列に変えたようですが、これはそのまま活かします。
Sub test() Dim i As Long
For i = ActiveSheet.Shapes.Count To 1 Step -1 If ActiveSheet.Shapes(i).Name Like "test*" Then ActiveSheet.Shapes(i).Delete End If Next i For i = 22 To 31 Step 2 Call testSub(i) Next i For i = 69 To 78 Step 2 Call testSub(i) Next i End Sub
Sub testSub(i As Long) Dim L As Single Dim T As Single Dim W As Single
Select Case Cells(i, "B").Value Case "甲", "乙" With Cells(i, "B").Offset(1, IIf(Cells(i, "B").Value = "甲", 0, 2)) If .Width < .Height Then W = .Width * 0.9 L = .Left + .Width * 0.05 T = .Top + (.Height - W) / 2 Else W = .Height * 0.9 L = .Left + (.Width - W) / 2 T = .Top + .Height * 0.05 End If With ActiveSheet.Shapes.AddShape(msoShapeOval, L, T, W, W) .Name = "test" & Cells(i, "B").Address(0, 0) .Fill.Visible = msoFalse .Line.ForeColor.RGB = RGB(0, 0, 0) .Line.Weight = 1 End With End With End Select End Sub (???) 2019/02/28(木) 09:56
無事に動作確認出来ました。
自分が修正した箇所と比較して勉強したいと思います。
また投稿することもあるかと思いますが、皆様よろしくお願い致しますm(*_ _)m
(さら) 2019/03/01(金) 08:28
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.