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

作成したマクロをシート上のフォームに割り当てる操作を行います。

フォームを編集可能な状態にしてから、フォーム上で右クリックをして「コントロール」を選択すると、下図のようなダイアログが表示されます。


イベントタブを選択すると、割り当てる事のできるイベントが列挙されるので、「動作時」の右端にある「...」というボタンをクリックします。クリックすると下図のダイアログが表示されます。





そこで、表示されたダイアログの下部にあるマクロから目的の関数があるモジュールを探し、表示されたリストから関数を選択します。そして、「割り当て」ボタンを押すと登録完了です。以降は、このボタンを押す事で目的のマクロを実行する事ができるようになります。

同様に、全てのボタンに必要なマクロを登録します。

実は、これで終わりのように感じられるかもしれませんが、このままファイルを保存して開き、ボタンでマクロを実行させようとするとエラーが出ます。エラーの「OK」ボタンを押してから、再度ボタンでマクロを実行させようとすると今度は正常に動作します。
これは、OpenOffice.orgの自作ダイアログは読み込みを指示しなくては読込まれないために発生する現象で、エラーの後にIDEが表示される事で自作ダイアログが読込まれるので、次からエラーが発生しないのです。そこで、このエラーを回避するため、ファイルを開いた時に自作ダイアログを読込むようなマクロを自動で実行するよう設定します。
ダイアログを読み込むコードは下記となります。

Sub Auto_Open
    DialogLibraries.LoadLibrary("Standard")
End Sub

次に、このマクロをファイルが開かれたら自動的に実行させるため、メニューバーの「ツール」から「ユーザー設定」を選択します。すると、下図のダイアログが表示されるので、イベントタブを選び、イベントの一覧から「ドキュメントを開く時」を選択します。その状態で、下部のリストから目的のモジュール(ここではmdlMain)とマクロ(ここではAuto_Open)を探し、選択してから「割り当て」ボタンを押します。


以上で、1ヶ月工程のシートは完成です。このシートに合わせてプロパティを書けば工程表を更新することが可能となります。また、他の期間も公開されているファイルを参考にすれば、簡単に作成できるものと考えます。

スポンサーサイト

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

工程表シート作成 その2

次に工程の開始日を変更するマクロを作成します。マクロの流れは、Initialize関数で初期化した後、mdlPropertyモジュールのChangeBeginDate関数を実行し、変更されたならば変更を保存してチャートを更新するというもので、コードは下記となります。

Sub ChangeBeginDate
    Initialize
    If mdlProperty.ChangeBeginDate Then
        mdlProperty.SaveAll
        mdlDraw.Update
    End If
End Sub

ここで、ChangeBeginDate関数はmdlProperty内で下記のように実装されています。簡単に処理の内容を説明すると

  1. データを読込み、選択中のシートに対応したプロパティを選択する
  2. 現在のデータをBeginDateに保存しておく
  3. カレンダーを表示して、日付を選択してもらう
  4. 選択した日付がBeginDateと等しくなく、不適切な日付でなければデータを更新して真を返す
となります。

Private Function ChangeBeginDate As Boolean
    
    LoadAll
    getActiveId
    
    If ActiveId < 1 Or Count < ActiveId Then Exit Function
    
    Dim BeginDate As Date
    Dim wk As Date
    
    BeginDate = Properties(ActiveId)._BeginDate
    wk = mdlCalendar.Show(BeginDate, CALENDARTYPE_SELECT)
    If FirstDate < wk And wk <> BeginDate Then
        Properties(ActiveId)._BeginDate = wk
        ChangeBeginDate = True
    Else
        ChangeBeginDate = False
    End If
    
End Function

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

工程表シート作成 その1

とりあえず、1ヶ月工程用のシートを作成します。作成したシートは下図となります。


フォーム機能でボタンを4つ配置し、それぞれの表示用の名前を変更します。次に、それぞれのボタンに登録するマクロを作成します。ここで作成するマクロは全てmdlMainモジュールに記載します。

まずは、工程表の更新としてChartUpdate関数を作成します。マクロの流れは、Initialize関数で初期化した後、mdlDrawモジュールのUpdate関数を実行するというもので、コードは下記となります。

Sub ChartUpdate
    Initialize
    mdlDraw.Update
End Sub

次に、データの編集用のEditData関数を作成します。マクロの流れは、Initialize関数で初期化した後、mdlDataManagerモジュールのShow関数を実行するというもので、コードは下記となります。

Sub EditData
    Initialize
    mdlDataManager.Show
End Sub

次に、休日の編集を行うEditHoliday関数を作成します。マクロの流れは、Initialize関数で初期化した後、mdlCalendarモジュールのShow関数を実行して休日の編集を行い、編集終了後にmdlDrawモジュールのUpdateHoliday関数を実行するというもので、コードは下記となります。

Sub EditHoliday
    Initialize
    mdlCalendar.Show(Now(), CALENDARTYPE_Edit)
    mdlDraw.UpdateHoliday
