OpenOffice.org Basicでガントチャート
OpenOffice.org Basicを使ってガントチャート作成用マクロ ガントチャートforOOoを開発する手順を紹介していきます。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
データの初期設定 その6

最後に描画に必要な行数を数えます。休日の色分けやイナズマ線の描画を適切に行うため、前回作成したBinsの内容から必要な行数を計算します。

Sub setMaxRows

    Dim i As Integer
    Dim Row As Integer
    
    Row = 0
    For i = 1 To mdlBin.Count
        
        If 1 < i And Bins(i)._Depth = 0 And _
            oProperty._InsertSpaceBetweenCategory Then _
                Row = Row + 1
        
        Bins(i)._Row = Row + oProperty._TopRow + 3
        Row = Row + 1
        
    Next i
    
    If oProperty._DrawRows < Row Then
        MaxRows = Row
    Else
        MaxRows = oProperty._DrawRows
    End If
    
End Sub

Binsの数を数えているだけなのですが、プロパティに「分類間に1行の余白を入れる」という設定をされていた場合に一行を入れるための処理を行います。また、ここで数えている途中の行数をBinsに記録しておく事で、各分類や項目の描画位置を取得する事ができます。

最後に数えた行数がプロパティの描画行数より多ければ描画する最大行数を更新し、そうでなければプロパティの設定に従います。

スポンサーサイト

テーマ:OpenOffice.org - ジャンル:コンピュータ

データの初期設定 その5

次にデータをBinsに取込んでいきます。前回、データ管理ダイアログでの説明時は分類別のBinsについてのみ解説しましたが、描画の際には担当者別のBinsも必要になってきます。そこで、担当者別にBinsを作成する関数を作ります。基本的には分類別のものと大差ないのでそのままコピーして必要な部分を書き換えることにします。

mdlBins

Public Sub CreateBinsByPerson(Optional setAll)
    
    Dim i As Integer, j As Integer, k As Integer
    
    If IsMissing(setAll) Then setAll = True
    
    mdlCategory.LoadAll
    mdlItem.LoadAll
    mdlSchedule.LoadAll
    mdlPerson.LoadAll
    
    Redim Preserve Bins(0)
    
    For i = 1 To mdlPerson.Count
        
        AddBins(BINTYPE_PERSON, i, 0)
        
        For j = 1 To mdlItem.Count
            If Items(j)._PersonId = i And _
                (setAll Or Items(j)._Draw) Then
                    AddBins(BINTYPE_ITEM, j, 1)
            End If
        Next j
        
    Next i
    
    setItemsBeginAndEndDate
    
End Sub

実際に描画する際、実行時に下記のコードを使ってどちらの種類のBinsを作成するかを選択します。

Select Case oProperty._CategorizeType
    Case CATEGORIZETYPE_CATEGORY
        mdlBin.CreateBins(False)
    Case CATEGORIZETYPE_Person
        mdlBin.CreateBinsByPerson(False)
End Select

テーマ:OpenOffice.org - ジャンル:コンピュータ

データの初期設定 その4

終了日の計算ができれば、どの分類・項目・工程を描画するのかを決定する事ができるようになります。読込んだデータを走査し、そのデータが描画対象か否かを一つ一つ確認してフラグを設定し、描画しなくてはならない図形の数を数えています。

まずコードを示します。

Sub checkData
    
    Dim i As Integer
    Dim j As Integer
    Dim wk
    
    Dim ItemId As Integer
    Dim CategoryId As Integer
    Dim PersonId As Integer
    
    For i = 1 To mdlSchedule.Count
        
        With Schedules(i)
            
            wk = Schedules(i)
            
            ItemId = ._ItemId
            CategoryId = Items(ItemId)._CategoryId
            PersonId = Items(ItemId)._PersonId
            
            If (oProperty._CategorizeType = _
                    CATEGORIZETYPE_CATEGORY And _
                    Categories(CategoryId)._Visible = True ) _
                Or (oProperty._CategorizeType = _
                    CATEGORIZETYPE_PERSON And 0 < PersonId) Then
                
                If FirstDate < ._PlanBegin Then
                    If ._PlanEnd < ._PlanBegin Then _
                        ._PlanEnd = Int(wk._PlanBegin) + 1
                    If ._PlanBegin < oProperty._EndDate And _
                        oProperty._BeginDate < ._PlanEnd Then _
                        ._DrawPlan = True
                    Items(ItemId)._Plan = _
                        Items(ItemId)._Plan + _
                        (._PlanEnd - ._PlanBegin) * ._Weight
                End If
                
                If FirstDate < ._ActBegin Then
                    If ._ActEnd < ._ActBegin Then _
                        ._ActEnd = Int(wk._ActBegin) + 1
                    If ._ActBegin < oProperty._EndDate And _
                        oProperty._BeginDate < ._ActEnd Then _
                        ._DrawAct = True
                    Items(ItemId)._Act = Items(ItemId)._Act + _
                        (._ActEnd - ._ActBegin) * ._Weight
                End If
                
                If ._DrawPlan Or ._DrawAct Then _
                    Items(ItemId)._Draw = True
                
                j = 0
                If ._DrawPlan Then j = j + 1
                If ._DrawAct Then j = j + 1
                
                If ._LineType = LineType_Default Then _
                    ._LineType = oProperty._ChartBarType
                
                Select Case ._LineType
                    Case LineType_Rectangle
                        RectCount = RectCount + j
                    Case LineType_Line
                        LineCount = LineCount + j
                End Select
                
                If ._PlanColor < 0 Then ._PlanColor = _
                    oProperty._ChartBarPlanFillColor
                If ._ActColor < 0 Then ._ActColor = _
                    oProperty._ChartBarActFillColor
                
            End If
            
        End With
        
    Next i
    
    For i = 1 To mdlItem.Count
        
        With oProperty
            If ._PrintAllItems Or _
                (._PrintNotCompletedItem And _
                    Not Items(i)._Complete) Then
                    Items(i)._Draw = True
            End If
        End With
        
    Next i
    
    For i = 1 To 20
        If oProperty._BeginDate < Progresses(i) And _
            Progresses(i) < oProperty._EndDate Then _
                PrgsCount = PrgsCount + 1
    Next i
    
End Sub

まず全ての工程を走査し、工程の予定と実績から描画期間内にあるか否かを判断しています。
予定、実績の開始日がこのガントチャートforOOoの扱う2000年1月1日以降であるかを確認し、それ以降であれば割り当てられている項目に作業量を加算します。
工程を描画するのであればその項目を表示する必要があるので、項目の描画フラグを設定します。
そして、予定・実績の描画に必要なチャート線の数を数えて、設定された線種に合わせて図形数に加算します。また、色の設定をされていないものがあれば、プロパティから標準の色を割り当てます。

次に全ての項目を走査し、「全項目を表示する」や「未完の項目を表示する」というプロパティに合わせて項目の表示フラグを設定します。

最後に進捗(イナズマ)線のデータから必要なイナズマ線の本数を数えます。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データの初期設定 その3

プロパティの作成時にも多少触れましたが、このガントチャートではセルの単位を1日、1週間、10日間、1月間という4段階の調整ができるようになっています。そこで、描画の列数とこのセルの単位から描画する工程表の最終日を計算する必要があります。この作業にはいくつかの条件判断と面倒な計算を伴うので、これも関数として宣言してしまいます。

Sub CulcEndDate

    Dim y As Integer
    Dim m As Integer
    Dim d As Integer
    Dim wk As Date
    
    wk = oProperty._BeginDate
    y = Year(wk)
    m = Month(wk)
    d = Day(wk)
    
    With oProperty
        
        Select Case ._CellUnit
            Case CELLUNIT_DAY
                ._EndDate = ._BeginDate + ._DrawColumns
            Case CELLUNIT_WEEK
                ._EndDate = ._BeginDate + ._DrawColumns * 7
            Case CELLUNIT_10DAYS
                
                ._BeginDate = DateSerial(y, m, 1)
                
                d = ._DrawColumns mod 3
                m = m + ._DrawColumns / 3 - 0.5
                y = y + m / 12 - 0.5
                m = (m - 1) mod 12 + 1
                
                If d = 0 Then
                    ._EndDate = DateSerial(y, m, 1) - 1
                Else
                    ._EndDate = DateSerial(y, m, d * 10)
                End If
                
            Case CELLUNIT_MONTH
                
                ._BeginDate = DateSerial(y, m, 1)
                
                m = m + ._DrawColumns
                y = y + m / 12 - 0.5
                m = (m - 1) mod 12 + 1
                ._EndDate = DateSerial(y, m, 1) - 1
                
        End Select
        
    End With
    
