半角チルダ

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

■条件付書式。数式はR1C1形式で。

2009-11-30 22:00:00 | 雑記
ん。
勘違いが間違いだったか...X(

『条件付書式設定のマクロ化コード』
http://moug.net/faq/viewtopic.php?t=47140
ActiveCell位置によっては条件付書式の数式のアドレスが思った通りにならないという話ですが、
仮にリンクスレッドに書かれた条件がB2セル基点だったとしても、

Sub try()
  With Sheets(1).Range("B2:C18").FormatConditions
    .Delete
    .Add Type:=xlExpression, _
       Formula1:="=ASC(RC2&RC3)<>""00"""
    .Item(1).Interior.ColorIndex = 6
  End With
End Sub

R1C1形式の数式を使うと、指定した範囲の1セル目を基点にした数式で設定できます。
なのでSelectは必要なかったンでした。

#でも2007では落とし穴の話があったようななかったような...
#気が向いたら検証しよっと
Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

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

2009-11-17 22:00:00 | VBA Tips
昨日の補足、というかついでに、「図形に合わせて塗りつぶしを回転する」ON|OFF切り替えてみるコード。

Option Explicit

Sub try_2()
  Dim sp As Shape

  Set sp = ActiveSheet.Shapes(1)
  If sp.Fill.Type = msoFillGradient Then
    Call fillRotate(sp) ', True)
  End If
  Set sp = Nothing
End Sub
'---------------------------------------------------------------------
Sub fillRotate(ByRef sp As Shape, _
        Optional ByVal flg As Boolean = False)
  Dim ws As Worksheet
  Dim wrk As String
  Dim tmp As String
  Dim n  As Long
  Dim L  As Single
  Dim T  As Single

  wrk = Application.DefaultFilePath & "¥rotatetemp.htm"
  Application.ScreenUpdating = False
  L = sp.Left
  T = sp.Top
  Set ws = sp.Parent
  With Workbooks.Add(xlWBATWorksheet)
    sp.Cut
    .Sheets(1).Paste
    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, "rotate=""t""", "")
  If flg Then
    tmp = Replace$(tmp, "method=", "rotate=""t"" method=")
  End If
  n = FreeFile
  Open wrk For Output As #n
  Print #n, tmp
  Close #n

  With Workbooks.Open(wrk, ReadOnly:=True)
    .Sheets(1).Shapes(1).Cut
    .Close False
  End With
  With ws
    .Paste
    With .Shapes(.Shapes.Count)
      .Left = L
      .Top = T
    End With
  End With
  ActiveCell.Activate
  With CreateObject("Scripting.FileSystemObject")
    .GetFile(wrk).Delete
    .GetFolder(Replace$(wrk, ".htm", ".files")).Delete
  End With

  Set sp = Nothing
  Set ws = Nothing
  Application.ScreenUpdating = True
End Sub

昨日と今日のコードは2003でしか検証してません。
2007ではhtmファイルを弄くる手法は全く使えません。

#ちなみに2007ではコードで[グラデーション]を設定すると、ON既定で自動的にチェックが付くようです。



#2010.08.21追記)
#最近気付いたけど2007から FillFormat.RotateWithObject Property が追加になってたんですね。
#コード制御可能です :)
Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

■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でシェアする