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

工程データを保存する型を作ります。

まず、OOoBasic内で日本語を使うのはあまり望ましい事ではないので、データ構造で示した内容を英語に変えます。

  • 工程 -> Schedule
  • 番号 -> Id
  • 名称 -> Name
  • 項目番号 -> ItemId
  • 予定開始日時 -> PlanBegin
  • 予定終了日時 -> PlanEnd
  • 予定線の色 -> PlanColor
  • 実績開始日時 -> ActBegin
  • 実績終了日時 -> ActEnd
  • 実績線の色 -> ActColor
  • 線種 -> LineType
  • 人数 -> Weight

これを使って、型を宣言すると

Type ScheduleType
    _Id As Integer
    _Name As String
    _ItemId As Integer
    _PlanBegin As Date
    _PlanEnd As Date
    _PlanColor As Long
    _ActBegin As Date
    _ActEnd As Date
    _ActColor As Long
    _LineType As Integer
    _Weight As Long
End Type
となります。

スポンサーサイト
項目型の作成
項目データを保存する型を作ります。
まず、OOoBasic内で日本語を使うのはあまり望ましい事ではないので、データ構造で示した内容を英語に変えます。
 項目 -> Item
 番号 -> Id
 名称 -> Name
 分類番号 -> CategoryId
 担当番号 -> PersonId
 備考 -> Note
 完了 -> Complete
 進捗状況 -> Status
 ハイパーリンク -> Hyperlink
 上位項目 -> UpperId
 予備 -> Spare
 進捗線データ -> Progress1~20

これを使って、型を宣言すると
Type ItemType
_Id As Integer
_Name As String
_CategoryId As Integer
_PersonId As Integer
_Note As String
_Complete As Boolean
_Status As Integer
_Hyperlink As String
_UpperId As Integer
_Spare As String
_Progress1 As Date
_Progress2 As Date
_Progress3 As Date
_Progress4 As Date
_Progress5 As Date
_Progress6 As Date
_Progress7 As Date
_Progress8 As Date
_Progress9 As Date
_Progress10 As Date
_Progress11 As Date
_Progress12 As Date
_Progress13 As Date
_Progress14 As Date
_Progress15 As Date
_Progress16 As Date
_Progress17 As Date
_Progress18 As Date
_Progress19 As Date
_Progress20 As Date
End Type
となります。
分類型の作成
分類データを保存する型を作ります。
まず、OOoBasic内で日本語を使うのはあまり望ましい事ではないので、データ構造で示した内容を英語に変えます。
 分類 -> Category
 番号 -> Id
 名称 -> Name
 表示・非表示 -> Visible

これを使って、型を宣言すると
Type CategoryType
_Id As Integer
_Name As String
_Visible As Boolean
End Type
となります。
Typee - データ型を作る
OOoBasicでは変数を指定するために
Dim i As Integer
とします。これはiという名前の変数をInteger(整数型)で使用する事を宣言するものです。同様に、
Dim s As String
Dim oSheet As Object
などとして、それぞれの変数の使用方法を指定(宣言)します。
ここで、この後ろに付けるInteger、String、Objectに相当するものを自分で作って使用する事ができます。

簡単な例を下記に示します。
Type Book
_Name As String
_Price As Integer
_Author As String
_PublishedDate As Date
_Rate As Byte
End Type
これはBook(本)型、本の名前、値段、著者、出版日、点数を記録する事ができます。

使い方は、
Dim myBook As Book
With myBook
._Name = "開発者のためのExcel97VBAプログラミングガイド"
._Price = 3200
._Author = "大村あつし"
._PublishedDate = CDate("1998/8/10")
._Rate = 5
End With

MsgBox myBook._Name
という感じになります。

これを使って、もう少し例を示すと
Sub Main

Dim myBooks(2) As Book

'嘘データを入れてみます
SetBook(myBooks(0), "起動戦士ガンダム",500,"安彦良和",CDate("2004/3/4"),10)
SetBook(myBooks(1), "新世紀エヴァンゲリオン",550,"貞本義行",CDate("2004/5/23"),8)
SetBook(myBooks(2), "MASTERキートン",520,"浦沢直樹",CDate("2004/7/1"),9)

Dim i As Integer
Dim s As String

For i = 0 To UBound(myBooks())
If s <> "" Then s = s & chr(13)
s = s & myBooks(i)._Name
Next i

MsgBox s

End Sub

Sub SetBook(myBook As Book, _Name As String, _Price As Integer, _
_Author As String, _PublishedDate As Date, _Rate As Byte)

With myBook
._Name = _Name
._Price = _Price
._Author = _Author
._PublishedDate = _PublishedDate
._Rate = _Rate
End With

End Sub
という感じになります。小さなマクロを作っているときはこれを使う必要はあまり感じないかもしれませんが、大きなマクロになるととても重宝します。

これを使わなかったらこんな感じになります。
Dim _Name(2) As String
Dim _Price(2) As Integer
Dim _Author(2) As String
Dim _PublishedDate(2) As Date
Dim _Rate(2) As Byte

_Name(0) = "起動戦士ガンダム"
_Price(0) = 500
_Author(0) = "安彦良和"
....
_Name(1) = "..."
....
設計-その5 データ構造「担当者」
「担当者」について、説明します。

データ構造概略にもあるように、工程には以下の項があります。
  1. 番号
  2. 氏名
  3. 電話1
  4. 電話2
  5. FAX
  6. E-Mail
  7. その他
番号は工程を一意に認識するために付ける番号です。

氏名は担当者の名前です。

それ以外は別に工程表とは特に関係がないのですが、記録として入れておきます。
設計-その4 データ構造「工程」
「工程」について、説明します。

データ構造概略にもあるように、工程には以下の項があります。
  1. 番号
  2. 名称
  3. 項目番号
  4. 予定開始日時
  5. 予定終了日時
  6. 予定線の色
  7. 実績開始日時
  8. 実績終了日時
  9. 実績線の色
  10. 線種
  11. 人数

番号は工程を一意に認識するために付ける番号です。

名称は工程の開始日に当たるセルにラベルとして付ける名前を保存するためのものです。

項目番号は、工程の割り振られる項目の番号です。項目の説明を参照して下さい。

予定開始日時、終了日時は工程の予定を記録するためのものです。

予定線の色は、工程表に表示する線の色を指定するためのものです。

実績開始日時、終了日時は工程の実績を記録するためのものです。

実績線の色は、工程表に表示する線の色を指定するためのものです。

線種は、直線や長方形など工程線の描画方法を区分けするためのものです。

人数は、工程に重みを付ける事で工数の計算などに利用します。
設計-その3 データ構造「項目」
「項目」について、説明します。

データ構造概略にもあるように、項目には以下の項があります。
  1. 番号
  2. 名称
  3. 分類番号
  4. 担当番号
  5. 備考
  6. 完了
  7. 進捗状況
  8. ハイパーリンク
  9. 上位項目
  10. 予備
  11. 進捗線データ1~20

番号は項目を一意に認識するために付ける番号です。これは「工程」の項目番号とリンクされるので、簡単に変更するわけにはいきません。

名称は作業の名前を保存するためのものです。

分類番号は、項目の割り振られる分類の番号です。分類の説明を参照して下さい。

担当番号は、割り当てられた担当者の番号です。担当の説明を参照して下さい。

備考は、作業についての補足があれば入力するメモのようなものです。

完了は、この項目が完了したか否かを記録するためにあります。一般的に予定より早く終わったり、遅く終わる事は珍しくなく、工程の実績データでは作業の完了状態を把握する事は難しいです。そのため、完了という項を設ける事でその補足をするためのものです。

進捗状況は、完了と同様に実績データの日数が予定より短かったり、大幅に超過したりしていても作業自体の進捗状況と合致しないことが多々あります。このため、進捗状況を別途用意してこちらで管理できるようにするためのものです。

ハイパーリンクは、関連するURLやファイル等があればそれを記録するためのものです。Excel版では、ハイパーリンクの設定された分類をクリックするとそのページを表示したり、ファイルを開いたりできるようになっています。

上位項目は、項目をさらに階層化するためのものです。2005年12月現在のガントチャートforOOoには機能が実装されていませんが、Excel版では10層までの階層を設定できるようになっています。

予備は、現在利用方法が確定していないのですが、とりあえずスペースだけとってあるものです。

進捗線データ1~20は、別名イナズマ線と呼ばれる工程の進み具合を計るための補助になる工程表上に書く折れ線を描画するためのデータです。他の工程表作成ソフトとは多少使い方が異なるので、人によっては使いづらいという話を聞きますが、とりあえず動いているので現状のまま作っていきたいと思います。
設計-その2 データ構造「分類」
「分類」について、説明します。

データ構造概略にもあるように、分類には以下の項があります。
  1. 番号
  2. 名称
  3. 表示・非表示

番号は分類を一意に認識するために付ける番号です。これは「項目」の分類番号とリンクされるので、簡単に変更するわけにはいきません。

名称は工程表に表示するために付けるものです。項目を割り振るためのものなので、付随する項目がわかりやすい名称にすると管理しやすくなると思います。

表示・非表示は、分類に付随する項目をいつも表示するのではなく、必要の無い時には表示しないようにするためのオプションです。
設計-その1 データ構造概略
まず、データ構造の設計を始めます。とは言っても、いきなりではどうすればよいかわからないと思うので、既にあるものを解説し、それを利用します。

まず、ガントチャートforOOoのデータ構造を示します。



ここで、線でつながっている部分はデータを参照しながら利用する事を意味します。

「分類」はいくつかの「項目」とリンクされ、「項目」はいくつかの「工程」とリンクされています。こうする事で、データを表示する際、分類分けが容易になり、一つの項目にいくつもの工程線を登録する事が可能となります。