End Sub

計算結果は、プロパティ型にある_EndDate変数に保存することにしています。
1日間と1週間は単純に1または7を列数に乗算することで取得できますが、10日間と1月間は面倒なので解説します。

まず開始日を年、月、日に分解します。そして、チャートの描画結果に配慮して、開始日を指定月の1日から開始されるように設定します。

この後1月間の場合は、列数を3で割った余りを取得し日付を計算します。また、月に列数を3で割った数値を足します。ここで、0.5を引いているのは実数型から整数型へ変換する際の四捨五入を補正するためです。この計算で得た月数から年を計算します。年の計算の後、月数を12で割った余りから正しい月を取得し、これを使って最終日を取得します。

1月間の場合は列数=月数なので、これを月に足し年を計算します。その後、月数を12で割った余りから月を取得し、最終日を計算しています。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データの初期設定 その2

準備の中で必ず行わなければならないのが、工程表の描画に用いるデータの読み込みです。そこで、この読み込みを一括で行うための関数を作成しておきます。

Sub LoadAll
    
    mdlCategory.LoadAll
    mdlItem.LoadAll
    mdlSchedule.LoadAll
    mdlPerson.LoadAll
    mdlProperty.LoadAll
    
End Sub

次に描画用プロパティの取得を行う必要があるので、これも下記のように関数を作成しておきます。

Function getProperty As Boolean

    If mdlProperty.getActiveId < 1 Then
        getProperty = False
    Else
        oProperty = mdlProperty.getActiveProperty
        getProperty = True
    End If
    
End Function

すると、このプロパティ関数がFalseとなった時、適切な工程用のシートが選択されていないということになりますので、描画処理を終了させるため、描画実行時に下記の一文を加えて利用します。

If Not getProperty Then Exit Sub

また、プロパティからシート名を取得できるので、実行時に下記の一文を加えて利用します。

oSheet = mdlMain.Sheets(oProperty._SheetName)

テーマ:OpenOffice.org - ジャンル:コンピュータ

データの初期設定 その1

まず、ガントチャートの描画に必要な変数を宣言しますが、ここで必要な変数として考えられるものは以下となります。

  1. シートオブジェクト
  2. シート用プロパティ
  3. 描画する行数
  4. 描画に必要な図形(四角)の数
  5. 描画に必要な図形(直線)の数
  6. 描画に必要な図形(進捗線)の数
  7. 図形(四角)操作用のポインタ変数
  8. 図形(直線)操作用のポインタ変数
  9. 図形(進捗線)操作用のポインタ変数
  10. 図形(四角)操作用のポインタ変数
  11. 描画する図形(四角)オブジェクトの配列
  12. 描画する図形(直線)オブジェクトの配列
  13. 描画する図形(進捗線)オブジェクトの配列

これをコードで表すと、下記となります。

Private oSheet As Object
Private oProperty As Object
 
Private MaxRows As Integer
 
Private RectCount As Integer
Private LineCount As Integer
Private PrgsCount As Integer
 
Private RectPos As Integer
Private LinePos As Integer
Private PrgsPos As Integer
 
Private ChartBarLine() As Object
Private ChartBarRect() As Object
Private ProgressLine() As Object

以降、これらに適切な値を与えながら、データの初期設定を行っていきます。

テーマ:OpenOffice.org - ジャンル:コンピュータ

プロパティ編集ダイアログ その5

各種リスナー用の関数を作成します。

まずアクションリスナーから見てみると、btnOKしかないので、btnOK用の動作をそのまま書込むことにします。

Private Sub dlgEditPropertyActionListener_actionPerformed(oEvent)
    Select Case oEvent.Source.getModel().Name
        Case "btnOK"
            getValues
            flgUpdate = True
            oDialog.endExecute
        Case Else
        
    End Select
End Sub

Private Sub dlgEditPropertyActionListener_disposing: End Sub

値をプロパティ変数に書き戻し、編集フラグの値を真とし、ダイアログを終了させます。

次にアジャストメントリスナーを考えてみます。そこで、スクロールバーを操作した時の動作をsetScrollBarValueOnLabelという関数で作成しておきます。

Private Sub setScrollBarValueOnLabel(oControl As Object)
    
    Dim s As String
    Dim i As Integer
    
    s = oControl.getModel.Name
    
    If s = "scbChartBarWeight" Or _
        s = "scbProgressLineWeight" Or _
            s = "scbMileStoneWeight" Then
        i = 1
    Else
        i = 0
    End If
    
    oDialog.getControl("txt" & Right(s, Len(s) - 3)).Text = _
        oControl.Value + i
    
End Sub

スクロールバーの名前で処理を分岐し、値表示用のラベルコントロールに数値を入力しています。
そしてアジャストメントリスナーから、この関数を呼び出すこととし下記のコードを追加します。

Private Sub dlgEditPropertyAdjustmentListener_adjustmentValueChanged(oEvent)
    
    setScrollBarValueOnLabel(oEvent.Source)
    
End Sub
 
Private Sub dlgEditPropertyAdjustmentListener_disposing: End Sub

最後にマウスリスナーの動作を作成します。

Sub dlgEditPropertyMouseListener_mousePressed(oEvent As Object)
    
    Select Case oEvent.Source.Model.Name
        Case "imgChartBarPlanLineColor",_
            "imgChartBarPlanFillColor",_
            "imgChartBarActLineColor", _
            "imgChartBarActFillColor",_
            "imgChartHolidayColor",_
            "imgProgressLineColor"
            
            oEvent.Source.Model.BackgroundColor = _
                mdlSelectColor.Show("", _
                    oEvent.Source.Model.BackgroundColor)
        Case "txtBeginDate"
            Dim wk As Date
            wk = mdlCalendar.Show(CDate(oEvent.Source.Text), _
                CALENDARTYPE_SELECT)
            If FirstDate < wk Then oEvent.Source.Text = wk
        Case Else
        
    End Select
    
End Sub
Sub dlgEditPropertyMouseListener_disposing(): End Sub
Sub dlgEditPropertyMouseListener_mouseReleased(oEvent): End Sub
Sub dlgEditPropertyMouseListener_mouseEntered(oEvent): End Sub
Sub dlgEditPropertyMouseListener_mouseExited(oEvent): End Sub

これまでに作成した色選択ダイアログや日付選択ダイアログを利用し、チャートの色や日付を選択できるようにしています。

以上でガントチャート作成に必要な準備が一通り終了しました。データやプロパティの編集ができるようになったので、次回からいよいよガントチャートを描画する処理を解説していきます。

テーマ:OpenOffice.org - ジャンル:コンピュータ

プロパティ編集ダイアログ その4

各コントロールの値をプロパティデータに戻すgetValues関数を作成します。

Private Sub getValues
    
    With Properties(Id)
        ._SheetName = txtSheetName.Text
        ._BeginDate = txtBeginDate.Text
        ._DrawRows = txtDrawRows.Text
        
        ._ChartBarWeight = scbChartBarWeight.Value + 1
        ._ChartBarPlanPos = scbChartBarPlanPos.Value
        ._ChartBarActPos = scbChartBarActPos.Value
        ._ProgressLineWeight = scbProgressLineWeight.Value + 1
        ._MileStoneWeight = scbMileStoneWeight.Value + 1
        
        ._ChartBarPlanLineColor = _
            imgChartBarPlanLineColor.getModel().BackgroundColor
        ._ChartBarPlanFillColor = _
            imgChartBarPlanFillColor.getModel().BackgroundColor
        ._ChartBarActLineColor = _
            imgChartBarActLineColor.getModel().BackgroundColor
        ._ChartBarActFillColor = _
            imgChartBarActFillColor.getModel().BackgroundColor
        ._ChartHolidayColor = _
            imgChartHolidayColor.getModel().BackgroundColor
        ._ProgressLineColor = _
            imgProgressLineColor.getModel().BackgroundColor
        
        ._DrawProgressLine = State2Bool(chkDrawProgressLine)
        ._PrintAllItems = State2Bool(chkPrintAllItems)
        ._PrintNotCompletedItem = State2Bool(chkPrintNotCompleted)
        ._InsertSpaceBetweenCategory = _
            State2Bool(chkInsertSpaceBetweenCategory)
        ._PrintLabel = State2Bool(chkPrintLabel)
        ._CalculateStatus = State2Bool(chkCalculateStatus)
        ._CalculateTimesWithoutHoliday = _
            State2Bool(chkCalculateTimesWithoutHoliday)
        ._UseOptionalNote = State2Bool(chkUseOptionalNote)
        
        ._CellUnit = cmbCellUnit.getSelectedItemPos
        ._ChartBarType = cmbChartBarType.getSelectedItemPos
        ._CategorizeType = lstCategorizeType.getSelectedItemPos
        
    End With
    
