goo blog サービス終了のお知らせ 

半角チルダ

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

■xl2010:DisplayFormat オブジェクト

2013-12-02 18:00:00 | 雑記
#ゃー。久し振りだからblogの書き方忘れてる.. X)

excel2010条件付き書式後にVBAにて処理 - 教えて!goo

最近、無沙汰な感じだけど、やっぱりQ&A掲示板に出入りしてると良い事あるなぁ。
2010から「条件付き書式」の結果書式を取得できるオブジェクトが追加されてた。
勉強になりました。
ありがとうございます。 :)

DisplayFormat オブジェクト
>範囲の条件付き書式または表のスタイルの変更などの操作が行われると、
>現在のユーザー インターフェイスの表示と Range オブジェクトの対応するプロパティとの間に
>矛盾が生じる可能性があります。
>DisplayFormat オブジェクトのプロパティを使用すると、
>現在のユーザー インターフェイスの表示に対応する値を取得できます。

「条件付き書式」用というわけではなくて、表示全般に対してのようだけど、
■xl2007:条件付き書式の色設定だけ残す
..みたいな事やらなくてよくなったのは進歩かも。
Sub try()
  Dim r As Range
  Set r = Workbooks.Add.Sheets(1).Range("A1")
  r.FormatConditions.Add(Type:=xlExpression, Formula1:="=A1<>""""").Font.Color = vbRed
  r.Value = "条件付き書式で赤"
  MsgBox r.DisplayFormat.Font.Color
End Sub



Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

■PivotTables().SourceDataプロパティとListObject

2012-11-27 13:00:00 | 雑記
いつまでもカンニングしたやつがトップページなのもなんなので
久しぶりに回答したトピックから...

『ピボットテーブルの参照元のワークシート名を取得するには?』
http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+201211/12110039.txt
#ぃや大した話ではないのだが覚え書き的に。
#ちなみにポイントはそこではないよ。Range(名前定義)なだけ。


SourceTypeがxlDatabase、つまりExcelリストまたはデータベースから作ったピボットテーブルの場合。
そのピボットテーブルの参照元を取得するにはどうしたらよいか。

ピボットテーブルの参照元はSourceDataプロパティから取れる。
このSourceDataプロパティはセル参照の文字列である。
順当に考えればこれを利用するだけで良いはず。

Sub try()
  Dim p As PivotTable
  Dim s As String
  Dim r As Range

  For Each p In ActiveSheet.PivotTables
    s = p.SourceData
    s = Application.ConvertFormula(s, xlR1C1, xlA1)
    Set r = Range(s)
    Debug.Print r.Address
  Next
End Sub

普通にセル範囲を指定してピボットテーブルを作成したら
SourceDataはR1C1形式のセル参照文字列になる。
Application.ConvertFormulaメソッドを使ってRangeに受けたら後は煮るなり焼くなり...

#余談
#Rangeプロパティの引数はA1形式なのでConvertFormulaを使う。
#例えばApplication.ReferenceStyleがxlR1C1だったらR1C1形式で良いかというとそんな事はない。
#ぃや、そこは別に実験するとこじゃないだろ>end-u



さて。
ピボットテーブル作成時にListObjectを指定したり、定義した名前で指定したりすると、
SourceDataはセルアドレスではなく名前文字列になる。

#以下記事はVer2007以降が対象。

Sub test()
  '新規Book追加、A1:A2にデータセット、ListObjectセット、PivotTable2個追加してテスト。
  Dim ws As Worksheet
  Dim r As Range
  Dim p As PivotTable

  With Workbooks.Add(xlWBATWorksheet)
    Set ws = .Sheets(1)
    Set r = ws.Range("A1:A2")
    r.Value = [{"a1";"a2"}]
    ws.ListObjects.Add(xlSrcRange, r, , xlYes).Name = "table1"

    .PivotCaches.Create(SourceType:=xlDatabase, _
              SourceData:="table1" _
              ).CreatePivotTable ws.Range("D1"), "pivot1"
    .PivotCaches.Create(SourceType:=xlDatabase, _
              SourceData:=r _
              ).CreatePivotTable ws.Range("H1"), "pivot2"

    For Each p In ws.PivotTables
      Debug.Print p.Name, p.SourceData, _
            Range(Application.ConvertFormula(p.SourceData, xlR1C1, xlA1)).Address
    Next

  End With
End Sub

結果はこんな感じ。

pivot2 Sheet1!R1C1:R2C1 $A$1:$A$2
pivot1 table1      $A$2

Indexが逆転(?)なのは置いといて。
SourceDataが名前文字列になっているのが確認できる。

厄介なのは Range("table1").Address が $A$2 となっているように、「見出し」を含んでくれていない事。
この"table1"はListObjectそのものではなく名前として定義されたもの。

冒頭リンクスレッドのようにWorksheet.Nameを取得するだけなら簡単だが
参照元範囲をRangeに取得したいとなると、
元データがListObjectの場合はもう少し工夫が必要になりそうだ。
Range(p.SourceData).ListObject.Range
で全体が取得できるのだが、ListObject範囲外ではエラーになる。
通常の名前定義のケースとの識別も必要だから、分岐処理が妥当なセンだろうか。
Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

■Excel2010の選択したセルのみをhtmlに

2012-07-09 20:00:00 | 雑記
#ボツ回答シリーズ..
#ゃ、単に間に合わなかっただけ :)


Excel2010の選択したセルのみをhtmlに - 教えて!goo

あれ。なかったっけ?
..と、確認してみたけど

pngFile:end-uのXPにはあるのになー?

質問者さんの環境
>OSはwindows7 Home Premium 64bit SP1で、Excel2010の質問です。
..に対して、上の画像はwinXPsp3のもの。

OSによってメニュー構成が変わる?
#ぁー・・他にもなんかあったような気が。?
#謎だ..
Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

■非Activeシートのセル遷移

2011-09-24 18:00:00 | 雑記
ActiveではないSheetのSelectionCell位置を変更したい..
..ニーズは全くないと思いますが :)

例えばSheetが2枚以上ある新規Bookの標準モジュールで

Sub test()
  Range("IV65536").Copy
  Sheets("Sheet1").Range("X1").PasteSpecial xlPasteComments
  Application.CutCopyMode = False
End Sub

これをSheets("Sheet1")がActiveではない状態で実行したとして、
Sheet1の選択セルがX1に変更されます。
PasteSpecialメソッドの特性を悪用
xlPasteComments..は一番無難そうなオプションかと。

ちなみにSheet1にSelectionChangeイベントがあると反応します。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  MsgBox Target.Address(external:=True)
End Sub



#雑記というよりゴミでしたか
#久しぶりの書き込みだったのに...orz
Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

■Chart.Shapes.AddLine

2011-02-26 21:00:00 | 雑記
Excel2007の株価チャートに水平線を引く方法 - 教えて!goo
#もしかしてChartに線ひくのが流行り?
前回記事の別解..というか蛇足。


Option Explicit

Sub 準備() 'Sheet追加しダミーデータセット、Chart作成
  Dim ws As Worksheet

  Set ws = Sheets.Add
  ws.Range("A1:D1").Value = Array("日付", "数値", "タテ軸", "ヨコ軸")
  ws.Range("A2:D2").Value = Array(#1/1/2011#, "=INT(RAND()*100)", #1/15/2011#, 55)
  With ws.Range("A2:B22")
    .Range("A1:B1").AutoFill Destination:=.Cells, Type:=xlFillDefault
    .Columns(1).NumberFormat = "m/d"
    .Range("C1").NumberFormat = "m/d"
    .Columns(2).Value = .Columns(2).Value
  End With
  With ws.ChartObjects.Add(ws.Range("D4").Left, ws.Range("D4").Top, 300, 200).Chart
    .ChartType = xlLine
    .HasLegend = False
    .SetSourceData Source:=ws.Range("A2:B22"), PlotBy:=xlColumns
  End With
  Set ws = Nothing
  Call try
End Sub
'-------------------------------------------------
Sub try()
  With ActiveSheet.ChartObjects(1).Chart
    With .Shapes.AddLine(0, 0, 0, 0)
      .Name = "タテ"
      .Line.ForeColor.RGB = RGB(0, 255, 0)
      .Line.DashStyle = msoLineDash
    End With
    With .Shapes.AddLine(0, 0, 0, 0)
      .Name = "ヨコ"
      .Line.ForeColor.RGB = RGB(255, 0, 0)
      .Line.DashStyle = msoLineDash
    End With
  End With
  Call stry
End Sub
'-------------------------------------------------
Sub stry()
  Dim T  As Single 'y軸のTop位置
  Dim H  As Single 'y軸のHeight
  Dim L  As Single 'x軸のLeft位置
  Dim W  As Single 'x軸のWidth
  Dim mxy As Single 'y軸最大値
  Dim gpy As Single 'y最大値と最小値の差
  Dim mnx As Single 'x軸最小値
  Dim gpx As Single 'x最大値と最小値の差
  Dim x
  Dim y

  On Error GoTo errHndlr
  With ActiveSheet
    x = .Range("C2").Value
    y = .Range("D2").Value
    With .ChartObjects(1).Chart
      With .Axes(xlValue)
        T = .Top
        H = .Height
        mxy = .MaximumScale
        gpy = mxy - .MinimumScale
      End With
      With .Axes(xlCategory)
        L = .Left
        W = .Width
        mnx = .MinimumScale
        gpx = .MaximumScale - mnx
      End With
      With .Shapes("タテ")
        .Left = (x - mnx) * W / gpx + L
        .Top = T
        .Height = H
      End With
      With .Shapes("ヨコ")
        .Top = (mxy - y) * H / gpy + T
        .Left = L
        .Width = W
      End With
    End With
  End With
errHndlr:
  If Err.Number <> 0 Then MsgBox Err.Number & "::" & Err.Description
End Sub




#LineShapeなのでセルと連動してない。シート側にイベントプロシージャが必要。

Comment (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする