LibreOffice(Calc)でのマクロ : 11. 見積書作成 (4) – 見積もり明細の入力ダイアログ表示

ユーザー Mr. Union の写真
2014年6月30日 -- Mr. Union

見積書の明細を入力するダイアログができあがったら、それを表示させるマクロを用意します。そのマクロは以下の通り記述します。

 REM ***** BASIC *****

 Dim Dlg1 As Object Dim Dlg2 as Object ' 「Dialog2」を扱うためのオブジェクト変数を宣言する。

 REM================================================= Sub Dlg1Show Dim Fld(1 to 4) As Object Dim ADate As Date

 DialogLibraries.LoadLibrary("Standard") Dlg1=CreateUnoDialog(DialogLibraries.Standard.Dialog1)

 Fld(1)=Dlg1.getControl("TextField1") Fld(4)=Dlg1.getControl("TextField4")

 ADate=DateAdd ("m", 3, Date) Fld(1).Text=Format(Date,"yyyy年m月d日") Fld(4).Text=Format(ADate,"yyyy年m月d日")

 Dlg1.execute()

 End Sub

 REM================================================= Sub Dlg1CommandButton1Click()



 Dim Fld(1 to 6) As Object Dim Str(1 to 6) As String Dim ChStr(1 to 6) As String Dim i As Long Dim oDoc As Object Dim oSheet1 As Object Dim oSheet2 As Object Dim oCel As Object Dim Pos(1 to 6) As String Dim

  Position As String Dim PreWord(1 to 6) As String Dim AftWord(1 to 6 ) As String

 oDoc=StarDesktop.CurrentComponent oSheet1=oDoc.getSheets.getByName("見積書フォーム") oSheet2=oDoc.getSheets.getByName("見積書定義")

 REM 自社情報の転記 For i=1 to 6 oCel=oSheet2.getCellByPosition(1,i) ChStr(i)=oCel.String oCel=oSheet2.getCellByPosition(2,i) Str(i)=oCel.String If Str(i)<>"" Then oCel=oSheet2.getCellByPosition(4,i) Pos(i)=oCel.String Position=Pos(i) oCel=oSheet1.getCellRangeByName(Position) If ChStr(i)="〒" Then oCel.String=ChStr(i) & Str(i) ElseIf ChStr(i)="電話番号" Then oCel.String=ChStr(i) & ":" & Str(i) ElseIf ChStr(i)="FAX番号" Then oCel.String=ChStr(i) & ":" & Str(i) Else oCel.String=Str(i) End If End If Next i

 REM 見積書毎の情報転記 For i=1 to 4 Fld(i) = Dlg1.GetControl("TextField" & i) Str(i)=Fld(i).Text

 If InStr(Str(i), "/")>0 Then Str(i)= Format(Str(i),"yyyy年m月d日") End If

 oCel=oSheet2.GetCellByPosition(4,i+10) Pos(i)=oCel.String Position=Pos(i) oCel=oSheet2.GetCellByPosition(1,i+10) PreWord(i)=oCel.String oCel=oSheet2.GetCellByPosition(2,i+10) AftWord(i)=oCel.String

 oCel=oSheet1.getCellRangeByName(Position) oCel.String=PreWord(i) & Str(i) & AftWord(i) Next i

 Dlg1End Dlg2Show

 End Sub

 REM================================================= Sub Dlg1End

 Dlg1.EndExecute()

 End Sub

  REM================================================= Sub Dlg2Show

' 「Dialog2」を表示するマクロ。

 Dim oDoc As Object Dim oSheet As Object Dim oCel As Object Dim i As Long Dim Str As String Dim ItemVol As Long

 DialogLibraries.LoadLibrary("Standard") Dlg2=CreateUnoDialog(DialogLibraries.Standard.Dialog2) ' 変数「Dlg2」に「Dialog2」を入れる。

 oDoc=StarDesktop.CurrentComponent oSheet=oDoc.getSheets.getByName("見積書定義") ' 変数「oSheet」に「見積書定義」のシートを入れる。

 i=0

 Do Until Str="アイテム数" ' 「見積書定義」シートから「アイテム数」を拾う。 oCel=oSheet.getCellByPosition(0,i) Str=oCel.String i=i+1 Loop

 oCel=oSheet.getCellByPosition(4,i-1) ItemVol=oCel.Value ' 変数「ItemVol」にアイテム数を入れる。

 For i=1 to 40 If i > ItemVol*4 Then Dlg2.GetControl("TextField" & i ).Visible="False" End If ' アイテム数を超える分のテキストボックスを非表示にする。 next i

 Dlg2.Execute()

 End Sub

後半部分の詳細(クリックで拡大)

まず、「Dialog2」を扱うためのオブジェクト変数を宣言します。ただし、ダイアログは複数のマクロにまたがって扱うことになるため、「Dim Dlg2 As Object」という記述自体は、特定のマクロのなかではなく、その外側に書いておきます。上述の例では、「Dlg1」のすぐ次の行で宣言しています。

そして、「Dlg2Show」という「Dialog2」を表示させるマクロを、「Module1」の一番下に追記しました。

まず、変数「Dlg2」に「Dialog2」を入れて、変数「oSheet」に「見積書定義」という名前のシートを入れます。続いて、「見積書定 義」のシートから、「アイテム数」という行を探し、見つかったら「4」の列(列は「0」から始まるので5番目、つまり「E」の列)の数字を 「ItemVol」という変数に入れます。この「E」列のデータは、数値として読み込まれるよう、セル内に「=D22*1」という計算式が入れてありま す。これで、見積書に記載できる明細の品目数の最大値を取得できます。

次に、ダイアログを表示させる際のテキストボックスの表示・非表示を指定しています。一応、「Dialog2」には、10品目(アイテム)分のテキ ストボックスが表示できるようになっています。1品目あたり、「品名」、「単価」、「数量」、「備考」の4つのテキストボックスが用意されているので、 10品目分である40個のテキストボックスが準備されています。

しかし例えば、実際には7つまでしか見積書の明細には記載できないとなると、8~10までのテキストボックスは必要なくなります。具体的には、 1~7個までのテキストボックスである「TextField1」~「TextField28」までのみ必要で、それ以上の「TextField29」~ 「TextField40」はいらないわけです。その不要なテキストボックスは、表示させないようにすための記述が以下です。

For i=1 to 40 If i > ItemVol*4 Then Dlg2.GetControl("TextField" & i ).Visible="False" End If next i

このようにアイテム数に応じて、表示されるテキストボックスが変わるようにしておいて、「Dlg2.Execute()」で、「Dialog2」を表示させます。

サンプルファイルはこちら