半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■VBAで「図形に合わせて塗りつぶしを回転する」設定

2009-11-16 22:00:00 | VBA Tips
2003では、ShapeのFillFormat[塗りつぶし効果]-[グラデーション]タブに「図形に合わせて塗りつぶしを回転する」チェックボックスがあります。
これは手作業で[グラデーション]を設定すると、ONが既定のようで、自動的にチェックが付きます。
ところがVBAから設定すると、OFFのままなんですね。

Sub test()
  ActiveSheet.Shapes.AddShape(msoShapeRectangle, 100, 100, 100, 100) _
        .Fill.OneColorGradient msoGradientHorizontal, 1, 0
End Sub

pngFile:実行イメージ

FillFormatのプロパティを探っても、それらしきものが無いようです。非表示メンバにも見当たりません。
コードからのアクセスが許可されていない、もしくは公開されていないという事でしょうか。
Shapeごとに設定が保存されている事は確かなんですが。

...という事で、無理矢理設定してみます。かなりのムリすぎ...orz

Option Explicit

Sub try()
  Dim sp As Shape

  Application.ScreenUpdating = False
  Set sp = fRotateShape(ActiveSheet, msoShapeRectangle)
  With sp
    .Left = 100
    .Top = 100
    .Width = 100
    .Height = 100
    '.Fill.OneColorGradient msoGradientVertical, 1, 0
  End With
  Set sp = Nothing
  Application.ScreenUpdating = True
End Sub
'---------------------------------------------------------------------
Function fRotateShape(ByRef ws As Worksheet, _
           ByVal sType As Long) As Shape
  Dim wrk As String
  Dim tmp As String
  Dim n  As Long

  wrk = Application.DefaultFilePath & "¥rotatetemp.htm"
  Application.ScreenUpdating = False
  With Workbooks.Add(xlWBATWorksheet)
    .Sheets(1).Shapes.AddShape(sType, 0, 0, 0, 0) _
         .Fill.OneColorGradient msoGradientHorizontal, 1, 0
    Application.DisplayAlerts = False
    .SaveAs Filename:=wrk, FileFormat:=xlHtml
    Application.DisplayAlerts = True
    .Close False
  End With

  n = FreeFile
  Open wrk For Input As #n
  tmp = StrConv(InputB(LOF(n), #n), vbUnicode)
  Close #n
  tmp = Replace$(tmp, "method=", "rotate=""t"" method=")
  n = FreeFile
  Open wrk For Output As #n
  Print #n, tmp
  Close #n

  With Workbooks.Open(wrk, ReadOnly:=True)
    .Sheets(1).Shapes(1).Copy
    .Close False
  End With
  With CreateObject("Scripting.FileSystemObject")
    .GetFile(wrk).Delete
    .GetFolder(Replace$(wrk, ".htm", ".files")).Delete
  End With
  With ws
    .Paste
    Set fRotateShape = .Shapes(.Shapes.Count)
  End With
  Application.ScreenUpdating = True
End Function

htmファイルに吐き出して、ShapeのFill設定にrotate="t"を追加するわけです。
<v:fill color2="fill darken(0)" rotate="t" method="linear sigma" focus="100%" type="gradient"/>

もっと簡単にできる方法があったら笑いものだよなぁ...

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■教えて!gooユーザープロフ... | TOP | ■「図形に合わせて塗りつぶし... »
最新の画像もっと見る

post a comment

ブログ作成者から承認されるまでコメントは反映されません。

Recent Entries | VBA Tips