End Sub

ここで使用しているState2BoolはチェックボックスのStatusデータをTrue/Falseの値に変換する関数で、mdlMain内にて以前定義したものです。

テーマ:OpenOffice.org - ジャンル:コンピュータ

プロパティ編集ダイアログ その3

各プロパティの値をコントロールに割り当てるsetValues関数を作成します。

Private Sub setValues(obj As Object)
    With obj
        txtSheetName.Text = ._SheetName
        txtBeginDate.Text = ._BeginDate
        txtDrawRows.Text = ._DrawRows
        
        scbChartBarWeight.Value = ._ChartBarWeight - 1
        scbChartBarPlanPos.Value = ._ChartBarPlanPos
        scbChartBarActPos.Value = ._ChartBarActPos
        scbProgressLineWeight.Value = ._ProgressLineWeight - 1
        scbMileStoneWeight.Value = ._MileStoneWeight - 1
        
        imgChartBarPlanLineColor.getModel().BackgroundColor = _
            ._ChartBarPlanLineColor
        imgChartBarPlanFillColor.getModel().BackgroundColor = _
            ._ChartBarPlanFillColor
        imgChartBarActLineColor.getModel().BackgroundColor = _
            ._ChartBarActLineColor
        imgChartBarActFillColor.getModel().BackgroundColor = _
            ._ChartBarActFillColor
        imgChartHolidayColor.getModel().BackgroundColor = _
            ._ChartHolidayColor
        imgProgressLineColor.getModel().BackgroundColor = _
            ._ProgressLineColor
        
        chkDrawProgressLine.State = _
            Bool2State(obj._DrawProgressLine)
        chkPrintAllItems.State = Bool2State(obj._PrintAllItems)
        chkPrintNotCompleted.State = _
            Bool2State(obj._PrintNotCompletedItem)
        chkInsertSpaceBetweenCategory.State = _
            Bool2State(obj._InsertSpaceBetweenCategory)
        chkPrintLabel.State = Bool2State(obj._PrintLabel)
        chkCalculateStatus.State = _
            Bool2State(obj._CalculateStatus)
        chkCalculateTimesWithoutHoliday.State = _
            Bool2State(obj._CalculateTimesWithoutHoliday)
        chkUseOptionalNote.State = _
            Bool2State(obj._UseOptionalNote)
        
        cmbCellUnit.SelectItemPos(obj._CellUnit, True)
        cmbChartBarType.SelectItemPos(obj._ChartBarType, True)
        lstCategorizeType.SelectItemPos(obj._CategorizeType, True)
        
    End With
    
    setScrollBarValueOnLabel(scbChartBarWeight)
    setScrollBarValueOnLabel(scbChartBarPlanPos)
    setScrollBarValueOnLabel(scbChartBarActPos)
    setScrollBarValueOnLabel(scbProgressLineWeight)
    setScrollBarValueOnLabel(scbMileStoneWeight)
    
End Sub

ここで使用しているBool2State関数は以前mdlMain内に作成したもので、True/Falseをチェックボックス用のStatusデータとして返す働きをしています。
また、引数であるobjにはプロパティ型のデータを入れます。

そして、前回作成したInitialize関数とsetValues関数を使って、表示用のShow関数を作成します。

Function Show
    
    Id = mdlProperty.getActiveId
    If Id < 1 Or mdlProperty.Count < Id Then Exit Function
    
    flgUpdate = False
    
    Initialize
    setValues(Properties(Id))
    
    With oDialog
        .execute
        .dispose
    End With
    
    Show = flgUpdate
    
End Function

まず初めにmdlProperty.getActiveId関数にて、選択中のシートに対応したプロパティ番号を取得します。そして、変更フラグを初期化してから、Initialize関数、setValues関数を順に実行しダイアログを表示しています。

テーマ:OpenOffice.org - ジャンル:コンピュータ

プロパティ編集ダイアログ その2

次にリスナーおよび操作用変数を宣言し、初期化用のInitialize関数を作成します。

Private oActionListener As Object
Private oAdjustmentListener As Object
Private oMouseListener As Object

Private Id As Integer
Private flgUpdate As Boolean

アクションリスナーはボタンコントロール、アジャストメントリスナーはスクロールバー、マウスリスナーはイメージコントロール用に使用します。

前回宣言したコントロール用の変数と、上記リスナーを割り当てるInitialize関数は下記となります。

Sub Initialize
    
    oDialog = createUnoDialog(DialogLibraries.Standard.dlgEditProperty)
    'mdlText.MakeDialogModuleTemplete(oDialog, "dlgEditProperty")
    
    With oDialog
        txtSheetName = .getControl("txtSheetName")
        txtBeginDate = .getControl("txtBeginDate")
        cmbCellUnit = .getControl("cmbCellUnit")
        txtDrawRows = .getControl("txtDrawRows")
        scbChartBarWeight = .getControl("scbChartBarWeight")
        lblSheetName = .getControl("lblSheetName")
        lblBeginDate = .getControl("lblBeginDate")
        lblCellUnit = .getControl("lblCellUnit")
        lblDrawRows = .getControl("lblDrawRows")
        lblChartBarWeight = .getControl("lblChartBarWeight")
        lblChartBarPlanPos = .getControl("lblChartBarPlanPos")
        lblChartBarActPos = .getControl("lblChartBarActPos")
        lblChartBarType = .getControl("lblChartBarType")
        lblChartBarPlanLineColor = .getControl("lblChartBarPlanLineColor")
        lblChartBarPlanFillColor = .getControl("lblChartBarPlanFillColor")
        lblChartBarActLineColor = .getControl("lblChartBarActLineColor")
        lblChartBarActFillColor = .getControl("lblChartBarActFillColor")
        lblChartHolidayColor = .getControl("lblChartHolidayColor")
        scbChartBarPlanPos = .getControl("scbChartBarPlanPos")
        scbChartBarActPos = .getControl("scbChartBarActPos")
        cmbChartBarType = .getControl("cmbChartBarType")
        imgChartBarPlanLineColor = .getControl("imgChartBarPlanLineColor")
        imgChartBarPlanFillColor = .getControl("imgChartBarPlanFillColor")
        imgChartBarActLineColor = .getControl("imgChartBarActLineColor")
        imgChartBarActFillColor = .getControl("imgChartBarActFillColor")
        imgChartHolidayColor = .getControl("imgChartHolidayColor")
        lblProgressLineWeight = .getControl("lblProgressLineWeight")
        chkDrawProgressLine = .getControl("chkDrawProgressLine")
        scbProgressLineWeight = .getControl("scbProgressLineWeight")
        imgProgressLineColor = .getControl("imgProgressLineColor")
        lblMileStoneWeight = .getControl("lblMileStoneWeight")
        scbMileStoneWeight = .getControl("scbMileStoneWeight")
        chkPrintAllItems = .getControl("chkPrintAllItems")
        chkPrintNotCompleted = .getControl("chkPrintNotCompleted")
        chkInsertSpaceBetweenCategory = _
            .getControl("chkInsertSpaceBetweenCategory")
        btnOK = .getControl("btnOK")
        chkPrintLabel = .getControl("chkPrintLabel")
        chkCalculateStatus = .getControl("chkCalculateStatus")
        chkCalculateTimesWithoutHoliday = _
            .getControl("chkCalculateTimesWithoutHoliday")
        chkUseOptionalNote = .getControl("chkUseOptionalNote")
        txtChartBarWeight = .getControl("txtChartBarWeight")
        txtChartBarPlanPos = .getControl("txtChartBarPlanPos")
        txtChartBarActPos = .getControl("txtChartBarActPos")
        txtProgressLineWeight = .getControl("txtProgressLineWeight")
        txtMileStoneWeight = .getControl("txtMileStoneWeight")
        lblCategorizeType = .getControl("lblCategorizeType")
        lstCategorizeType = .getControl("lstCategorizeType")
    End With
    
    lblMileStoneWeight.setVisible(False)
    txtMileStoneWeight.setVisible(False)
    scbMileStoneWeight.setVisible(False)
    chkCalculateTimesWithoutHoliday.setVisible(False)
    chkUseOptionalNote.setVisible(False)
    
    oActionListener = _
        CreateUnoListener("dlgEditPropertyActionListener_", _
            "com.sun.star.awt.XActionListener")
    oAdjustmentListener = _
        CreateUnoListener("dlgEditPropertyAdjustmentListener_", _
            "com.sun.star.awt.XAdjustmentListener")
    oMouseListener = _
        CreateUnoListener("dlgEditPropertyMouseListener_", _
            "com.sun.star.awt.XMouseListener")
    
    btnOK.addActionListener(oActionListener)
    
    scbChartBarWeight.addAdjustmentListener(oAdjustmentListener)
    scbChartBarPlanPos.addAdjustmentListener(oAdjustmentListener)
    scbChartBarActPos.addAdjustmentListener(oAdjustmentListener)
    scbProgressLineWeight.addAdjustmentListener(oAdjustmentListener)
    scbMileStoneWeight.addAdjustmentListener(oAdjustmentListener)
    
    txtBeginDate.addMouseListener(oMouseListener)
    imgChartBarPlanLineColor.addMouseListener(oMouseListener)
    imgChartBarPlanFillColor.addMouseListener(oMouseListener)
    imgChartBarActLineColor.addMouseListener(oMouseListener)
    imgChartBarActFillColor.addMouseListener(oMouseListener)
    imgChartHolidayColor.addMouseListener(oMouseListener)
    imgProgressLineColor.addMouseListener(oMouseListener)

    lblSheetName.Text = dlgEditProperty_lblSheetName_Text
    lblBeginDate.Text = dlgEditProperty_lblBeginDate_Text
    lblCellUnit.Text = dlgEditProperty_lblCellUnit_Text
    lblDrawRows.Text = dlgEditProperty_lblDrawRows_Text
    lblChartBarWeight.Text = dlgEditProperty_lblChartBarWeight_Text
    lblChartBarPlanPos.Text = dlgEditProperty_lblChartBarPlanPos_Text
    lblChartBarActPos.Text = dlgEditProperty_lblChartBarActPos_Text
    lblChartBarType.Text = dlgEditProperty_lblChartBarType_Text
    lblChartBarPlanLineColor.Text = _
        dlgEditProperty_lblChartBarPlanLineColor_Text
    lblChartBarPlanFillColor.Text = _
        dlgEditProperty_lblChartBarPlanFillColor_Text
    lblChartBarActLineColor.Text = _
        dlgEditProperty_lblChartBarActLineColor_Text
    lblChartBarActFillColor.Text = _
        dlgEditProperty_lblChartBarActFillColor_Text
    lblChartHolidayColor.Text = dlgEditProperty_lblChartHolidayColor_Text
    lblProgressLineWeight.Text = dlgEditProperty_lblProgressLineWeight_Text
    lblMileStoneWeight.Text = dlgEditProperty_lblMileStoneWeight_Text
    lblCategorizeType.Text = dlgEditProperty_lblCategorizeType_Text
    
    chkDrawProgressLine.Label = dlgEditProperty_chkDrawProgressLine_Label
    chkPrintAllItems.Label = dlgEditProperty_chkPrintAllItems_Label
    chkPrintNotCompleted.Label = dlgEditProperty_chkPrintNotCompleted_Label
    chkInsertSpaceBetweenCategory.Label = _
        dlgEditProperty_chkInsertSpaceBetweenCategory_Label
    chkPrintLabel.Label = dlgEditProperty_chkPrintLabel_Label
    chkCalculateStatus.Label = dlgEditProperty_chkCalculateStatus_Label
    chkCalculateTimesWithoutHoliday.Label = _
        dlgEditProperty_chkCalculateTimesWithoutHoliday_Label
    chkUseOptionalNote.Label = dlgEditProperty_chkUseOptionalNote_Label
    btnOK.Label = dlgEditProperty_btnOK_Label
    
    cmbCellUnit.addItems(dlgEditProperty_cmbCellUnit_Items, 0)
    cmbChartBarType.addItems(dlgEditProperty_cmbChartBarType_Items, 0)
    lstCategorizeType.addItems(dlgEditProperty_lstCategorizeType_Items, 0)
    
