4月のカレンダー
 123456
78910111213
14151617181920
21222324252627
282930    
最近の日記
全体の新着
各月の日記
ユーザーRSS
Pitekanさんの公開日記
01月18日
21:07
一つのCalcのいくつかのシートからデータを集めて(データによるセル参照有)、特定のシート上に置き
それを繰り返し印刷するプログラム(マクロ)を作成しました。
元々VBAの上で使っていたものを移植する作業です。
目標としては、VBAマクロの一定部分の「自動変換」を狙っています。
Calcのシートを利用するのは、印刷に関する設定の大分部を
マクロではなくCalc上で済ませたいからです。
しかし、印刷範囲やセルの設定などを知っておくことは大切なことと感じています。
以下にマクロコードの一部分を書いて、解説します。
最初に Option Explicit を宣言しています。プログラムを管理する上で必要と感じています。
印刷ループの中では印刷部数などの変更をしないものとします。ここでは印刷部数各1部、枚数1枚
次の11行は印刷ループの前に置きます。(ループの中に入れるとエラーになった)
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args12(2) as new com.sun.star.beans.PropertyValue
args12(0).Name = "Copies"
args12(0).Value = 1
args12(1).Name = "Collate"
args12(1).Value = true
args12(2).Name = "Pages"
args12(2).Value = "1"
なお印刷そのものの次の行は当然ループの中です。
dispatcher.executeDispatch(document, ".uno:Print", "", 0, args12())
セルの値の取得は次のようにしました。
もしセルの値がストリングか数値か決まっていない場合は、場合分けするべきです。
現実に、Calcのセル内にストリングや数値を入力した場合、表示が異なります。
oSheet = ThisComponent.getSheets.getByName("Code")
CName = oSheet.getCellByPosition(16,CuCRow-1).String 'Q列
行の表示が 「CuCRow-1」となっているのは、VBAで「=Cells(CuCRow,17)」となっているのを
できるだけ忠実に(元のマクロが分かるように)するためです。
Cellに値(ストリング)を入れる場合
oSheet.getCellByPosition(iWeek + 1,Period * 3 + 2).String = RollS(iWeek, Period)
RollS(iWeek, Period)は二次元配列

数値の場合は次のようになります。
EdRow = oSheet.getCellByPosition(3, 8).Value 'D9
oSheet.getCellByPosition(3,4).Value = 1 'D5セル
Cellデータのクリア
oCellRange = oSheet.getCellRangeByPosition(2,5,7,25) 'C6:H26
oCellRange.clearContents(31) 'データクリア

特殊な目的でセル枠の印刷(PrintGrid)に挑戦しました。
現在の設定を取得してから、変更するように教えられました。
Dim Strst2 As String
Dim oDoc As Object
Dim oStyleFamilies As Object
Dim oPageStyles As Object
Dim oPageStyle As Object
oDoc = ThisComponent
oSheet = oDoc.getSheets().getByIndex( 0 )
Strst2 = oSheet.getPropertyValue( "PageStyle" )
oStyleFamilies = oDoc.getStyleFamilies()
oPageStyles = oStyleFamilies.getByName( "PageStyles" )
If oPageStyles.hasByName( Strst2 ) Then
oPageStyle = oPageStyles.getByName( Strst2 )
With oPageStyle
.PrintGrid = True
End With
End If
以下は印刷範囲の設定です。(B3:H29)
oSheet = ThisComponent.Sheets(0)
With aRange
.Sheet = 0
.StartColumn = 1
.StartRow = 2
.EndColumn = 7
.EndRow = 28
End With
oSheet.setPrintAreas(Array(aRange))

'dispatcher.executeDispatch(document, ".uno:PrintPreview", "", 0, args12())
dispatcher.executeDispatch(document, ".uno:Print", "", 0, args12())
なお印刷プレビューをループの中に入れるときは、
(あとで考えたら当然なのですが)一ループで2度実行(プレビュー設定と解除)する必要があります。
[でもプレビュー画面ではマクロのStopがきかない]それで
二つのプレビューの間にMsgBox を置きました。
以上
公開日記トップへ
oooug-jp SNS

●サイドメニュー

  • 公開日記
  • >公開日記はログインしなくても読めます

http://www.ospn.jp/

inetd