2010年1月アーカイブ

仕事をしていると必ず必要になるのが工程表ですが、これは専らExcelで作られることが多いです。かくいう自分も自分のニーズに合わせた工程表を作って管理をしています。工程表で予定と実績を示すラインはオートシェイプで描画していますが、これまでは手入力のオートシェイプでした。または元からあるラインをコピーして伸縮して使っていました。

これをVBAで自動描画出来ないかと考え、Shapeの描画について調べてみました。

最初にラインを引くメソッドをヘルプで検索してみました。

expression.AddLine(BeginX, Beginy, EndX, EndY)

BeginX, BeginY : 開始点のX,Y座標 As Single
EndX, EndY : 終了点のX,Y座標 As Single

それでは、狙った場所にラインを引くにはどうしたらよいでしょうか。狙った場所は選択範囲とすれば何かプロパティ値が取得できるような気がします。そこで調べてみると、以下の図のようなプロパティ値が取得できることが分かりました。

 

選択範囲については、まず左上の座標値(ピクセル単位)が取得できます。さらに幅と高さのピクセル数およびセル数が分かります。また、左上と右下のセルは特定でき、行番号および列番号が取得できます。

ラインを引く場合はピクセル座標値での指定なので、これらから計算させれば引くことが可能です。

それではコードです。ボタンを配置しておき、クリックでラインを引くようにします。

Private Sub CommandButton2_Click()

    Dim SentakuTop As Single      ' 選択範囲左上座標値 Y
    Dim SentakuLeft As Single     ' 選択範囲左上座標値 X
    Dim SentakuWidth As Single    ' 選択範囲幅
    Dim SentakuHeight As Single   ' 選択範囲高さ
    Dim SentakuAddress As String  ' 選択範囲アドレス
    Dim X0, Y0, X1, Y1 As Variant

    ' 選択範囲の取得(相対指定のExcel形式:ex. A1:A9)
    SentakuAddress = Selection.Address(ColumnAbsolute:=False, RowAbsolute:=False)

    ' 選択範囲左上の座標値および選択幅、選択高さを取得(ピクセル単位)
    With ActiveSheet.Range(SentakuAddress)
        SentakuTop = .Top
        SentakuLeft = .Left
        SentakuWidth = .Width
        SentakuHeight = .Height
    End With
            
    ' 工数ラインの開始座標、終了座標を計算
    X0 = SentakuLeft
    Y0 = SentakuTop + SentakuHeight / 2
    X1 = SentakuLeft + SentakuWidth
    Y1 = Y0
    
    ' 工数ラインをプロットする
    With ActiveSheet.Shapes.AddLine(X0, Y0, X1, Y1).Line
        .ForeColor.RGB = RGB(0, 0, 255)
        .Weight = 4
    End With

End Sub

選択範囲の取得は絶対指定でも良さそうです。

ちなみにLineFormatのプロパティは、オブジェクトブラウザで見ると以下のようになっています。

 

 

2010年、明けました。今年の抱負。

ついに2010年です。未だに宇宙旅行は実現されていないのですね。

そんな訳で、今頃となりましたが、明けましておめでとうございます。

今年はニュース系の話題は少し控え目にして、本来のプログラミングの方の記事を細々と書いていこうと思います。初心者なので参考にならないとは思いますがお付き合い下さい。

宜しくお願い致します。

カスタム検索
Access Counter
Powered by Movable Type 4.22-ja

2016年9月

Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30