- ベストアンサー
OpenOffice表計算のマクロ(Basic)で選択中の結合セルからサイズを取得する方法について教えてください
事情によりOpenOfficeの表計算ソフト上で簡単なマクロを作らなければならなくなったのですが、私は満足なプログラミングの知識をもっていず、また身近に頼れる詳しい人もいずに困り果ててしまいました。 マクロの内容は選択中の結合されたセルのサイズ(幅と高さ)にあわせて、はみ出さない範囲で拡大した画像を挿入するというものです。 ネットで検索するなどして調べたOOoBasicマクロの情報を元につぎはぎして、理解できないなりになんとか選択範囲のサイズを取得してあわせて拡大/縮小する所まではいきました。しかし、結合されたセルを選択している場合には、結合されたセルの中の一番左上の単一セルのサイズを取得してしまい、結合されたセル全体のサイズがどうしても取得できないという問題が残ってしまいました。 詳しく書くと、 Dim oSelection As Object oSelection = ThisComponent.CurrentSelection Dim w_len As Long Dim h_len As Long w_len = oSelection.size.Width h_len = oSelection.size.Height としたいうようになっていて、A1からC3まで結合されたセルを選択してマクロを実行するとA1の単一セルのサイズがw_lenとh_lenに入ってしまいます。 MicrosfOfficeに比べてOOoは情報が少なく、またあったとしても分かっている人向けに書いてあることが多く、関係がありそうなものを探しては闇雲にテストしてエラーを返され続けることに疲れました。 なにか良い方法があれば教えてください。よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 私は、OOo は、未だ入門程度です。最近、OOo の質問が増えたことと、その質問を回答してみて、少し難があったので、レベルアップもあって、しばらく勉強してみました。ただ、当分、ここの板での継続した発言の予定はしておりません。 OOoBasicについては、多少の期待はあったのですが、情報も充実していませんし、OOoBasicを追いかけるには、VB系とは違いすぎます。違うといわれるVB.Net のほうがまだVBAに近いです。MS製のCOMさえ、標準で使えないようになっています。閲覧に、IEすら受付ない所もあるようです。 ご質問の件は、以下の掲示板でさがしてみました。Merged Cells 自体はあっても、その範囲自体を取る方法は出てきません。 検索場所: http://www.oooforum.org/forum/search.phtml キーワード例: Marged Cell 今回のような内容は出ていませんから、少なくとも、OOoBasic単独では出来ないのではないかと思っています。また、Novel のOOo やGo-oo のConverter を入れてどうかはチェックしていませんが、最初から、それに頼ったら技術的に見えてきませんので使っていません。MS系の場合は、日本も米国の掲示板も、VBAに関しては、面白いほど質問内容が変わりませんし、日本の掲示板は、ここのサイトでさえ、かなり良い線だと見えてきます。 StarSuite等のマニュアルのBasic 英文・和文を二日間掛けて読んでみました。その上で、こだわらなければ書籍の購入は必要ないように思います。もともと、営利目的ではないものですから、3分の2は英文ですが、PDFを集めれば十分のようです。しかし、開発ソリューションやDeveloper Versionですと、Java/C++を要求されますし、JavaScript さえも、非常に特殊な内容ですから、一般的なJSでは分かりません。 日本語のサイトでは、少なくとも、OOoBasic に関しては、私にとって、それほど読むべき内容が見当たらないように思いました。「StarSuite 開発者ガイド」を読む限りでは、Basic は、MS?に似せているだけで元が分からないと解決しないように思います。 以下のようなサンプルを考えてみました。 A1:C3 まで、連結させて、A1での結合のチェックは出てきますが、他のセルでは結合状態が出てきませんので、どこまで結合しているかは、マクロでは出せません。目視で、結合状態を求めるなら、マクロとしての意味はないと思います。 '------------------------------------------- Sub Test1 Rem Using 'IsMarged' Dim oCell As Object oCell =ThisComponent.getCurrentSelection 'Any CellPosition If oCell.IsMerged Then msgbox "Selected Cell is Marged" Else msgbox "Selected Cell is NOT Marged" End If End Sub '------------------------------------------- Sub Test2 Rem Each size is accumulated Dim sh As Object Dim oCell As Object Dim c As Object Dim i As Long, j As Long, y as Long, x As Long Dim w As Long, h As Long Dim s$ s ="A1:C3" 'Name of RangeArea w=0 h=0 sh = ThisComponent.CurrentController.ActiveSheet oCell = sh.getCellRangeByName(s) x =oCell.getRangeAddress.EndColumn y =oCell.getRangeAddress.EndRow For j = 0 to x c = sh.getCellByPosition(i,j) w = w + c.Columns.Width Next For i =0 to y c =sh.getCellByPosition(i,j) h = h + c.Rows.Height Next Print "w: "& w &"mm h: " & h &"mm" End Sub '------------------------------------------- (画面からコピペで取らない限りは、Tab入り) >はみ出さない範囲で拡大した画像を挿入するというものです。 MS Office VBAでも、画像をサイズをセルに合わせて挿入する方法は、少なくとも入門レベルではありません。そこまで書けるレベルなら、MS Office VBAにはほとんど困っていないはすです。それを移植実現させるのは大変です。どうやら、MS Office を向こうに回して、新たに構築していく必要がありそうです。だから、MS Office でしてきたことは、一旦忘れたほうが良いのかもしれませんね。 >従来のExcelVBAマクロとまったく同じ動きをするOOoBasicマクロをマクロを完成させることが一番助かることになります。 Novel 版は、いかがですか? 私個人としては、まだ、日数が浅いので、結論を出すのは早いかもしれませんが、OOoBasic に関する限りは、VBAの中級レベル以上の移植は、UNO/APIの利用以外は不可能ではないかと思っています。しかし、それに関わる時間と労力なら、他の言語を深めたほうが無駄が少ないように思います。 日本のOOoBasicサイトでは、ここの常連なら、誰でも書くCOMやオートメーションを利用したVBAのコードでも出てきません。どうやら、JavaやC++、または、UNOやAPI以外のOOoBasic に関する限りは、VBAとの共有点は少ないようです。 なお、あくまでも、VBA経験者としての発言ですから、当方の誤解や語彙に対する誤謬自体の指摘と訂正は構いませんが、ここの規約にあるように、単なる指摘発言はお断りします。
その他の回答 (2)
- new-OKWave
- ベストアンサー率68% (60/87)
#1です。 質問者さんが社会人との前提で少し厳しい事を記します。(小中学生ならば無視して下さい。) >・・・マクロを作る僕自身が直接その職場に関わることはなくトラブル時の保守や責任を考えると・・・ ⇒では誰がその仕事に対する責任を取るのですか? 質問者さんは会社の中では無く、自宅の自分のPCを用いてボランティアでされているのですか? 社会人ならば責任を取れない事柄に対しては請け負わずに断るべきです。少なくとも勘違いで請け負ってしまったとしても今からでも断るべきです。 >また、書籍を購入するのは金銭的に余裕がないこともあり、目的の情報が確実に載っていること確認できないと厳しいのが現状です。 ⇒パソコンを保持して、ネットまでされている方が\3,000程度の参考書を調べもせずに購入する気が無いというのは他力本願過ぎると思います。 以上の事から、ご自身の保身を最優先にされている様なのでCalcでは無く今後もExcelを使っていく事をお奨めします。 因みにCalcでも「結合したセル」のサイズ調査は少し頭を使えば出来ます。(添付図参照)
補足
#1さんへ たぶん#1さんがせっかく丁寧なご回答をして頂いたのに、僕がそれをすべて否定するような形になったことでお怒りになられているのではないかと思います。 その点については深く感謝とお詫びを申し上げます。 今後、教えて!gooを利用して質問する際は余計な状況説明を省き質問のポンとを明らかにするなどして、このようなことをがないよう気をつけたいと思います。 (ちなみに、仕事の考え方は様々ありますが保守が難しい場合、変更点・トラブル発生の可能性の最小を目指すのは方法としてあると僕は考えています。書籍の方は最寄の書店数店に立ち寄ってみましたがOpenOffice関連の本自体がほとんどない状態でした。僕のような関係ない人間のところにも話が来るくらいなので、もうちょっと置いていてもいいのになー、と思ったりします) #1さん、 重ねて、どうももうしわけありませんでした。
- new-OKWave
- ベストアンサー率68% (60/87)
>マクロの内容は選択中の結合されたセルのサイズ(幅と高さ)にあわせて、はみ出さない範囲で拡大した画像を挿入するというものです。 ⇒目的が良く理解出来ません。 当方が疑問に思うことは 1)何故、「セルの結合」を使わなくてはならないのか?CalcはExcelと違いcm単位で高さや幅が設定できますので便利です。 2)画像データのサイズは一定なのか? 3)そもそも何故Calcで画像データの管理をするのか? DataBaseソフトを使う方が楽と思います。 1)に関して別にセル自体の大きさを変えれば済む話だと思います。またその方が簡単だと思います。 2)に関しては画像データサイズがどの程度なのかが分かりません。画像サイズを均一にする事は難しい事ではありません。(Calcには複数の不特定サイズを均一にする拡張機能もあります。) >詳しく書くと、・・・ ⇒記されたコードを見るとExcel VBAのコードの様ですね。(まあ、OOo Basicも対して変わりはありませんが。) >A1からC3まで結合されたセルを選択してマクロを実行するとA1の単一セルのサイズがw_lenとh_lenに入ってしまいます。 ⇒何故「セルの結合」を行い、結合後のサイズが必要なのですか? 別に、1列目~3列目のセルの高さとA列~C列の幅を足せば済むのでは? >MicrosfOfficeに比べてOOoは情報が少なく、またあったとしても分かっている人向けに書いてあることが多く、・・・ ⇒確かにVBAに比べると少ないですが皆無ではありません。 初心者向けには以下の書籍が出版されています。 1)書名:「OpenOffice.org3」、出版社:翔泳社 2)書名:「OpenOffice.orgマクロプログラミング」、出版社:工学社 因みに下記サイトのマクロが参考になると思いますので確認して下さい。 URL : http://openoffice3.web.fc2.com/index.html [参考1] 「2.サンプルマクロ」⇒「実用マクロ100連発(OOoのかけら)画面へ」⇒「15)[Calc]選択範囲の最初と最後の行と列番号を取得」 [参考2] 「2.サンプルマクロ」⇒「実用マクロ100連発(OOoのかけら)画面へ」⇒「71)[Calc]セルの高さと幅を取得する。」
補足
new-OKWaveさん、ご回答をよせていただきありがとうございます。 >1)2)3) >何故「セルの結合」を行い、結合後のサイズが必要なのですか?別に、1列目~3列目のセルの高さとA列~C列の幅を足せば済むのでは? 事情をお話しますと、知人の職場で毎日の報告書作成に使われるエクセルの作業省力化のためのマクロと同等の機能(特定の結合セルで作った枠内にダイアログで指定した画像を自動でリサイズして張り付ける)を持たせるように依頼されました。ちなみに、その最初のエクセルVBAマクロを作った人とはもう連絡を取れないそうです。 セルを結合している理由はその報告書の罫線など書式のためで、その枠の大きさは数種類あるみたいです。画像データはデジカメの写真そのままの場合や一部トリミング加工をしたものを貼り付けることもあるそうです。報告書作成作業のちょとした省力化のためのマクロなので、データベースを使うというのは、よく分からないいですがおそらく大掛かりすぎるのではないかと思います。 上記のような事情でマクロを作る僕自身が直接その職場に関わることはなくトラブル時の保守や責任を考えると、結局タイトルどおり結合セルからサイズを取得する方法を知り、従来のExcelVBAマクロとまったく同じ動きをするOOoBasicマクロをマクロを完成させることが一番助かることになります。 >⇒記されたコードを見るとExcel VBAのコードの様ですね。(まあ、OOo Basicも対して変わりはありませんが。) 以前別の所でちょっとしたExcelVBAマクロを書いた経験があったので 基本的に書き写すだけだなと今回の頼まれごとも気軽に引き受けたのですが、思ったよりもOOoBasicマクロの勝手が違って失敗したなーと後悔しています。^^; とくにExcelとCalcで結合セルを選択したときに選択範囲が異なること(Calcは結合されたセル中の一番左上のセルのみが選択される仕様らしいです)には困りました。 教えていただいたサイトの情報からは結合セル範囲を知る方法は見つかりませんでした。また、書籍を購入するのは金銭的に余裕がないこともあり、目的の情報が確実に載っていること確認できないと厳しいのが現状です。
お礼
Wendy02さん、こんにちは。 長文にわたってご回答していただきありがとうございます。 >Novel 版は、いかがですか? MicrosoftOfficeとの互換性を高めた、そのようなエディションがあるのですね。知りませんでした、参考になります。 >OOoBasic に関する限りは、VBAの中級レベル以上の移植は、~~それに関わる時間と労力なら、他の言語を深めたほうが無駄が少ないように思います。 そうですねー。僕も今回初めて関わってみて、VBAと比べてなんかこういちいちわかり難いというか、標準で搭載されている記録マクロもコードに使えないよく分からないもので・・・(探してみて再利用に向いた記録マクロが見つかりましたが) とにかく、プログラミングの素人が気軽に手を出せるものではないというのは痛いくらいに思い知りました。 それで、大変申し上げにくいのですが先ほど問題となる「選択中の結合セルからサイズを取得する方法」が自己解決いたしました。 セルカーソルというものを使うことでOOoBasicで実現できるようです。 (自分でもほとんど理解せずトライ&エラーでとりあえず動作したというような状況で、これが良いやり方なのかはわかりませんが) '------------------------------------------- Sub mergedArea_Size Dim oSheet As Object Dim oCursor As Object Dim oSelection As Object oSheet =ThisComponent.CurrentController.ActiveSheet oSelection = ThisComponent.CurrentSelection oCursor = oSheet.createCursorByRange( oSelection ) oCursor.collapseToMergedArea() Dim w_len As Long Dim h_len As Long w_len = oCursor.Size.Width h_len = oCursor.Size.Height MsgBox "Width:" & w_len & " Height:" & h_len End Sub '------------------------------------------- ご回答していただいた、#1さん、Wendy02さん、ほんとうにありがとうございました。