End Sub

テーマ:OpenOffice.org - ジャンル:コンピュータ

プロパティ編集ダイアログ その1

ここでも、これまで同様IDEにて、ダイアログを追加して名称を「dlgEditProperty」とし、必要なコントロールを配置します。
各コントロールを配置したダイアログは下図となります。


次に、モジュールを追加して名称を「mdlEditProperty」とします。そして、ダイアログに配置したコントロール用の変数を宣言します。

Private oDialog As Object
 
Private txtSheetName As Object
Private txtBeginDate As Object
Private cmbCellUnit As Object
Private txtDrawRows As Object
Private scbChartBarWeight As Object
Private lblSheetName As Object
Private lblBeginDate As Object
Private lblCellUnit As Object
Private lblDrawRows As Object
Private lblChartBarWeight As Object
Private lblChartBarPlanPos As Object
Private lblChartBarActPos As Object
Private lblChartBarType As Object
Private lblChartBarPlanLineColor As Object
Private lblChartBarPlanFillColor As Object
Private lblChartBarActLineColor As Object
Private lblChartBarActFillColor As Object
Private lblChartHolidayColor As Object
Private scbChartBarPlanPos As Object
Private scbChartBarActPos As Object
Private cmbChartBarType As Object
Private imgChartBarPlanLineColor As Object
Private imgChartBarPlanFillColor As Object
Private imgChartBarActLineColor As Object
Private imgChartBarActFillColor As Object
Private imgChartHolidayColor As Object
Private lblProgressLineWeight As Object
Private chkDrawProgressLine As Object
Private scbProgressLineWeight As Object
Private imgProgressLineColor As Object
Private lblMileStoneWeight As Object
Private scbMileStoneWeight As Object
Private chkPrintAllItems As Object
Private chkPrintNotCompleted As Object
Private chkInsertSpaceBetweenCategory As Object
Private btnOK As Object
Private chkPrintLabel As Object
Private chkCalculateStatus As Object
Private chkCalculateTimesWithoutHoliday As Object
Private chkUseOptionalNote As Object
Private txtChartBarWeight As Object
Private txtChartBarPlanPos As Object
Private txtChartBarActPos As Object
Private txtProgressLineWeight As Object
Private txtMileStoneWeight As Object
Private lblCategorizeType As Object
Private lstCategorizeType As Object
 
Public dlgEditProperty_cmbChartBarType_Items
Public dlgEditProperty_cmbCellUnit_Items
Public dlgEditProperty_lstCategorizeType_Items
 
Public dlgEditProperty_lblSheetName_Text As String
Public dlgEditProperty_lblBeginDate_Text As String
Public dlgEditProperty_lblCellUnit_Text As String
Public dlgEditProperty_lblDrawRows_Text As String
Public dlgEditProperty_lblChartBarWeight_Text As String
Public dlgEditProperty_lblChartBarPlanPos_Text As String
Public dlgEditProperty_lblChartBarActPos_Text As String
Public dlgEditProperty_lblChartBarType_Text As String
Public dlgEditProperty_lblChartBarPlanLineColor_Text As String
Public dlgEditProperty_lblChartBarPlanFillColor_Text As String
Public dlgEditProperty_lblChartBarActLineColor_Text As String
Public dlgEditProperty_lblChartBarActFillColor_Text As String
Public dlgEditProperty_lblChartHolidayColor_Text As String
Public dlgEditProperty_lblProgressLineWeight_Text As String
Public dlgEditProperty_lblMileStoneWeight_Text As String
Public dlgEditProperty_lblCategorizeType_Text As String
 
Public dlgEditProperty_chkDrawProgressLine_Label As String
Public dlgEditProperty_chkPrintAllItems_Label As String
Public dlgEditProperty_chkPrintNotCompleted_Label As String
Public dlgEditProperty_chkInsertSpaceBetweenCategory_Label As String
Public dlgEditProperty_chkPrintLabel_Label As String
Public dlgEditProperty_chkCalculateStatus_Label As String
Public dlgEditProperty_chkCalculateTimesWithoutHoliday_Label As String
Public dlgEditProperty_chkUseOptionalNote_Label As String
Public dlgEditProperty_btnOK_Label As String

これほど大量の変数を宣言するとなるとなかなか大変なので、以前作成したダイアログ作成サポートダイアログを使用するととても楽になります。

そして、mdlMain.Initialize関数に下記を追加します。

dlgEditProperty_lblSheetName_Text = ControlLabelString("シート名")
dlgEditProperty_lblBeginDate_Text = ControlLabelString("開始日")
dlgEditProperty_lblCellUnit_Text = ControlLabelString("セル単位")
dlgEditProperty_lblDrawRows_Text = ControlLabelString("描画行数")
dlgEditProperty_lblChartBarWeight_Text = ControlLabelString("線幅")
dlgEditProperty_lblChartBarPlanPos_Text = ControlLabelString("開始線位置")
dlgEditProperty_lblChartBarActPos_Text = ControlLabelString("実績線位置")
dlgEditProperty_lblChartBarType_Text = ControlLabelString("線の種類")
dlgEditProperty_lblChartBarPlanLineColor_Text = _
    ControlLabelString("予定線色")
