* 別シートへの転記を行うマクロについて [#y5b3e25f]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|川崎|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(普通,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Calc 表計算,faq03,category)|
 |~投稿日|2008-05-29 19:57:59 (木)|
 |~OS|win XP|
 |~依存するページ||
 |~バージョン|#listbox3(2.4,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#qfa17a7e]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 表1にフォームと、そのフォーム横にフォームから入力されたデータが入ります。~
 表1のフォームの「確定」ボタンをクリックすることで、表2には表1の入力データが転記~
 されていくようにしたいです。~
 ~
 「確定」ボタンにマクロを当てるまではわかるのですが、肝心のそのマクロが・・・~
 http://www.eurus.dti.ne.jp/~yoneyama/Excel/form.html~
 まさにこのページに載っていることがしたいのですが、記載されているEXCELのVBAは使~
 えないようで、その上自力でOOoのマクロを書けない初心者なもので手も足も出ません。~
 ~
 どうかよろしくお願いいたします。
 
 ----
 ***Calcでないといけませんか [#m9ac1b06]
 >M.Kamataki (2008-05-29 22:42:30 (木))~
 ~
 Baseならマクロを書かなくてもできます。~
 ~
 もちろんCalcで回答できる方、お願いします。~
 
 //
 ***そうですね [#z0e8508d]
 >川崎 (2008-05-30 11:41:09 (金))~
 ~
 最初はBaseで作ろうかと思い動いてました。~
 しかし自分も含め何人かがエクセルを使い慣れていることで移行するにあたり抵抗が少なく、またグループ内でこれから使ってもらう人達がPC自体になれていないので操作を教育する際、自分がなれた表計算アプリであればなんとか対応ができそうなので、それらを考えるとcalcが良いかなと。~
 あと、Baseのフォーム作成がCalcでないこともBaseに踏み切れない理由でしょうか。~
 
 //
 ***データの転記部分 [#k9b32981]
 >ike@九州 (2008-05-30 13:28:18 (金))~
 ~
 >Baseのフォーム作成がCalcでないこともBaseに踏み切れない理由~
 ~
 レポート作成含め私も上記の理由が一番多いのではないかと思います。表計算はGUIカスタマイズに優れてますからね…~
 ~
 以下転記部分の例~
  Sub test
  oDoc = ThisComponent
  oSheet1 = oDoc.getSheets().getByName("表1")
  oSheet2 = oDoc.getSheets().getByName("表2")
  
  '表2の書き込む最下行をA1から下へ判断し取得
  oTargetCell = oSheet2.getCellRangebyName("A1")
  If oTargetCell.string = "" then
  iLastrow =oTargetCell.getRangeAddress.EndRow
  Else 
  oCursor = oSheet2.createCursorByRange(oTargetCell) 
  oCursor.gotoEnd
  iLastrow = oCursor.getRangeAddress.EndRow + 1
  End if
  
  '表1のA1の内容を表2のA列へ追加
  oRange = oSheet2.getCellByPosition(0,iLastRow)
  oRange.setDataArray(oSheet1.getCellRangebyName("A1").getDataArray())
  	
  '表1のA2の内容を表2のB列へ追加
  oRange = oSheet2.getCellByPosition(1,iLastRow)
  oRange.setDataArray(oSheet1.getCellRangebyName("A2").getDataArray())
  End sub
 ~
 setDataArray を使うと数式以外のデータは型を意識する事なく転記できます。但し元と先のセル範囲(数)は同じでなければなりません~
 ~
 表1のデータ元配置を工夫すれば一度で転記できます~
  '表1のA1:E1の内容を表2のA:E列へ追加
  oRange = oSheet2.getCellRangeByPosition(0,iLastRow,4,iLastRow)
  oRange.setDataArray(oSheet1.getCellRangebyName("A1:E1").getDataArray())
 
 //
 ***まずは最初の一歩から [#v9e51cba]
 >ponkan (2008-05-30 15:34:48 (金))~
 ~
 行いたい作業を手作業でやって見ます。~
 完全に思い通りの結果が得られるような手順が出来たら~
 ツール→マクロ→マクロの記録を押して、上記手順を実行します。~
 後は、記録の終了を押して保存します。~
 ~
 例えば、下記は表1の範囲A1:F16を表2のA1からにコピーする動作を記録したものです。~
 マウスで表1のA1:F16をドラッグして選択し、ctrl+cでコピーし~
 表2のA1をクリックして選択しctrl+vで貼付、記録終了して保存したものです。~
 ~
  REM  *****  BASIC  *****
  sub Main
  rem ----------------------------------------------------------------------
  rem define variables
  dim document   as object
  dim dispatcher as object
  rem ----------------------------------------------------------------------
  rem get access to the document
  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  rem ----------------------------------------------------------------------
  dim args1(0) as new com.sun.star.beans.PropertyValue
  args1(0).Name = "ToPoint"
  args1(0).Value = "$A$1:$F$16"
  dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
  rem ----------------------------------------------------------------------
  dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
  rem ----------------------------------------------------------------------
  dim args3(0) as new com.sun.star.beans.PropertyValue
  args3(0).Name = "Nr"
  args3(0).Value = 2
  dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args3())
  rem ----------------------------------------------------------------------
  dim args4(0) as new com.sun.star.beans.PropertyValue
  args4(0).Name = "ToPoint"
  args4(0).Value = "$A$1"
  dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())
  rem ----------------------------------------------------------------------
  dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
  end sub
 ~
 だらだらと意味不明な文字が長いですが、深く気にする事は無いと思います。~
 勝手に記録してくれて正しく動作するのですから・・・~
 中には記録してくれない動作も有りますが、そこが分岐点でしょうか~
 ~
 因みにbasicのwikiに多くのサンプルも有ると思いますが、見られましたか?~
 関連サイトの中の、OOoBasic wikiです。~
 
 //
 ***やってみました! [#pbca53f3]
 >川崎 (2008-05-30 21:36:21 (金))~
 ~
 >ike@九州さん~
 ご回答ありがとうございます。~
 転記先の表内に転記しようと思ったのですが、罫線があったため表の下に転記されてしまいました。罫線を消して塗りつぶしに変えてみても結果は同じでした。~
 つまり、セルの中は空でも書式が設定されていてると空白と認識されないということでしょうか?~
 転記先の罫線がすでにあり(転記先は印刷用フォーマットなので)A10:G20の表内への転記、また「元A1→先B2」のように一対一の転記などセルの指定などはどのようにしたらよろしいでしょうか。~
 ~
 >ponkanさん~
 意外とコピペのような単純な作業でもマクロの記録はかなり長い命令になっているのですね。驚きました!~
 ~
 ~
 早速教えていただいたマクロを表1の選択範囲や表の名前、マクロの記録で得たプログラムを加えたり、自分の作っているものに当てはめながら試行錯誤して、まったく理解できなかったものが色々いじってみて初めて本当に少しですがわかった気がします。~
 
 //
 ***ようこそ、月の砂漠へ [#s27623c6]
 >ponkan (2008-05-30 23:07:03 (金))~
 ~
 いや、別に深い意味はありませんが・・・~
 ようこそ~
 
 //
 ***次の世界への始まりですね(ジレンマ付) [#xe6fb058]
 >ike@九州 (2008-05-31 09:46:02 (土))~
 ~
 gotoEndOfUsedArea はフォント以外の書式もデータとして判断するとなってました。ゴメンナサイです~
 ~
 カーソルをA1に持って行きCtrl+↓のような動作に修正しました。~
 当然これはデータを順次最下行に追加していく場合で、途中空白がない列を指定しないと正しく最下行を判断できません。~
 ~
 転記先が動的に変化しない1対1の場合は~
  oRange = oSheet2.getCellRangebyName("B2")
  oRange.setDataArray(oSheet1.getCellRangebyName("A1").getDataArray())
 転記先が動的に変化する1対1の場合(変数を使用)~
  oRange = oSheet2.getCellbyPosition(先列番号の変数、先行番号の変数)
  oRange.setDataArray(oSheet1.getCellRangebyName("A1").getDataArray())
 セル範囲A10:G20の場合~
  getCellRangebyPosition(0,9,6,19)
  getCellRangebyName("A10:G20")
 を使います~
 
 //
 ***誤解だけは解いておきたい [#ld8634f6]
 >M.Kamataki (2008-06-03 23:46:02 (火))~
 ~
 >Baseのフォーム作成がCalcでないこともBaseに踏み切れない理由~
 ~
 実はCalcでもフォームを作成できます。Calcフォーム+Baseの連携は手元では実現できています。まだ、オプションボタンとかリストボックスは設置していませんが。~
 
 //
 ***完全に誤解してました [#c1a8ecff]
 >ike@九州 (2008-06-04 15:40:58 (水))~
 ~
 以前リストボックス配置でトライしたのですが、これでは思う事ができず断念した経緯がありました。~
 そしてBasicを使いモードレスダイアログ上でBaseからCalcへ任意に転記などコントロールするものを今作成してる途中でした。orz~
 ~
 コンボボックスで配置するのですね、ウィザードも備わっていてスムーズに内容設定できました。(ラベルは別途手動作成必要)~
 ~
 データベースへの追加書き込み、Baseウィザードで作成したWriterフォームにはないドロップダウンによる絞込み検索等簡単に出来るのを知りました。~
 日付の絞り込みも >=04/1/1 and <= 04/1/2 と入力すると自動で変換されました~
 Baseウィザード作成したWriterフォームより扱いやすいというのが印象です。~
 #ref(calc_form.png)~
 ~
 絞込み結果のCalcへの取り込みが1通りしか無いのが不便ですが、特定のシートへ取り込みその後請求書等へと自動で転記させればよい事ですし~
 …~
 目から大きな鱗が落ちました~
 追記~
 Baseからフォームウィザードを使わないでデザイン表示でWriterフォーム作成するとコンボボックス等任意のコントロールを配置する事ができました。但し具体的な設置設定応用例が少ないので、私のようなBase初心者にはかなり時間を要しました。~
 今後自身も含めて、良い例がありましたら別ページにてご紹介して頂ければとおもいます~
 
 //
 ***ありがとうございました [#v83bff93]
 >川崎 (2008-06-09 14:23:33 (月))~
 ~
 なんとか転記を含むフォームができました。~
 皆さんご協力ありがとうございました。~
 ~
 Baseとの連携、機会があれば自分も勉強してみたいと思います。~
 でもなぜBaseからのフォーム作成がWriter固定なんでしょうか・・・~
 ~
 遅くなりましたが、これで完了とさせていただきます。~
 
 //
 ***Re: 完全に誤解してました [#w574c768]
 >M.Kamataki (2008-06-11 17:42:58 (水))~
 ~
 >今後自身も含めて、良い例がありましたら別ページにてご紹介して頂ければとおもいます~
 ~
 過去、コントロールのリファレンスを作成したことがあります。セミナーで利用したものなので網羅的になっています。もし、まだ未入手でしたらご利用ください。以下のページの「グラス片手にフォーム設計」の下のPDFです。~
 ~
 http://openoffice-docj.sourceforge.jp/wiki/Documentation/Base_Seminar~
 ~
 また、ドキュメントプロジェクトのサイトではBaseに関するドキュメントの作成も予定しています。~
 
 //
 #article