• ベストアンサー

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は情報が少なく、またあったとしても分かっている人向けに書いてあることが多く、関係がありそうなものを探しては闇雲にテストしてエラーを返され続けることに疲れました。 なにか良い方法があれば教えてください。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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経験者としての発言ですから、当方の誤解や語彙に対する誤謬自体の指摘と訂正は構いませんが、ここの規約にあるように、単なる指摘発言はお断りします。

taka6327
質問者

お礼

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さん、ほんとうにありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

#1です。 質問者さんが社会人との前提で少し厳しい事を記します。(小中学生ならば無視して下さい。) >・・・マクロを作る僕自身が直接その職場に関わることはなくトラブル時の保守や責任を考えると・・・ ⇒では誰がその仕事に対する責任を取るのですか? 質問者さんは会社の中では無く、自宅の自分のPCを用いてボランティアでされているのですか? 社会人ならば責任を取れない事柄に対しては請け負わずに断るべきです。少なくとも勘違いで請け負ってしまったとしても今からでも断るべきです。 >また、書籍を購入するのは金銭的に余裕がないこともあり、目的の情報が確実に載っていること確認できないと厳しいのが現状です。 ⇒パソコンを保持して、ネットまでされている方が\3,000程度の参考書を調べもせずに購入する気が無いというのは他力本願過ぎると思います。 以上の事から、ご自身の保身を最優先にされている様なのでCalcでは無く今後もExcelを使っていく事をお奨めします。 因みにCalcでも「結合したセル」のサイズ調査は少し頭を使えば出来ます。(添付図参照)

taka6327
質問者

補足

#1さんへ たぶん#1さんがせっかく丁寧なご回答をして頂いたのに、僕がそれをすべて否定するような形になったことでお怒りになられているのではないかと思います。 その点については深く感謝とお詫びを申し上げます。 今後、教えて!gooを利用して質問する際は余計な状況説明を省き質問のポンとを明らかにするなどして、このようなことをがないよう気をつけたいと思います。 (ちなみに、仕事の考え方は様々ありますが保守が難しい場合、変更点・トラブル発生の可能性の最小を目指すのは方法としてあると僕は考えています。書籍の方は最寄の書店数店に立ち寄ってみましたがOpenOffice関連の本自体がほとんどない状態でした。僕のような関係ない人間のところにも話が来るくらいなので、もうちょっと置いていてもいいのになー、と思ったりします) #1さん、 重ねて、どうももうしわけありませんでした。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

>マクロの内容は選択中の結合されたセルのサイズ(幅と高さ)にあわせて、はみ出さない範囲で拡大した画像を挿入するというものです。 ⇒目的が良く理解出来ません。 当方が疑問に思うことは 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]セルの高さと幅を取得する。」

taka6327
質問者

補足

