シートをPDF出力する際の名前を、そのシートのとあるセルから持っていきたいのですが、どうするべきなのでしょうか?
私が調べた限りでは「PDFとして出力する&名前をセルから引用する」というマクロを作るのがいいのか?と思ったのですが…
ちなみに引用したいセルは2つあります。
例)「Sheet1.A3 - Sheet1.G3」
Sheet1.A3はタイトル名、Sheet1.G3はTODAY関数の書式を全般にしたモノです。
シートをPDF出力する際の名前を、そのシートのとあるセルから持っていきたいのですが、どうするべきなのでしょうか?
私が調べた限りでは「PDFとして出力する&名前をセルから引用する」というマクロを作るのがいいのか?と思ったのですが…
ちなみに引用したいセルは2つあります。
例)「Sheet1.A3 - Sheet1.G3」
Sheet1.A3はタイトル名、Sheet1.G3はTODAY関数の書式を全般にしたモノです。
私自身はマクロを使わない人なのでマクロのコーディングについてはよくわからないままでの回答なのですが、ご提示のアプローチは自然な考え方のひとつに思えます。その方法で何か問題がありそうなのでしょうか?
ニーズにも依るでしょうが、自分ならマクロに手を出すのが面倒なので(そして出来ればマクロはなるべく使いたくないので)、「Sheet1.A3 - Sheet1.G3」が表示される数式を記述したセルを設けてPDF出力時にその値をコピー&ペーストすることで済ませると思いますが。
ご回答ありがとうございます。
私もマクロ初心者なので使わずに済めばいいのですが、使ったほうがはるかに楽なのです…
「PDF出力する」、「その名前を2つのシートのセルから引用する」というマクロをご教授いただければ、と思っておりました。
LibreOfficeで作ったシートをOffice Exelで運用したいので1から勉強したほうが今後のためですかね…
ちなみに見積書を作る予定です。
開いている Calc からマクロでPDFを作るなら、LibreOffice 公式ガイドにPDFファイルを出力するサンプルコードがあります。
Basic マクロ
https://wiki.documentfoundation.org/Macros/General/006
Python マクロ
https://wiki.documentfoundation.org/Macros/Python_Guide/Documents#Export_to_PDF
日本語サイト
とりあえずエクスポートするコードまで。セルの値を持ってくるコードは後で回答に追記します。
REM BASIC系の文法に自信がないわけでないなら、
REM https://api.libreoffice.org/docs/idl/ref/index.html
REM あたりを見てたほうが勉強になる…と思ったが、PDFFilterは直接は載ってないんだな
Option Explicit
Sub Main()
REM Use Extended typeが有効じゃないとエラーになる。そのときは変数の型はObjectで。
Dim filter As com.sun.star.document.XFilter
Dim properties(0) As com.sun.star.beans.PropertyValue
filter = createUnoService("com.sun.star.document.PDFFilter")
REM ファイル内にマクロを格納する前提のコード
filter.setSourceDocument(ThisComponent)
properties(0).Name = "OutputStream"
REM Cドライブ直下ってエラーになるのね…
properties(0).Value = createUnoService("com.sun.star.ucb.SimpleFileAccess").openFileWrite("C:\test\himajin100000test.pdf")
REM 指定しなかった値は初期値
REM https://opengrok.libreoffice.org/xref/core/filter/source/pdf/pdffilter.cxx?r=042033f1#77
filter.filter(properties)
End Sub
ある程度厳格なものを目指したので最短ではない。
REM ***** BASIC *****
Option Explicit
Sub Main()
REM ThisComponentはXModelだということが確定しているだけなので念の為。Use Extended typesを有効にしていない場合無意味なコード。
Dim doc As com.sun.star.sheet.XSpreadsheetDocument
doc = ThisComponent
REM Generics? ねぇよ、んなもん。
REM 多分com.sun.star.sheet.Spreadsheetサービスだと思われる(ドキュメントから直接は解らないのがツライ)
REM com.sun.star.sheet.Spreadsheetはcom.sun.star.table.XCellRangeを実装している。
Dim cellrange As com.sun.star.table.XCellRange
cellrange = doc.getSheets().getByIndex(0)
REM A2セル
REM ここもやっぱり「多分」でしかいえないが、戻り値はcom.sun.star.table.Cellサービス
Dim xText As com.sun.star.text.XTextRange
xText = cellrange.getCellByPosition(0,1)
REM 他言語の人はcom.sun.star.awt.XMessageBoxFactoryで頑張る
Msgbox(xText.getString())
End Sub
完全に余談ですが、他言語ともうちょっと共通したコードを書きたいなぁ、という人には、CreateUnoSerivce関数の代わりに
REM ***** BASIC *****
Option Explicit
Sub Main()
Dim defaultcontext As com.sun.star.uno.XComponentContext
Dim servicemanager As com.sun.star.lang.XMultiServiceFactory
Dim simplefileaccess As com.sun.star.ucb.XSimpleFileAccess3
defaultcontext = GetDefaultContext()
servicemanager = defaultcontext.getServiceManager()
simplefileaccess = servicemanager.createInstance("com.sun.star.ucb.SimpleFileAccess")
End Sub
というコードをプレゼントすることになります。妥協しましたが。
まだちゃんとは読んでいませんが、「選択したシートだけ」の類はこの辺が関わっていそうです。
https://opengrok.libreoffice.org/xref/core/filter/source/pdf/impdialog.cxx?r=0771ac00#461
選択範囲のみエクスポート、について思った通りの挙動をしていないので後で検証予定。
シートの範囲をPDFファイルとして出力する際のPDFファイル名に2つのセルの値を連結した値をセットするには?
という形でのマクロになります。
・範囲指定してPDF出力
・セルの値をファイル名として保存
という作業を連結してみました。
Sub storeCellRangeToPDF()
oDoc = ThisComponent
oController = oDoc.getCurrentController()
oSheet = oController.getActiveSheet()
oCellRange = oSheet.getCellRangeByName("$A$1:$B$10") '出力するセル範囲
Dim aFilterData(0) as new com.sun.star.beans.PropertyValue
aFilterData(0).Name = "Selection"
aFilterData(0).Value = oCellRange
Dim aMediaDescriptor(1) as new com.sun.star.beans.PropertyValue
aMediaDescriptor(0).Name = "FilterName"
aMediaDescriptor(0).Value = "calc_pdf_Export"
aMediaDescriptor(1).Name = "FilterData"
aMediaDescriptor(1).Value = aFilterData()
Dim PDFName as String
oSheet = ThisComponent.CurrentController.ActiveSheet
PDFName = oSheet.getCellRangeByName("J1").string '出力するPDFファイル名をJ1セルとH3セルから取得
PDFName = PDFName & oSheet.getCellRangeByName("H3").string & ".PDF" '拡張子が必要な場合は付与します
'"file:///以下にファイルパスとファイル名を記述します
'EドライブのDATAフォルダに保存する例
Dim Filepath as String
Filepath = "file:///E:/DATA/" & PDFName
oDoc.storeToURL(Filepath , aMediaDescriptor())
End Sub