[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オートシェープをグル−プ化したあとのマクロについて』 (初心者)
オートシェープを複数つくりました。マクロでそれぞれ中に文字を 書いたり、線の色を変更したりしています。 そのオートシェープをグル−プ化し、マクロを実行化すると対象の オートシェープがないとのエラーになります。 グループ化したあとのそれぞれのオートシェープにたいするマクロの 実行はどのようにコードを書くのでしょうか。
> そのオートシェープをグル−プ化し、マクロを実行化すると対象の > オートシェープがないとのエラーになります。 > グループ化したあとのそれぞれのオートシェープにたいするマクロの > 実行はどのようにコードを書くのでしょうか。
私自身は図形に興味がないので、実際にやった事ありませんが、XL2007のヘルプによると、
『グループ化された図形は 1 つの図形として扱われる・・』
となっていますので、グループ化前の一図形を分離処理したい場合は、 当該Shapes.RangeをUngroupメソッドでグループ化前に戻し、 所要処理を実行後、再度、Regroupメソッドで元のグループ戻す。
と云うことになりそうな気がします。
(半平太) 2010/08/29 15:31
半平太さん。ありがとうございます。やってみます。 結果については後ほど書き込みさせて頂きます。(初心者)
やってみた結果ですが、 オートシェープ1とオートシェープ2をグループ化して グループ1にしました。 マクロの自動記録でこのグループ1のグループ化の解除を 記憶しました。 マクロでグループを解除したことで オートシェープ1とオートシェープ2にマクロは実行できました。 が 再度、オートシェープ1とオートシェープ2をグループ化すると グループ2になりました。 グループを解除をするマクロのコードが対象がグループ1のままなので エラーとなります。 一旦グループ化したグループの解除/再グループ化を実行するには そうすえばいいでしょうか。グループはひとつなので、全グループ のグループの解除とか、グループに名前をつけて、名前で解除とか そういった方法があるのかどうか全くわかりませんが、もしあれば 教えていただけないでしょうか。(初心者)
>グループはひとつなので、 グループがひとつなら、名前(例:グループ1) で特定せず、(それは一定でないから) インデックス番号で指定したら如何ですか?(それは常に1番です・・・と思う)
例: Shapes.Range(1).Ungroup グループ化解除 Shapes.Range(1).Regroup 再グループ化
(半平太) 2010/08/29 19:44
半平太さん、再度の説明ありがとうございます。すぐに書き込みできず すみません。マクロのコードをかくことがあまり経験がなく説明して頂いて いることが飲み込めなくてすみません。 (それは常に1番です・・・と思う)とは Shapes.Range(1).Ungroupの1は1固定ということでしょうか。今グループ 化したグループの番号は何回も登録、解除を繰り替えしているので26に なっています。 Shapes.Range(26).Ungroup とし実行すると、実行時エラー 424(オブジェクトが必要)となります。 1とはグループ番号を1にする必要があるということでしょうか。(初心者)。
後戻りして済みませんが、最初に前提を明確にしていただけますか?
1.コードはどこに書かれていますか?(シート/標準)
2.オリジナルの図形の数は幾つありますか? (1)2つだけで、それをグループ化しているだけ? (2)沢山あるが、グループ化しているのはその内の特定の2つだけ? (3)増減するが、グループ化しているのはその内の特定の2つだけ?
(半平太) 2010/08/30 06:00
<追記> 3.バージョンによって、出来ることが違って来そうなので、エクセルのバージョンも教えてください。
Groupメソッド及び、Regroupメソッド共にグループ化及び、再グループ化された 図形オブジェクトを返しますから、これにユニークな名前を付けたらどうですか?
新規ブックにて、標準モジュールに
'================================================================ Option Explicit Sub test() Const gshp = "グループ化された図形" Dim g0 As Long Dim nm(1 To 2) Dim shp As Shape With ActiveSheet .DrawingObjects.Delete With .Rectangles.Add(100, 100, 100, 100) nm(1) = .Name End With With .Ovals.Add(100, 100, 100, 100) nm(2) = .Name End With DoEvents MsgBox "二つの図形をグループ化します" With .Shapes.Range(nm()).Group .Name = gshp End With DoEvents MsgBox "二つの図形をグループ化しました" & vbCrLf & _ "このグループ化された図形を赤と青に塗りつぶします" g0 = 12 For Each shp In .Shapes(gshp).GroupItems shp.Fill.ForeColor.SchemeColor = g0 g0 = 10 Next '↑一部の処理はグループ化解除しなくても可能 DoEvents MsgBox "円の中にichinoseと書き込みます" .Shapes(gshp).Ungroup With .Shapes(nm(2)) .TextFrame.Characters.Text = "ichinose" 'テキストの書き込みは、Excel2002では解除しなくてはできなかった End With With .Shapes.Range(nm(2)).Regroup .Name = gshp End With End With End Sub
上記のtestを実行し、コードと処理を照らし合わせてください。
ichinose
初心者です。 まず、半平太さん、ichinoseさん、にお詫します。せっかく教えて頂いて いるのに返事が大変遅くなり申し訳けありません。当方の環境がオンライ のPCにすぐ触れる環境ではなく、実際の運用しているPCはオフライン なのでオフラインPCで確認してオンラインのPCかこうしてアクセス をしています。
まず、半平太さんへのご返事でですが EXCELはEXCEL2003です。
作成しているコードですが マクロの自動記録で作成して Sub Macro8() 'オ-トシェ-プ1の色を変える ' Macro8 Macro
ActiveSheet.Shapes("Oval 1").Select Selection.ShapeRange.Fill.Visible = msoTrue Selection.ShapeRange.Fill.Solid Selection.ShapeRange.Fill.ForeColor.SchemeColor = 53 Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoTrue Selection.ShapeRange.Line.ForeColor.SchemeColor = 64 Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255)
Sub Macro9()
' Macro9 Macro 'オ-トシェ-プ2の色を変える
ActiveSheet.Shapes("Oval 2").Select Selection.ShapeRange.Fill.Visible = msoTrue Selection.ShapeRange.Fill.Solid Selection.ShapeRange.Fill.ForeColor.SchemeColor = 48 Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoTrue Selection.ShapeRange.Line.ForeColor.SchemeColor = 64 Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255) End Sub
Sub Macro10()
' Macro10 Macro 'オ-トシェ-プ1、オ-トシェ-プ2の色を変える
ActiveSheet.Shapes("Oval 1").Select ActiveSheet.Shapes.Range(Array("Oval 1", "Oval 2")).Select Selection.ShapeRange.Fill.Visible = msoTrue Selection.ShapeRange.Fill.Solid Selection.ShapeRange.Fill.ForeColor.SchemeColor = 43 Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoTrue Selection.ShapeRange.Line.ForeColor.SchemeColor = 64 Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255) End Sub
オ-トシェ-プ1とオ-トシェ-プ2をグループ化をする(グループ30)というグループ ができる
Sub Macro8()を実行すると 実行時エラー1004となります
具体的な説明は以上ですが 説明不足ですみませんでした
ichinoseさん。コードのご提示ありがとうごじました。 教えて頂いたコードを1ステップずつ実行し結果を確認しました。 私のイメージではわかる範囲では以下になります。 結果的には今ある図形は全て消し、青の四角、赤の丸ができグループ化する グループを解除し丸のオ-トシェ-プnm(2)の中に 「ichinose」と書き込み 再グループをする ・・・結果からはこうなると思うのですが 最後のほうの With .Shapes.Range(nm(2)).Regroup これがイメージがわきません。 Regroup(リグループ)のイメージがわかりません。nm(2)ひとつの オ-トシェ-プをグループ化しているように見えます。・・・どういう風に 理解すればいいのでしょう。
>上記のtestを実行し、コードと処理を照らし合わせてください。との ことですが、やはりチンプンカンプンで、具体的にどうすれば今ある グループ化してある複数のオ-トシェ-プを一旦グループ化解除して各 オ-トシェ-プの設定を変更すればいいのかがイメージできません。 よろしければ教えて頂けないでしょうか
Option Explicit Sub test() Const gshp = "グループ化された図形" Dim g0 As Long Dim nm(1 To 2) Dim shp As Shape With ActiveSheet .DrawingObjects.Delete '(初心者)シート上の図形をすべて消す With .Rectangles.Add(100, 100, 100, 100) '(初心者)四角を書く(100はサイズと思います) nm(1) = .Name '(初心者)自動的に四角につけられら名前をnm(1)へ書き込み End With With .Ovals.Add(100, 100, 100, 100) '(初心者)丸を書く(100はサイズと思います) nm(2) = .Name '(初心者)自動的に丸につけられら名前をnm(2)へ書き込み End With DoEvents '(初心者)わかなない MsgBox "二つの図形をグループ化します" '(初心者)上記MSGBOXを出す With .Shapes.Range(nm()).Group '(初心者)対象となった図形・・・ここではnm(1)とnm(2)をグル-プ化 .Name = gshp '(初心者)グループ化された図形’という名をつける End With DoEvents MsgBox "二つの図形をグループ化しました" & vbCrLf & _ "このグループ化された図形を赤と青に塗りつぶします" '(初心者)上記MSGBOXを出す g0 = 12 '(初心者)ここもやや不明ですが 0〜12までという意味かな For Each shp In .Shapes(gshp).GroupItems '(初心者)ここもわかりません shp.Fill.ForeColor.SchemeColor = g0 '(初心者)該当オ-トシェ-プにg0に入っている数字の色をつける' g0 = 10 '(初心者)g0〜10まで すぐ上でg0 = 12があるのにここでg0 = 10もよくわかりません Next '(初心者)次へ'
'↑一部の処理はグループ化解除しなくても可能 DoEvents '(初心者)わかりません MsgBox "円の中にichinoseと書き込みます" '(初心者)上記MSGBOXを出す .Shapes(gshp).Ungroup '(初心者)グループ「グループ化された図形」を解除 With .Shapes(nm(2)) '(初心者)nm(2)のオ-トシェ-プに以下の処理をする .TextFrame.Characters.Text = "ichinose" '(初心者)該当のオ-トシェ-プにichinoseと記入 'テキストの書き込みは、Excel2002では解除しなくてはできなかった End With With .Shapes.Range(nm(2)).Regroup '(初心者)ここが一番わかりません。nm(2)のみしか再グループかしていないような 'nm(1)とnm(2)をグルプするのではないのかな? でも2つがグループになっています。
.Name = gshp 'グループ化された図形というグループ名をつける End With End With End Sub 実際のマクロコードの箇所を本文に貼り付けました。醜くてすみません。
また、すぐに見れる環境ではないので、ご返事が遅くなる可能性がありますが よろしくお願いします。
提示したコードに対して、これだけきちんと疑問をぶつけてこられたのは、 このサイトでは記憶にないくらい久しいなあ。
さて、全体の処理は、 >今ある図形は全て消し、青の四角、赤の丸ができグループ化する >グループを解除し丸のオ-トシェ-プnm(2)の中に 「ichinose」と書き込み >再グループをする
このとおりです。 図形を全て削除したのは、このコードを何回も繰り返し実行できるようにするためです。
再グループ化は、以前グループ化されていれば、そのグループ化を再現する 機能ですよね? これ、ひとつの図形だけで処理が可能なんです。 ご自分で 二つ図形を作成し、グループ化して、解除し、 その一つのだけを選択し、右クリック---グループ化----再グループ化で 以前行ったグループ化が再現できることを確認してください。
よって、.Shapes.Range(nm(2)).Regroup このコードでnm(2)という名前で定義された図形が直前にグループ化された状態に 復元できます。
Msgbox "・・・・・" 直前の Doevents は、図形に処理した途中経過(図形を作成したり、色をつけたり等)がわかるように一度、Windowsに制御を戻しています。
これを入れないと、Msgboxでの途中経過を表示することができませんでした(Excel2002で確認)。 こういう意味ですから、図形を作成し、グループ化して、色付けして 文字を入れる という最後の結果だけが求められるなら、要りません。DoEventsをとって 実行して違いを確認してください。
>g0 = 12 '(初心者)ここもやや不明ですが 0〜12までという意味かな >For Each shp In .Shapes(gshp).GroupItems > '(初心者)ここもわかりません > shp.Fill.ForeColor.SchemeColor = g0 > '(初心者)該当オ-トシェ-プにg0に入っている数字の色をつける' > g0 = 10 > '(初心者)g0〜10まで すぐ上でg0 = 12があるのにここでg0 = 10もよくわかりません > Next '(初心者)次へ' ここは、グループ化された図形 と命名されたグループ化した図形から、グループ化された図形を取り出しています。
ここでは、二つの図形がグループ化されていますから、 その一つは 青(色番号12)、もう一つは赤(色番号10)で塗りつぶしています。
コードの説明は以上ですが、
このコードでグループ化した図形に予め用意した名前(コードでは、グループ化された図形) を用意して、グループ化するたびにその名前で命名すればよい という例を 示したつもりだったのですが、初心者さんが提示されたコードを拝見すると、 このコード例では初心者さんの要件を満たしていないかもしれません。
>オ-トシェ-プ1とオ-トシェ-プ2をグループ化をする(グループ30)というグループ ができる
これのコードを提示されないのは、これはコードではなく、手動操作で行っているということですか?
Macro8〜Macro10を対象図形がグループ化されていてもいなくても
作動できるようにしたいという意味でしょうか?
そうだとしたら、Macro8からMacro10でそのようなチェック処理をしなければなりません。
そうではなく、 図形のグループ化もコードで行うならその都度特定の名前をつければ 処理が可能になると思います。
ichinose
> 作成しているコードですが 1.私は、具体的なコードをお聞きしたのではなく(そこまでは立ち入らない)、 コードが書かれている場所(シートモジュール か 標準モジュール)を、 お尋ねしただけです。それによって、コードの書き方が変わる為です。
まぁ、「マクロの自動記録で作成」とのことなので、 標準モジュールであろうことは、結果的には分かりました。
>オリジナルの図形の数は幾つありますか? >(1)2つだけで、それをグループ化しているだけ? >(2)沢山あるが、グループ化しているのはその内の特定の2つだけ? >(3)増減するが、グループ化しているのはその内の特定の2つだけ? 2.私は「グループはひとつ」と云うことしか分かっていないので、 グループ化しない図形が他にもあるのかどうか知りたかったのです。 (図形の状況が決め打ちできるなら、コードが単純になる為です→代わりに、柔軟性は無くなりますけどね。)
ただ、こんなこと何回もお聞きするのは無駄なので、 「他にも図形はあるが、クループ化しているのは、Shapes("Oval 1")とShapes("Oval 2")だけ」 と云う前提とします。
3.さて、上記2つの図形は(手動であれ、マクロであれ) 「既にグループ化されている状態」を出発点として考えます。
※ Macro8 を実現するにはtest8 ※ Macro9 を実現するにはtest9 ※ Macro10を実現するにはtest10を実行する
<考え方> (1)Functionプロシージャで以下の処置をして、グループ名を取得する。 図形を片っ端から読んで、グループ化されたものかどうか判断し、 グループ化されたものがあれば、それが処理対象の図形なので、 そのグループ名を返させる。
(2) グループ名が分かったら、そのグループ名を使って、グループを解除する。
(3)Macro(8or9or10)を実行して、色づけする。
(4)色づけ終了後、再グループ化する。(→出発点に戻る)
Sub test8() ActiveSheet.Shapes(GrName).ungroup Macro8 ActiveSheet.Shapes("Oval 1").Select Selection.ShapeRange.regroup End Sub
Sub test9() ActiveSheet.Shapes(GrName).ungroup Macro9 ActiveSheet.Shapes("Oval 1").Select Selection.ShapeRange.regroup End Sub
Sub test10() ActiveSheet.Shapes(GrName).ungroup Macro10 ActiveSheet.Shapes("Oval 1").Select Selection.ShapeRange.regroup End Sub
Function GrName() Dim Shp As Shape Dim grpFactor As Shape Dim isGroup As Boolean
For Each Shp In ActiveSheet.Shapes On Error Resume Next Set grpFactor = Shp.GroupItems(1) If Err.Number <> 0 Then isGroup = False Else isGroup = True End If On Error GoTo 0
If isGroup Then GrName = Shp.Name Exit For End If Next
End Function
(半平太) 2010/08/31 14:02
初心者さんが疑問視している部分についてですが、何もないシートで↓を何度も実行すると、オートシェープに勝手に付く名前やグループ化したときの名前の番号がどんどん加算されるのはおわかりだと思います。
要するに何も指定しないと、名前がどんどん変化していってしまうということですね。
Sub test() ActiveSheet.DrawingObjects.Delete
ActiveSheet.Rectangles.Add(20, 20, 50, 50).Select ActiveSheet.Ovals.Add(40, 40, 50, 50).Select ActiveSheet.Shapes.Range(Array(1, 2)).Select Selection.ShapeRange.Group ActiveSheet.Shapes.Range(Array(1)).Select Selection.ShapeRange.Ungroup ActiveSheet.Shapes.Range(Array(1)).Select Selection.ShapeRange.Regroup End Sub
でも、このコードでは常に選択できていますよね?
それはindexと呼ばれる番号で図形を指定しているからで、オートシェープが2個しかないときは1と2で、グループ化して1個になってしまったら1なわけです。名前がなんであろうと関係ありません。
このあたりが 半平太さん が説明している部分なんですが、では2個あるときのどっちが1でどっちが2か? というのは図の前後関係で変化するので、オートシェープがたくさんある場合は特定が困難です。
また、オートシェープが3つあって、うち2つをグループ化するなんていう状況だと、対象のオートシェープを特定するのが更に大変ですよね?
このあたりを踏まえれば 半平太さん が質問していることがわかってくると思います。
で、ichinoseさん のほうは、勝手に変化していってしまう名前を自分で付けかえてしまえばえ〜じゃないか、というやり方です。
"グループ1"だろうが"グループ30"だろうが、"グループ化された図形"に付けかえるということですね。
(ramrun)余計なお世話かな
>これのコードを提示されないのは、これはコードではなく、手動操作で行っていると うことですか?
>Macro8〜Macro10を対象図形がグループ化されていてもいなくても作動できるようにしたいという意味でしょうか?
こういう意味だとすると結構厄介でした。
新規ブックにて試してください。
まず、標準モジュール(Module1)に、サンプルの図形を作成します。
'================================== Option Explicit Sub 準備() With ActiveSheet .DrawingObjects.Delete With .Shapes.AddShape(msoShapeOval, 100, 100, 100, 100) .Name = "Oval1" End With With .Shapes.AddShape(msoShapeOval, 125, 125, 50, 50) .Name = "Oval2" End With End With End Sub
別の標準モジュール(Module2)に初心者さんが提示された Macro8〜Macro10の変更コード
'=============================================================== Sub Macro8() With open_shp(ActiveSheet, "Oval1") .Fill.Visible = msoTrue .Fill.Solid .Fill.ForeColor.SchemeColor = 53 .Fill.Transparency = 0# .Line.Weight = 0.75 .Line.DashStyle = msoLineSolid .Line.Style = msoLineSingle .Line.Transparency = 0# .Line.Visible = msoTrue .Line.ForeColor.SchemeColor = 64 .Line.BackColor.RGB = RGB(255, 255, 255) End With Call close_shp End Sub '=========================================================== Sub Macro9() With open_shp(ActiveSheet, "Oval2") .Fill.Visible = msoTrue .Fill.Solid .Fill.ForeColor.SchemeColor = 48 .Fill.Transparency = 0# .Line.Weight = 0.75 .Line.DashStyle = msoLineSolid .Line.Style = msoLineSingle .Line.Transparency = 0# .Line.Visible = msoTrue .Line.ForeColor.SchemeColor = 64 .Line.BackColor.RGB = RGB(255, 255, 255) End With Call close_shp End Sub '============================================= Sub Macro10() Dim pa1 As Object Dim pa2 As Object With open_shp(ActiveSheet, "Oval1") Set pa1 = get_parent End With Call close_shp With open_shp(ActiveSheet, "Oval2") Set pa2 = get_parent End With Call close_shp With ActiveSheet.Shapes.Range(Array(pa1.Name, pa2.Name)) .Fill.Visible = msoTrue .Fill.Solid .Fill.ForeColor.SchemeColor = 43 .Fill.Transparency = 0# .Line.Weight = 0.75 .Line.DashStyle = msoLineSolid .Line.Style = msoLineSingle .Line.Transparency = 0# .Line.Visible = msoTrue .Line.ForeColor.SchemeColor = 64 .Line.BackColor.RGB = RGB(255, 255, 255) End With End Sub 又、別の標準モジュール(Module3)にグループオブジェクトの個々のオブジェクトを 管理するプロシジャー群
'================================================================ Option Explicit Private shtsv As Object Private p_shp As Object Private shp As Object Private s_type As Long '0: 通常の図形 1:グループ化された図形 '============================================================ Function open_shp(sht As Object, shpnm As Variant) As Variant On Error Resume Next Dim obj As GroupObject Dim ret As Long Set p_shp = Nothing Set shp = Nothing Set shtsv = sht ret = 1 For Each obj In shtsv.GroupObjects For Each shp In obj.ShapeRange.GroupItems If shp.Name = shpnm Then ret = 0 Set p_shp = obj.ShapeRange(1) s_type = 1 Exit For End If Next If ret = 0 Then Exit For Next If ret = 1 Then Err.Clear Set shp = shtsv.Shapes(shpnm) If Err.Number = 0 Then s_type = 0 Else Set shp = Nothing End If End If Set open_shp = shp End Function '============================================================ Function get_parent() As Object Set get_parent = IIf(s_type = 0, shp, p_shp) End Function '============================================================ Sub put_prp(obj, prp As String, vvalue As Variant) Dim snm As String If s_type = 0 Then CallByName obj, prp, VbLet, vvalue Else snm = shp.Name p_shp.Ungroup CallByName obj, prp, VbLet, vvalue Set p_shp = shtsv.Shapes.Range(snm).Regroup End If End Sub '============================================================ Sub close_shp() Set shtsv = Nothing Set p_shp = Nothing Set shp = Nothing s_type = 0 End Sub
コードは、以上です。
まず、準備を実行してサンプル図形を作成してください。
作成された図形に対してそのまま、Macro8〜Macro10を実行してみてください。 正常に作動しますね!!
次にMacro8〜Macro10で付けられた色を塗りつぶしなしに戻してください。
二つの円をグループ化してください。
再度、Macro8〜Macro10を実行してみてください。
グループ化しないで実行した時と同じように正常に処理されるはずです。
試してみてください。
ichinose
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.