new-OKWaveさん、ご回答をよせていただきありがとうございます。 >1)2)3) >何故「セルの結合」を行い、結合後のサイズが必要なのですか?別に、1列目~3列目のセルの高さとA列~C列の幅を足せば済むのでは?  事情をお話しますと、知人の職場で毎日の報告書作成に使われるエクセルの作業省力化のためのマクロと同等の機能(特定の結合セルで作った枠内にダイアログで指定した画像を自動でリサイズして張り付ける)を持たせるように依頼されました。ちなみに、その最初のエクセルVBAマクロを作った人とはもう連絡を取れないそうです。  セルを結合している理由はその報告書の罫線など書式のためで、その枠の大きさは数種類あるみたいです。画像データはデジカメの写真そのままの場合や一部トリミング加工をしたものを貼り付けることもあるそうです。報告書作成作業のちょとした省力化のためのマクロなので、データベースを使うというのは、よく分からないいですがおそらく大掛かりすぎるのではないかと思います。  上記のような事情でマクロを作る僕自身が直接その職場に関わることはなくトラブル時の保守や責任を考えると、結局タイトルどおり結合セルからサイズを取得する方法を知り、従来のExcelVBAマクロとまったく同じ動きをするOOoBasicマクロをマクロを完成させることが一番助かることになります。 >⇒記されたコードを見るとExcel VBAのコードの様ですね。(まあ、OOo Basicも対して変わりはありませんが。)  以前別の所でちょっとしたExcelVBAマクロを書いた経験があったので 基本的に書き写すだけだなと今回の頼まれごとも気軽に引き受けたのですが、思ったよりもOOoBasicマクロの勝手が違って失敗したなーと後悔しています。^^;  とくにExcelとCalcで結合セルを選択したときに選択範囲が異なること(Calcは結合されたセル中の一番左上のセルのみが選択される仕様らしいです)には困りました。  教えていただいたサイトの情報からは結合セル範囲を知る方法は見つかりませんでした。また、書籍を購入するのは金銭的に余裕がないこともあり、目的の情報が確実に載っていること確認できないと厳しいのが現状です。  

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 選択範囲のセルを1行ずつ結合するマクロ

    こんにちは、いつも参考にさせていただいております。 セルを範囲選択し、 1行ごとに結合させる方法はないでしょうか。 手作業ではなくマクロでの方法を探しています。 イメージとしては (1)範囲選択する (2)マクロ実行する  →列の範囲を1行ずつ、選択している範囲だけ各行を結合 図も添付いたしますので、どうかアドバイス・ヒント頂けないでしょうか。 よろしくお願いいたします。

  • 結合セルの値取得について

    お世話になります、 (環境、VISTA&EXCEL2000) 結合セルに名前をつけて その値をマクロで取得したいのですが エラーになります。 結合セルには結合する前に名前をつけてから 結合してあります。 Dim ws As Worksheet ' On Error GoTo errTrap Set ws = Worksheets("xxxxx") '(1) ws.Range("DenDate").Value = Date '(2) MsgBox ws.Range("DenDate").Value (2)で「型が一致しません」になります。 宜しくお願いいたします。

  • セル結合をマクロで行ないたい(その2)

    度々お世話になっております。 エクセル2000ですが、例えばA1:C10の範囲を選択した状態で、一発で横方向のみのセル結合をする(A1,B1,C1を結合、A2,B2,C2を結合、・・・A10,B10,C10を結合)マクロは可能でしょうか?

  • Excel(セルの結合マクロ)

    いつもお世話になっております。 Excelのマクロで、選択範囲の中で、下のセルが空白のものは、上のセルと結合されるマクロを作りたいと考えています。 (例1:A1セルに”TEST”が入力されており、A2,A3セルが空白として、A1:A3を選択し、マクロを実行するとA1からA3がセル結合される  例2:A1に”TEST2”B2に"TEST3"が入力されており、A1:B3を選択すると、A1からA3が結合され、B2とB3も結合される) 説明が下手で申し訳ないのですが、お力を貸していただけませんでしょうか? よろしくお願いいたします。

  • 【Excelマクロ】 セルの色取得

    古いファイルを加工することが多々あり、セルに塗られている色を調べる(セルの書式設定→塗りつぶし→その他の色→ユーザー設定)のが非常に面倒です。 RGB値をマクロで表示させる方法を見つけたものの、セルが指定(A1/A2/B1)されています。 <1つ右> Sub 色情報取得() Dim r As Long Dim g As Long Dim b As Long n = Range("A1").Interior.Color r = n \ 256 ^ 0 Mod 256 g = n \ 256 ^ 1 Mod 256 b = n \ 256 ^ 2 Mod 256 Range("A2") = r & "," & g & "," & b End Sub <1つ左> Sub 色情報取得() Dim r As Long Dim g As Long Dim b As Long n = Range("A1").Interior.Color r = n \ 256 ^ 0 Mod 256 g = n \ 256 ^ 1 Mod 256 b = n \ 256 ^ 2 Mod 256 Range("B1") = r & "," & g & "," & b End Sub 調べたいセルにカーソルを置いた状態で実行するマクロをご教示ください。 希望1.画像のように1つ右 or 1つ左、もしくはn個右 or n個下など、表示させたいセルを自由に設定したい 希望2.複数セルを一括で処理したい よろしくお願い致します。

  • セル解除後、各行に値をコピーし結合するマクロ

    A1からC3のセルが結合しており、 そのセル結合を解除すると、A列のみ値がコピーされる。 コピーした後、各行ごとにセルを結合していく…… という処理をしたいと思い、 調べて下記のマクロまでなんとかこぎつけました。 Sub セル結合() Dim date1 As Variant Dim range1 As Range Application.DisplayAlerts = False For Each range1 In Selection.Rows If range1(1).MergeCells = False Then range1(1).Merge Else date1 = Selection.Rows(1).Value With range1 .UnMerge .WrapText = False .ShrinkToFit = False Selection.Value = date1 End With End If Next range1 End Sub ※実行範囲に関しては、  任意選択をした範囲にしたいため、  range(1)にて処理を行いました。 困っているのは、上記のマクロを実行すると、 最初の行のみ結合できないということ。 もうひとつが、 セル結合をしない時に値を左端にコピーすると、 文字が自動縮小されてしまいます。 縮小しないようにするには、 どのような処理を入れたら良いでしょうか? お力添え頂けますと幸いです。 よろしくおねがいします。

  • 選択したセルの座標の取得

    選択したセルの座標の取得 sheet1    A B C   1   2  α     3     sheet1のB2にはαという文字が挿入されており、ハイパーリンクの設定がしてあります。 B2をクリックするとsheet2に移行します。 sheet1で選択したセルの位置を取得したいのですが、上手くいきません。 ご教授の程、宜しくお願いします。  現在の記述は以下の通りです。  Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)  Dim gyo As Long  Dim ret As Long  gyo = ActiveCell.Row  ret = ActiveCell.Column  MsgBox "行番号" & gyo & "列番号" & ret  End Sub Sheet1のB2を選択して、Sheet2に移行した時に、Msgboxには、 行番号2 列番号2 というようにしたいのです。

  • 「Wordの表のセルの結合情報」をVBAで取得する

    「Wordの表のセルの結合情報」をVBAで取得する方法 EXCELのVBAであれば、下記サイトの下記マクロで判断できるようなのですが、 Word VBAには、「MergeCellsプロパティ」が無くて、駄目でした。 別の方法で判定出来ない物でしょうか? http://officetanaka.net/excel/vba/tips/tips50.htm ---------------------------------------------------------------------- Sub Sample2() Dim i As Long, buf As String For i = 2 To 9 If Cells(i, 1).MergeCells Then buf = buf & Cells(i, 1).Address(0, 0) & "-->結合されています" & vbCrLf Else buf = buf & Cells(i, 1).Address(0, 0) & "-->結合されていません" & vbCrLf End If Next i MsgBox buf End Sub ヘルプを調べましたが、ざっと見たところ載っていないように思います。 経験あるかた居たらご教授頂けると助かります。

  • マクロ 結合セルへ値のみ貼り付けるにはどうしたらよいでしょうか。

    マクロは初心者で、まだまだ勉強しているところです。 シート名「入出金履歴」のデータを顧客コードごとに分かれている別シートへデータを振り分けて貼り付ける、もしくは反映させたいのですが、貼り付け先のセルがシートの都合上、結合セルになっており、下記のマクロだと当然ながらエラーになってしまいます。結合セルをまず、解除してから貼り付けようと思ったのですが、うまくいかず、困っています。 コピー先の結合状態は、7行目から、列A:C、列D:E、列F:H と、3列になるように結合されています。結合されている行の終わりは、A:C(結合されている)列に「合計」の値が入っているセルの行、H列まで、3列になるよう結合されています。 解除する以外に、良い方法があれば是非教えていただきたいです。 よろしくお願いします。 Sub samplea() r1 = ActiveCell.Row r2 = r1 + Selection.Rows.Count - 1 Dim myRange As Range Dim s_no As String For i = r1 To r2 s_no = Cells(i, 2) Range(Cells(i, 4), Cells(i, 9)).Select Selection.Copy Sheets(Format(s_no)).Select Set myRange = Columns("a:c").Find(what:="合計") If myRange Is Nothing Then Debug.Print "Not Fount" Else myRange.Select Selection.End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlValues Application.CutCopyMode = False Sheets("入出金履歴").Select End If Next End Sub

  • エクセル マクロ セルを縦に結合したいです。

    現在、Visual Basicにてコードを作成中です。(初心者です。) 現時点での出来ること 5列目の2~10行目に何か入力されれば その隣のセルに「お疲れ様です」と入力される(ここまではコード出来てます。) 例:B5セルに何か入力があればC5セルに「お疲れ様です」と入力される。   C5セルに何か入力あればD5セルに「お疲れ様です」と入力される・・・ といった内容です。 そのあとやりたい事(ここからコード出来ません) B5セルに何か入力があればC5セルに「お疲れ様です」と入力された後 C5~10行目を縦に結合し、文字を縦書きにする。 C5セルに何か入力があればD5セルに「お疲れ様です」と入力された後 D5~10行目を縦に結合し、文字を縦書きにする・・・ といった内容です。 一応コード下記に載せます。 Sub macro1() Dim a As Variant Dim i As Long Set a = Worksheets("sheet1") For i = 10 To 2 Step -1 If Len(a.Cells(5, i).Value) > 0 Then 'もし、5列目の2~10行目に何か入力されれば a.Cells(5, i).Offset(0, 1).Value = "お疲れ様です" Exit For End If Next i End Sub すいませんがコード記載よろしくお願いいたします。 回答よろしくお願いします。

専門家に質問してみよう