dlgEditProperty_lblChartBarPlanFillColor_Text = _
    ControlLabelString("予定塗色")
dlgEditProperty_lblChartBarActLineColor_Text = _
    ControlLabelString("実績線色")
dlgEditProperty_lblChartBarActFillColor_Text = _
    ControlLabelString("実績塗色")
dlgEditProperty_lblChartHolidayColor_Text = _
    ControlLabelString("休日塗色")
dlgEditProperty_lblProgressLineWeight_Text = _
    ControlLabelString("進捗線幅")
dlgEditProperty_lblMileStoneWeight_Text = _
    ControlLabelString("マイルストーン")
dlgEditProperty_lblCategorizeType_Text = _
    ControlLabelString("分類形式")
dlgEditProperty_chkDrawProgressLine_Label = _
    ControlLabelString("進捗線を描画する")
dlgEditProperty_chkPrintAllItems_Label = _
    ControlLabelString("工程期間外の項目を含めて表示する")
dlgEditProperty_chkPrintNotCompleted_Label = _
    ControlLabelString("未完の項目を必ず表示する")
dlgEditProperty_chkInsertSpaceBetweenCategory_Label = _
    ControlLabelString("分類の間に空白を入れる")
dlgEditProperty_chkPrintLabel_Label = _
    ControlLabelString("工程の名称を表示する")
dlgEditProperty_chkCalculateStatus_Label = _
    ControlLabelString("進捗を実績から計算する")
dlgEditProperty_chkCalculateTimesWithoutHoliday_Label = _
    ControlLabelString("休日を除いた作業量を求める")
dlgEditProperty_chkUseOptionalNote_Label = _
    ControlLabelString("追加の備考を使用する")
dlgEditProperty_btnOK_Label = ControlLabelString("設定")
 
dlgEditProperty_cmbChartBarType_Items = array("長方形","直線")
dlgEditProperty_cmbCellUnit_Items = array("1日","7日","10日","1月")
dlgEditProperty_lstCategorizeType_Items = array("分類","担当者")

テーマ:OpenOffice.org - ジャンル:コンピュータ

プロパティの取得

選択中の工程表に合わせたプロパティを取得するため、下記の関数を作成します。

Function getActiveId As Integer
    
    Dim i As Integer
    Dim s As String
    
    s = ActiveSheet.Name
    ActiveId = -1
    
    For i = 1 To Count
        If s = Properties(i)._SheetName Then
            ActiveId = i
            Exit For
        End If
    Next i
    
    getActiveId = ActiveId
    
End Function

この関数は選択中のシートの名称と、プロパティに登録されたシート名を比較し、一致するシート名があればそのプロパティの番号を戻し、なければ-1を返すというものです。単純ですが、あるのとないのでは大違い。これからガントチャートの操作や描画を行う時にとても役立ちます。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ書込み「プロパティ」

個別の書込み用関数とそれを利用した一括書込み用の関数を宣言します。これもまた他のデータと同じようにセルにどんどん書き込んで行くというになります。

Public Function SaveAll As Integer
    
    Dim i As Integer
    
    For i = 1 To UBound(Properties())
        If Not SaveById(Properties(i)) Then Exit For
    Next i
    Cells(PropertySheet, i + 3, 4).String = ""
    
    SaveAll = i - 1
    
End Function
 
Public Function SaveById(wkProperty As PropertyType) As Boolean
    
    Dim i As Integer
    Dim Id As Integer
    
    With wkProperty
        
        Id = ._Id + 2
        i = 4
        
        Cells(PropertySheet, Id, i).String = ._SheetName: i = i + 1
        
        Cells(PropertySheet, Id, i).Value = ._BeginDate: i = i + 1
        Cells(PropertySheet, Id, i).Value = ._CellUnit: i = i + 1
        Cells(PropertySheet, Id, i).Value = ._DrawColumns: i = i + 1
        Cells(PropertySheet, Id, i).Value = ._DrawRows: i = i + 1
        i = i + 1
        Cells(PropertySheet, Id, i).Value = ._LeftColumn: i = i + 1
        Cells(PropertySheet, Id, i).Value = ._TopRow: i = i + 1
        i = i + 1
        Cells(PropertySheet, Id, i).Value = ._AutoUpdate: i = i + 1
        i = i + 1
        Cells(PropertySheet, Id, i).Value = ._ChartBarWeight: i = i + 1
        Cells(PropertySheet, Id, i).Value = ._ChartBarPlanPos: i = i + 1
        Cells(PropertySheet, Id, i).Value = ._ChartBarActPos: i = i + 1
        Cells(PropertySheet, Id, i).Value = ._ChartBarType: i = i + 1
        i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._ChartBarPlanLineColor: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._ChartBarPlanFillColor: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._ChartBarActLineColor: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._ChartBarActFillColor: i = i + 1
        i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._ChartHolidayColor: i = i + 1
        i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._DrawProgressLine: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._ProgressLineWeight: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._ProgressLineColor: i = i + 1
        i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._CategorizeType: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._SortType: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._PrintAllItems: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._PrintNotCompletedItem: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._InsertSpaceBetweenCategory: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._PrintLabel: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._CalculateStatus: i = i + 1
        Cells(PropertySheet, Id, i).Value = _
            ._CalculateTimesWithoutHoliday: i = i + 1
        i = i + 1
        Cells(PropertySheet, Id, i).Value = ._MileStoneWeight: i = i + 1
        i = i + 1
        Cells(PropertySheet, Id, i).Value = ._UseOptionalNote: i = i + 1
        
    End With
    
    SaveById = True
    
End Function

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ読込み「プロパティ」

従来通り、シート名とデータ用の配列を宣言します。

Public PropertySheetName As String
Public PropertySheet As Object
 
Public Properties() As PropertyType

次に、個別で参照する事の多い工程表開始日を記録した行番号を記録する変数と、読み込みを行った後か否かを記録する変数を宣言します。

Private BeginDateRow As Integer
Private flgLoaded As Boolean

そして、個別の読込み用関数とそれを利用した一括読込み用の関数を宣言します。

Public Function LoadAll As Integer
    
    If flgLoaded Then
        LoadAll = Count
        Exit Function
    End If
    
    Dim i As Integer
    
    Redim Preserve Properties(0)
    
    i = 1
    Do
        If Cells(PropertySheet, i+2, 4).String = "" Then Exit Do
        Redim Preserve Properties(i)
        LoadById(Properties(i), i)
        i = i + 1
    Loop
    
    flgLoaded = True
    LoadAll = i - 1
    
End Function
 
Private Function LoadById(wkProperty As PropertyType, _
    ByVal Id As Integer) As Boolean
    
    Dim i As Integer
    
    With wkProperty
        
        ._Id = Id
        Id = Id + 2
        i = 4
        
        ._SheetName = Cells(PropertySheet, Id, i).String: i = i + 1
        
        ._BeginDate = Cells(PropertySheet, Id, i).Value
        BeginDateRow = i: i = i + 1
        
        ._CellUnit = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._DrawColumns = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._DrawRows = Cells(PropertySheet, Id, i).Value: i = i + 1
        i = i + 1
        ._LeftColumn = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._TopRow = Cells(PropertySheet, Id, i).Value: i = i + 1
        i = i + 1
        ._AutoUpdate = Cells(PropertySheet, Id, i).Value: i = i + 1
        i = i + 1
        ._ChartBarWeight = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._ChartBarPlanPos = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._ChartBarActPos = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._ChartBarType = Cells(PropertySheet, Id, i).Value: i = i + 1
        i = i + 1
        ._ChartBarPlanLineColor = Cells(PropertySheet, Id, i).Value
            i = i + 1
        ._ChartBarPlanFillColor = Cells(PropertySheet, Id, i).Value
            i = i + 1
        ._ChartBarActLineColor = Cells(PropertySheet, Id, i).Value
            i = i + 1
        ._ChartBarActFillColor = Cells(PropertySheet, Id, i).Value
            i = i + 1
        i = i + 1
        ._ChartHolidayColor = Cells(PropertySheet, Id, i).Value
            i = i + 1
        i = i + 1
        ._DrawProgressLine = Cells(PropertySheet, Id, i).Value
            i = i + 1
        ._ProgressLineWeight = Cells(PropertySheet, Id, i).Value
            i = i + 1
        ._ProgressLineColor = Cells(PropertySheet, Id, i).Value
            i = i + 1
        i = i + 1
        ._CategorizeType = Cells(PropertySheet, Id, i).Value
            i = i + 1
        ._SortType = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._PrintAllItems = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._PrintNotCompletedItem = Cells(PropertySheet, Id, i).Value
            i = i + 1
        ._InsertSpaceBetweenCategory = Cells(PropertySheet, Id, i).Value
            i = i + 1
        ._PrintLabel = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._CalculateStatus = Cells(PropertySheet, Id, i).Value: i = i + 1
        ._CalculateTimesWithoutHoliday = _
            Cells(PropertySheet, Id, i).Value
            i = i + 1
        i = i + 1
        ._MileStoneWeight = Cells(PropertySheet, Id, i).Value: i = i + 1
        i = i + 1
        ._UseOptionalNote = Cells(PropertySheet, Id, i).Value: i = i + 1
        
    End With
    