End Sub

ちなみに、mdlDrawモジュールのUpdateHoliday関数とは、Update関数から休日の色分け部分のみを切り出したもので、コードは下記となります。

Sub UpdateHoliday

    LoadAll
    
    If Not getProperty Then Exit Sub
    
    oSheet = mdlMain.Sheets(oProperty._SheetName)
    
    setScreenUpdating(False)
    setMaxRows
    paintHoliday
    setScreenUpdating(True)
    
End Sub

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

チャートの描画 その8

最後にこれまで解説してきた処理や作成してきた関数を組み合わせて、工程表を更新するUpdate関数を作成します。

これまで同様、処理を簡単に説明すると

  1. データの読み込む
  2. 描画するシートの取得する
  3. チャートの最終日を計算する
  4. チャートを描画するためにデータの予備処理を行う
  5. 分類区分により必要なBinデータを生成する
  6. 描画に必要な最大行数を計算する
  7. 以降、画面の描画を伴うので更新処理を一時停止させる
  8. 日付欄を更新する
  9. 休日の塗り分けを行う
  10. チャートを描画するための図形を準備する
  11. 入力済みのセルの内容を消去する
  12. 分類、項目、工程のデータに合わせて、チャートを描画する
  13. 停止した描画処理を再開させる
となります。

Sub Update
    
    LoadAll
    
    If Not getProperty Then Exit Sub
    
    oSheet = mdlMain.Sheets(oProperty._SheetName)
    
    CulcEndDate
    checkData
    
    Select Case oProperty._CategorizeType
        Case CATEGORIZETYPE_CATEGORY
            mdlBin.CreateBins(False)
        Case CATEGORIZETYPE_Person
            mdlBin.CreateBinsByPerson(False)
    End Select
    
    setMaxRows
    
    setScreenUpdating(False)
    
    printDateHeader
    paintHoliday
    
    setChartBars
    setProgressBars
    
    '*** Clear Contents ***
    oSheet.getCellRangeByPosition( _
        oProperty._LeftColumn - 1, _
        oProperty._TopRow + ChartHeaderRows - 1, _
        oProperty._LeftColumn + oProperty._DrawColumns + _
            ChartHeaderColumns - 1, _
        oProperty._TopRow + oProperty._DrawRows + _
            ChartHeaderRows - 2 _
    ).clearContents( _
        com.sun.star.sheet.CellFlags.STRING + _
        com.sun.star.sheet.CellFlags.VALUE _
    )
    
    Dim i As Integer
    
    RectPos = 0
    LinePos = 0
    PrgsPos = 0
    
    For i = 1 To mdlBin.Count
        DrawChart(Bins(i))
    Next i
    
    For i = 1 To 20
        DrawProgressLine(i)
    Next i
    
    setScreenUpdating(True)
    
End Sub

ここで作成したUpdate関数をシート上に配置したフォームのボタンに割り当てれば、この工程表マクロは完成です。

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

チャートの描画 その7

次に項目名の表示で作ったDrawChart関数で使用しながら、全く解説していなかったDrawChartBar関数を作成します。

これは項目データのIDに割り当てられた工程データを探し、それをsetSchdule関数(後述)に送ります。その処理を項目ID回数繰り返す事で、それぞれの項目に割り当てられた工程のチャートを描画することができます。多少非効率的な処理ですが、単純な作業なのでそのままコードにしてみました。

Sub DrawChartBar(ItemId As Integer, Row As Integer)
    
    Dim i As Integer
    
    For i = 1 To mdlSchedule.Count
        
        If Schedules(i)._ItemId = ItemId Then
            
            setSchedule(Schedules(i), Row)
            
        End If
        
    Next i
    
End Sub

上述のsetSchedule関数は下記となります。渡された工程データから予定と実績のそれぞれについて、描画処理が必要か否かのフラグを確認し、必要ならば前回作成したsetChartBar関数に渡します。また工程の名称を表示する設定になっていれば、工程の左端のセルにその名称を入力するというものです。

Sub setSchedule(Schedule As Object, Row As Integer)
    
    Dim flgPrintLabel As Long
    
    If oProperty._PrintLabel Then
        flgPrintLabel = True
    Else
        flgPrintLabel = False
    End If
    
    If Schedule._DrawPlan Then
        setChartBar("Plan", Schedule, Row)
        If flgPrintLabel Then
            Cells(oSheet, _
                Int(getColumnIndexByDate(Schedule._PlanBegin)+1), _
                Row).String = Schedule._Name
            flgPrintLabel = False
        End If
    End If
    
    If Schedule._DrawAct Then
        setChartBar("Act", Schedule, Row)
        If flgPrintLabel Then
            Cells(oSheet, _
                Int(getColumnIndexByDate(Schedule._PlanBegin)+1), _
                Row).String = Schedule._Name
            flgPrintLabel = False
        End If
    End If
    
End Sub

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

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