また、「担当者」もいくつかの「項目」とリンクされます。これにより、項目に毎回担当者名を入力する事無く、工程表を作成する事ができるようになります。

ガントチャートforOOo公開ページにて既存のものをダウンロードし、内容を確認してみて下さい。「分類」「項目」「工程」「担当」の各シートに、上記データ構造に合わせて列が割り当てられているのがわかります。
準備-その2 セルの値取得、入力
選択中のシートにあるB3セルの文字列を取得するマクロを下記に記します。
Dim oSheet As Object
Dim oCell As Object

oSheet = ThisComponent.CurrentController.ActiveSheet
oCell = oSheet.getCellByPosition(1, 2)

MsgBox oCell.String
また、数値データを取得する場合は最後の行を
MsgBox oCell.Value
とします。

ここで注意する事は、セルを座標で取得する場合に行、列の開始番号が「0」ということです。また指定する数値は左側が列で、右側が行となります。
「A1」は「0,0」で、「A2」が「1,0」、「C5」は「2,4」という感じです。
ExcelVBAでは開始番号が「1」なので、VBAの経験者は多少混乱するかもしれません。

次に、選択中のシートにあるD5セルに文字列を入力するマクロを下記に記します。
Dim oSheet As Object
Dim oCell As Object

oSheet = ThisComponent.CurrentController.ActiveSheet
oCell = oSheet.getCellByPosition(3, 4)

oCell.String = "これは練習です。"
これを実行するとD5セルに「これは練習です。」という文字列が入ります。

しかし、毎回これをやっていては大変なので、またまた関数を定義します。
Public Function Cells(oSheet As Object, _
col As Integer, row As Integer) As Object

If col < 0 Or Row < 0 Then
Cells = Nothing
Else
Cells = oSheet.getCellByPosition(col - 1, row - 1)
End If

End Function
前回(その1)で定義したシート取得の関数と組み合わせて、以下のように使う事ができます。
MsgBox Cells(ActiveSheet, 1, 1).String
Cells(Sheets("表1"), 2, 3).Value = 100

この関数では、ExcelVBAと同じように行列の開始番号を「1」としました。
また、ExcelVBAでは
Sheet("Sheet1").Cells(1,2) = 123
とかいう使い方ができるのですが、クラスの定義ができないOOoBasicではここまで同じにはできない感じです。

この関数は後々まで使うので、mdlMainというモジュールを作ってその中に入れておきます。
準備-その1 シートの取得
OpenOfficeでは、現在選択中のシートを取得するために
ThisComponent.CurrentController.ActiveSheet
としなくてはなりません。
そこで、下記の関数を定義します。
Public Function ActiveSheet() As Object

ActiveSheet = ThisComponent.CurrentController.ActiveSheet

End Function
また、特定のシートを取得するためには
ThisComponent.Sheets.getByIndex(0)
とか
ThisComponent.Sheets.getByName("表1")
としなくてはならないので、
Public Function Sheets(val As Variant) As Object

Select Case TypeName(val)
Case "String"
Sheets = ThisComponent.Sheets.getByName(val)
Case "Integer"
Sheets = ThisComponent.Sheets.getByIndex(val)
Case Else
Sheets = Nothing
End Select

End Function
という関数を定義して利用する事にします。

この関数は後々まで使うので、mdlMainというモジュールを作ってその中に入れておきます。
はじめに
ガントチャートというのは工程を管理するのに使われる線表の一つです。(参考URL)
これをExcelVBAを使って作るマクロを公開していましたがOpenOffice.orgでも同じ事ができることがわかり、「ガントチャートforOOo」としてOpenOffice.org版を公開することにしました。(参考URL)

OpenOffice.orgのマクロ言語OOoBasicはVBAと似ているが微妙に違い、この違いからVBAに慣れすぎた人にはOOoBasicのハードルが非常に高くなってしまっていると思います。そのため、OOoBasicからVBAへの移行作業にはとても大きな負担が発生します。
「別の言語だ」と割り切ってしまうことが出来る人もいるでしょうが、Excelによる遺産がたくさん残っている人にとってそれは出来ないことだと思います。また、できるところから移行するなどという事も無理でしょう。「Excel使えば出来る事を何故OpenOffice.orgでしなければならないのか」という命題にぶつかってしまい、結局Excelの呪縛から抜け出す事ができません。
但し、Excel自体でもバージョンアップの度に似たような移行作業が伴うのは周知の事実です。

そこで、ガントチャートforOOoを作る手順を紹介しながらOOoBasicについて解説をします。なるべくExcelVBAと対比しながら違いを説明していきたいとも考えています。

* ドラッグすると、見える場所を移動させることができます。

これを読んだ人がOOoBasicを始めて別のマクロを公開し、OpenOffice.orgがもっと広がる契機になることを願います。

テーマ:プログラミング - ジャンル:コンピュータ

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