End Function

そして、mdlMain.Initialize関数に下記を追加します。

PropertySheetName = "プロパティ"
PropertySheet = Sheets(PropertySheetName)

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ型作成「プロパティ」 その2

プロパティに必要な定数を宣言します。ここで、これらの定数は他のモジュールからも利用するのでPublic定数として宣言します。

まず、セルの単位を区分けするための定数を宣言します。

Public Const CELLUNIT_DAY = 0
Public Const CELLUNIT_WEEK = 1
Public Const CELLUNIT_10DAYS = 2
Public Const CELLUNIT_MONTH = 3

1日間、1週間、10日間、1ヶ月間を0~3の数字に置き換えます。

次に、区分けをする方法を分類と担当者で区別するための定数を宣言します。

Public Const CATEGORIZETYPE_CATEGORY = 0
Public Const CATEGORIZETYPE_PERSON = 1

分類と担当者を0と1の数字で置き換えます。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ型作成「プロパティ」 その1

他のデータと同様に、プロパティ用にもユーザー定義のデータ型を作成します。

Type PropertyType
    
    _Id As Integer
    _SheetName As String
    
    _BeginDate As Date
    _EndDate As Date
    
    _CellUnit As Integer
    _DrawColumns As Integer
    _DrawRows As Integer
    _LeftColumn As Integer
    _TopRow As Integer
    _AutoUpdate As Boolean
    
    _ChartBarWeight As Long
    _ChartBarPlanPos As Integer
    _ChartBarActPos As Integer
    _ChartBarType As Integer
    
    _ChartBarPlanLineColor As Long
    _ChartBarPlanFillColor As Long
    _ChartBarActLineColor As Long
    _ChartBarActFillColor As Long
    
    _ChartHolidayColor As Long
    
    _DrawProgressLine As Boolean
    _ProgressLineWeight As Integer
    _ProgressLineColor As Long
    
    _MileStoneWeight As Integer
    
    _CategorizeType As Integer
    _SortType As Integer
    
    _PrintAllItems As Boolean
    _PrintNotCompletedItem As Boolean
    _InsertSpaceBetweenCategory As Boolean
    _PrintLabel As Boolean
    _CalculateStatus As Boolean
    _CalculateTimesWithoutHoliday As Boolean
    _UseOptionalNote As Boolean
    
End Type

これらのプロパティの中には使用してないものがいくつかあります。本当ならそんなものまで一緒に解説する必要はないかもしれませんが、Excel版ガントチャートでは全て実装されている機能なので、今後実現したいと思っているところです。
もし興味があれば、Excel版とOpenOffice.org版を比較されてみてはいかがでしょうか。

_Id 一貫No.保存用
_SheetName 工程表用シートの名称
_BeginDate 工程表の開始日
_EndDate 工程表の終了日(計算で求めます)
_CellUnit 列セルの単位で、1日や1週間などの区分けを保存します
_DrawColumns 描画する列の数
_DrawRows 描画する行の数
_LeftColumn チャートを描画する左端の列番号
_TopRow チャートを描画する上端の行番号
_AutoUpdate 未使用。これを設定している時は、シートを選択した直後に工程表の更新を行うという機能を検討中です。
_ChartBarWeight チャートの太さを記録します
_ChartBarPlanPos 予定を示すチャート線を描画する縦位置を記録します
_ChartBarActPos 実績を示すチャート線を描画する縦位置を記録します
_ChartBarType チャート線の種類を直線か長方形で描画するかの初期値
_ChartBarPlanLineColor 予定を示す線の枠を描画する色
_ChartBarPlanFillColor 予定を示す線の塗る色
_ChartBarActLineColor 実績を示す線の枠を描画する色
_ChartBarActFillColor 実績を示す線の塗る色
_ChartHolidayColor 休日の塗色
_DrawProgressLine イナズマ線を描画するか否かを記録します
_ProgressLineWeight イナズマ線の太さを記録します
_ProgressLineColor イナズマ線の色を記録します
_MileStoneWeight 未使用。マイルストーンを描画する際の太さを記録する予定。
_CategorizeType 区分けの方法が分類か担当者かを記録します。
_SortType 未使用。描画する項目を入力順にするか、入力された日付順に並べ替えるかを記録する予定。
_PrintAllItems 工程表の日付外にあるものは描画しないようにするか、表示するかを記録します。
_PrintNotCompletedItem 工程表の日付外にあっても、完了していない項目を描画することにするか否かを記録します。
_InsertSpaceBetweenCategory 項目を区分けする分類と分類の間に空白行を入力するか否かを記録します。
_PrintLabel 未使用。工程の名称を工程表上に表示するか否かを記録します。
_CalculateStatus 予定と実績から進捗状況を計算するか否かを記録します。
_CalculateTImesWithoutHoliday 未使用。作業日数を計算する際、休日に設定された日数を引いて計算するか否かを記録する予定。
_UseOptionalNote 未使用。予備の備考欄を使用するか否かを記録する予定。

テーマ:OpenOffice.org - ジャンル:コンピュータ

プロパティ用シート

いくつかの用途に合わせて、ガントチャートをカスタマイズできるようプロパティで設定を変更する機能を作ります。

そのプロパティデータを保存するためのシートを作成します。作成したシートは下図のようになります。


各種プロパティの内容はタイトルから容易に理解できるものと思われますが、今後データ型を作る際に説明をしたいと思います。

テーマ:OpenOffice.org - ジャンル:コンピュータ

CInt - 文字列を数値に変換

InputBoxなどで取得した文字列をそのまま計算に使用する事はできません。そこで、文字列を用途に合わせて数値に変換する必要が生じてきます。そのような時に役立つのがCInt関数です。CInt関数は文字列をInteger型の数値に変換してくれます。

[用法]

CInt(文字列)

[例]

Dim msg
msg = "123.456"

MsgBox(CInt(msg) * 3)

ちなみにCInt関数は文字列に限らず、実数型の数値を入力して使用する事も出来ます。その時は、小数点以下を丸めた整数型の数値に変換します。

他にも文字列から数値データに変換する関数がありますので、表にまとめてみます。

CInt 整数値に変換
CLng ロング整数値に変換
CSng 単精度の数値に変換
CDbl 倍精度の数値に変換

テーマ:OpenOffice.org - ジャンル:コンピュータ

InputBox - 値の入力

マクロの実行時にちょっとした入力をユーザーに行ってもらいたい時、とても役立つのがInputBox関数です。

[用法]

InputBox (メッセージ[, タイトル[, 初期値[, 横位置, 縦位置]]]])

[例]

InputBox("何か値を入力して下さい。")
InputBox("何か値を入力して下さい。", "InputBoxの例")
InputBox("何か値を入力して下さい。", "InputBoxの例", "初期値を入力します。")

ここで、注意点が2つあります。

  1. InputBoxにはOKとキャンセルのボタンがあります。ここで、キャンセルボタンを押すと文字数が0の文字列が戻ってきます。よって何も入力しない状態でOKを押した時とキャンセルボタンを押した時は同意義になります。
  2. 戻り値の型は文字列なので、数値を入力したい時は型の変換を行う必要があります。
これらの事を踏まえた実例を下記に示します。

Sub Main
    
    Dim ans
    Dim msg
    
    ans = InputBox("入力テスト")
    msg = TypeName(ans)
    
    If ans = "" Then
        ans = "キャンセル"
    End If
    
    MsgBox(ans & chr(13) & msg)
    
End Sub

色々な入力を試してみて下さい。

テーマ:OpenOffice.org - ジャンル:コンピュータ

図形オブジェクトの追加

シート上に図形オブジェクトを追加する方法を解説します。

まず、正方形を追加する例を示します。

Sub Main

    Dim oSheet As Object
    Dim oDrawPage As Object
    Dim oDraw As Object
    
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oDrawPage = oSheet.getDrawPage
    
    oDraw = ThisComponent.createInstance( _
        "com.sun.star.drawing.RectangleShape")
    
    Dim Width As Long
    Dim Height As Long
    Dim X As Long
    Dim Y As Long
    
    Width = 1000
    Height = 1000
    X = 2000
    Y = 2000
    
    setDrawSizePosition(oDraw, Width, Height, X, Y)
    
    oDrawPage.Add(oDraw)
    
End Sub
 
Sub setDrawSizePosition(oDraw As Object, _
    Width As Long, Height As Long,  X As Long, Y As Long)
    
    setDrawSize(oDraw, Width, Height)
    setDrawPosition(oDraw, X, Y)
    
End Sub

手順としては、createInstanceで図形オブジェクトを生成してから、シートに追加するということになります。ここで、createInstanceに渡す文字列を変更する事で円、曲線、直線など様々な図形を描画する事ができます。
また、サイズと位置を設定するために、前回までで作成した2つの関数を一つにまとめるsetDrawSizePosition関数を作って利用しています。この時に設定する数値も単位は1/100mmなので、1cmならば「10000」となります。

種類 文字列
四角 com.sun.star.drawing.RectangleShape
直線 com.sun.star.drawing.LineShape
com.sun.star.drawing.EllipseShape
曲線 com.sun.star.drawing.OpenBezierShape

しかし、これらの文字列がわからないと目的の図形が描けずに困る事になります。そんな時、膨大な量のマニュアルから情報を探すのも楽ではないので、僕は実際に目的の図形を描画してから、下記に示す関数で文字列を取得するようにしています。

Sub showShapeType(oDraw As Object)
    
    InputBox "This is a Shape Type that you want to know.", _
        "Shape Type", oDraw.getShapeType
    
End Sub

この関数の利用例を下記に示します。

Sub Main

    Dim oSheet As Object
    Dim oDrawPage As Object
    Dim oDraw As Object
    
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oDrawPage = oSheet.getDrawPage
    
    oDraw = oDrawPage.getByIndex(0)
    
    showShapeType(oDraw)
    
End Sub

後は実行して、InputBoxに表示された文字列をコピー&ペースとして使っています。

テーマ:OpenOffice.org - ジャンル:コンピュータ

図形オブジェクトの位置

前回取得した図形オブジェクトの位置を取得したり、設定する方法を解説します。

まず、図形オブジェクトの左端からの距離をメッセージボックスに表示する例を示します。

Sub showDrawWidth
    
    Dim oSheet As Object
    Dim oDrawPage As Object
    Dim oDraw As Object
    
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oDrawPage = oSheet.getDrawPage
    
    oDraw = oDrawPage.getByIndex(0)
    MsgBox oDraw.Position.X
    
End Sub

取得された数値の単位は1/100 mmです。例えば、1cmならは「10000」となります。
同様に、上端からの距離を取得するためにはXをYに変えます。

次に設定する方法をsetDrawSize関数の作例を使って示します。

Sub setDrawPosition(oDraw As Object, X As Long, Y As Long)
    
    Dim aPos As New com.sun.star.awt.Point
    
    aPos.X = X
    aPos.Y = Y
    
    oDraw.setPosition(aPos)
    
End Sub

位置の設定にはsetPositionメソッドを使いますが、そのメソッドに渡す変数はcom.sun.star.awt.Point型です。
Newステートメントで新しいPosition用の変数を作成し、それぞれにXとYを設定しsetPositionメソッドで割り当てます。この時に設定する数値も単位は1/100mmなので、1cmならば「10000」となります。

テーマ:OpenOffice.org - ジャンル:コンピュータ

サーバー管理者の戯言
サーバー管理者の戯言 OpenOffice関連のコンテンツ

OpenOffice.org2.0になって、Baseというデータベースソフトが入ったことがいろいろと反響を呼んでいるようです。しかし、マクロでデータベースにアクセスする方法について十分な情報があるとは言い難い。
そんな時、とても参考になるのがこのサイトです。

他の「ただ試してみました」的なコードのメモではなく、しっかりとしたコメントときちんとした記法で記したコードなのでとても参考になります。

OpenOffice.orgについてのコンテンツは少ないですが、他にもコンテンツがたくさんあります。なかなか高度な技術をやさしく解説されているように感じました。
このサイトはいろいろな人の参考になる有用なサイトではないでしょうか。

僕も次に作るマクロはデータベースを利用してみようと思っているので、参考にさせてもらおうと思います。

テーマ:OpenOffice.org - ジャンル:コンピュータ

図形オブジェクトのサイズ

前回取得した図形オブジェクトのサイズを取得したり、設定する方法を解説します。

まず、図形オブジェクトの幅をメッセージボックスに表示する例を示します。

Sub showDrawWidth
    
    Dim oSheet As Object
    Dim oDrawPage As Object
    Dim oDraw As Object
    
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oDrawPage = oSheet.getDrawPage
    
    oDraw = oDrawPage.getByIndex(0)
    MsgBox oDraw.Size.Width
    
End Sub

取得された数値の単位は1/100 mmです。例えば、1cmならは「10000」となります。
同様に、高さを取得するためにはWidthをHeightに変えます。

次に設定する方法をsetDrawSize関数の作例を使って示します。

Sub setDrawSize(oDraw As Object, Width As Long, Height As Long)
    
    Dim aSize As New com.sun.star.awt.Size
    
    aSize.Width = Width
    aSize.Height = Height
    
    oDraw.setSize(aSize)
    
End Sub

サイズの設定にはsetSizeメソッドを使いますが、そのメソッドに渡す変数はcom.sun.star.awt.Size型です。
Newステートメントで新しいSize用の変数を作成し、それぞれに幅と高さを設定しsetSizeメソッドで割り当てます。この時に設定する数値も単位は1/100mmなので、1cmならば「10000」となります。

テーマ:OpenOffice.org - ジャンル:コンピュータ

図形オブジェクトの取得

OOo Basicでは、図形オブジェクトを扱うための最上位オブジェクトにDrawPageというのがあります。全ての図形に、このオブジェクトを通じてアクセスする事になります。

まず、シート上の図形オブジェクト数を取得するサンプルを下記に示します。

Sub Main
    
    Dim oSheet As Object
    Dim oDrawPage As Object
    
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oDrawPage = oSheet.getDrawPage
    
    MsgBox oDrawPage.getCount
    
End Sub

アクティブシートを取得してから、そのシートのDrawPageを取得します。そして図形オブジェクトの数を取得するgetCountメソッドを使っています。

次に図形オブジェクトを取得するサンプルを下記に示します。

Sub Main
    
    Dim oSheet As Object
    Dim oDrawPage As Object
    Dim oDraw As Object
    
    oSheet = ThisComponent.CurrentController.ActiveSheet
    oDrawPage = oSheet.getDrawPage
    
    oDraw = oDrawPage.getByIndex(0)
    MsgBox oDraw.getShapeType
    
End Sub

前述と同じようにアクティブシートのDrawPageを取得し、そこで一番最初に描画された図形オブジェクトを取得しています。そしてその図形の種類を表示します。ここで注意するのは、図形は0から数え始めるということです。だからFor ... Next文を使うなら、終了する数はgetCount - 1までとします。例を下記に示します。

For i = 0 To oDrawPage.getCount - 1
    oDraw = oDrawPage.getByIndex(i)
    MsgBox oDraw.getShapeType
Next i

ここで、表示される図形の種類を示す文字列は、今後図形の追加を行う時にとても重要な役割を果たします。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ管理ダイアログ その7

データの保存について解説します。

保存は、各データのSaveAll関数を呼び出すだけで、コードは下記となります。

Private Sub btnSave_actionPerformed
    
    oDialog.setEnable(False)
    setScreenUpdating(False)
    
    mdlCategory.SaveAll
    mdlItem.SaveAll
    mdlSchedule.SaveAll
    mdlPerson.SaveAll
    
    setScreenUpdating(True)
    
    flgUpdate = True
    oDialog.endExecute
    
End Sub

まず、保存処理中に他のボタンを無効化しておくため、setEnableメソッドでダイアログを操作できなくしてしまいます。
次に、セルのデータを書き込む毎に画面の更新をすると処理に時間がかかってしまうので、画面更新を停止させます。そして、データを保存するため各種データのSaveAll関数を呼び出し、データをシートに書き込みます。
書込みが終了したら、画面の更新を再度有効にして、ダイアログを閉じます。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ管理ダイアログ その6

データの編集について解説します。

リストボックスをダブルクリックするとアクションリスナーが呼び出されるので、lstData_actionPerformed関数を作成して、ここに記述します。

Private Sub lstData_actionPerformed(oEvent)
    
    Dim i As Integer
    Dim flg As Boolean
    
    i =  lstData.getSelectedItemPos + 1
    
    If i < 1 Then Exit Sub
    
    Select Case Bins(i)._Type
        Case BINTYPE_CATEGORY
            flg = mdlEditCategory.Show(Bins(i)._Id)
        Case BINTYPE_ITEM
            flg = mdlEditItem.Show(Bins(i)._Id)
    End Select
    
    If flg Then
        Update_lstData
        lstData.SelectItemPos(i - 1, True)
    End If
    
End Sub

まず、ダブルクリック時の選択されているリスト項目の番号を取得します。そして、その番号から選択されているのが分類か項目かをBinデータのTypeから取得し、それぞれに合った編集ダイアログを表示しています。
そして、編集ダイアログの戻り値から更新の有無を判断し、データが更新されていればリストボックスも更新します。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ管理ダイアログ その5

データの並べ替えについて解説します。

次に、データを下方向に移動するbtnDown_actionPerformed関数を作成します。

Private Sub btnDown_actionPerformed
    
    Dim i As Integer
    
    i = lstData.getSelectedItemPos + 1
    If i < 1 Or mdlBin.Count <= i Then Exit Sub
    
    Dim Id1 As Integer
    Dim Id2 As Integer
    
    Id1 = Bins(i)._Id
    
    Dim j As Integer
    For j = i + 1 To mdlBin.Count
        If Bins(j)._Depth < Bins(i)._Depth Then
            Exit For
        ElseIf Bins(j)._Depth = Bins(i)._Depth Then
            Id2 = Bins(j)._Id
            Exit For
        End If
    Next j
    
    If Id2 = 0 Then Exit Sub
    
    Select Case Bins(i)._Type
        Case BINTYPE_CATEGORY
            mdlCategory.Swap(Categories(Id1), Categories(Id2))
        Case BINTYPE_ITEM
            mdlItem.Swap(Items(Id1), Items(Id2))
    End Select
    
    Update_lstData
    
    For j = i + 1 To mdlBin.Count
        If Bins(j)._Depth < Bins(i)._Depth Then
            Exit For
        ElseIf Bins(j)._Depth = Bins(i)._Depth Then
            lstData.SelectItemPos(j - 1, True)
            Exit For
        End IF
    Next j
    
End Sub

まず、下に移動するのだからリストで選択されたアイテムが一番下か、何も選択されていなければ処理を終了します。
選択されたデータと一つ下のデータのIDを保存するための変数を用意し、選択されていたIDをId1に記録します。次にBinデータを選択されたデータから下って行き、一つ下に位置する同じレベルのデータを探します。見つかったらId2にIDを記録しますが、見つからなかったらそこで処理を中断します。
一つ下のデータが見つかったら、選択されたデータのBinタイプを識別し、分類または項目のSwap関数でデータを入れ替えます。
入替後にリストボックスを更新し、データの移動先を選択済みにします。この処理を追加すると連続して移動させる事ができるので、便利度が増すのではないでしょうか。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ管理ダイアログ その4

データの並べ替えについて解説します。

まず、データを上方向に移動するbtnUp_actionPerformed関数を作成します。

Private Sub btnUp_actionPerformed
    
    Dim i As Integer
    
    i = lstData.getSelectedItemPos + 1
    If i < 2 Then Exit Sub
    
    If Bins(i)._Id = 1 Then Exit Sub
    
    Dim Id1 As Integer
    Dim Id2 As Integer
    
    Id1 = Bins(i)._Id
    
    Dim j As Integer
    Dim k As Integer
    For k = 1 To i
        j = i - k
        If Bins(j)._Depth < Bins(i)._Depth Then
            Exit For
        ElseIf Bins(j)._Depth = Bins(i)._Depth Then
            Id2 = Bins(j)._Id
            Exit For
        End If
    Next k
    
    If Id2 = 0 Then Exit Sub
    
    Select Case Bins(i)._Type
        Case BINTYPE_CATEGORY
            mdlCategory.Swap(Categories(Id1), Categories(Id2))
        Case BINTYPE_ITEM
            mdlItem.Swap(Items(Id1), Items(Id2))
    End Select
    
    Update_lstData
    lstData.SelectItemPos(j - 1, True)
    
End Sub

まず、上に移動するのだからリストで選択されたアイテムが一番上なら処理を終了します。
選択されたデータと一つ上のデータのIDを保存するための変数を用意し、選択されていたIDをId1に記録します。次にBinデータを選択されたデータから遡り、一つ上に位置する同じレベルのデータを探します。見つかったらId2にIDを記録しますが、見つからなかったらそこで処理を中断します。
一つ上のデータが見つかったら、選択されたデータのBinタイプを識別し、分類または項目のSwap関数でデータを入れ替えます。
入替後にリストボックスを更新し、データの移動先を選択済みにします。この処理を追加すると連続して移動させる事ができるので、便利度が増すのではないでしょうか。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ管理ダイアログ その3

分類・項目データの追加と削除について解説します。

分類の追加はbtnAddCategoryコントロールをクリックして行うので、btnAddCategory_actionPerformed関数を作成します。

Private Sub btnAddCategory_actionPerformed
    
    mdlCategory.Add
    mdlEditCategory.Show(mdlCategory.Count)
    Update_lstData
    
End Sub

mddlCategory.Add関数で分類の追加を行います。そしてmdlCategory.Count関数により、追加した分類の番号を取得して編集用ダイアログを表示し、ダイアログを閉じたらリストを更新するという処理を行います。

次に項目の追加はbtnAddItem_actionPerformed関数で行います。

Private Sub btnAddItem_actionPerformed
    
    If mdlCategory.Count < 1 Then Exit Sub
    mdlItem.Add
    mdlEditItem.Show(mdlItem.Count)
    Update_lstData
    
End Sub

項目は分類がなければ登録できないので、まず分類が1つ以上登録されている事を確認します。そして項目を追加し、追加した項目の編集ダイアログを表示し、ダイアログを閉じたらリストを更新するという処理を行います。

最後に削除はbtnDelete_actionPerformed関数で行います。

Private Sub btnDelete_actionPerformed
    
    Dim i As Integer
    
    i = lstData.getSelectedItemPos + 1
    
    Select Case Bins(i)._Type
        Case BINTYPE_CATEGORY
            mdlCategory.Delete(Bins(i)._Id)
        Case BINTYPE_ITEM
            mdlItem.Delete(Bins(i)._Id)
    End Select
    
    Update_lstData
    
End Sub

リストボックスにて選択されたアイテムの番号を取得します。そして選択されたアイテムからBinデータを参照し、分類と項目を区別して選択されたデータを削除しています。削除が終わったらリストボックスの内容を更新しています。

テーマ:OpenOffice.org - ジャンル:コンピュータ

データ管理ダイアログ その2

前回作成したアクションリスナー用の関数を作成します。コードは下記となります。

Private Sub dlgDataManagerActionListener_actionPerformed(oEvent)
    
    Select Case oEvent.Source.getModel().Name
        Case "lstData"
            lstData_actionPerformed(oEvent)
        Case "btnAddCategory"
            btnAddCategory_actionPerformed
        Case "btnAddItem"
            btnAddItem_actionPerformed
        Case "btnDelete"
            btnDelete_actionPerformed
        Case "btnUp"
            btnUp_actionPerformed
        Case "btnDown"
            btnDown_actionPerformed
        Case "btnSave"
            btnSave_actionPerformed
        Case "btnEditProperty"
            mdlProperty.LoadAll
            setScreenUpdating(False)
            If mdlEditProperty.Show Then _
                mdlProperty.SaveById(ActiveProperty)
            setScreenUpdating(True)
        Case "btnProgress"
            mdlEditProgress.Show
        Case "btnImport"
            mdlMain.ImportDataFromFile
            oDialog.EndExecute
        Case "btnPerson"
            mdlManagePerson.Show
        Case Else
        
    End Select
End Sub

Private Sub dlgDataManagerActionListener_disposing()

End Sub

これだけの分岐があれば、この書き方の利点を実感して頂けるのではないでしょうか。
もし、これだけの量のコントロールに一つ一つリスナーを作成していたら気が狂ってしまうと思いますし、大幅な修正をしなくてはならない事態になったら廃人になってしまうかもしれません。

これは、完成しているガントチャートforOOoから持ってきたコードなので、mdlProperyモジュールやmdlMain.ImportDataFromFile関数など、まだ作られていない部分も含まれていますのでご注意下さい。
次回から、各コントロール_actinPerformed関数を作成する手順を説明していきます。

テーマ:OpenOffice.org - ジャンル:コンピュータ

COPYRIGHT(C) 2004 POWERD BY FC2 ALLRIGHT RESERVED.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。