* Calcをフォームにした時、シート間のナビゲーション共通化 [#gcdccb2a]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|あまの|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(普通,faq03,priority)|
 |~状態|#listbox3(回答中,faq03,state)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Base データベース,faq03,category)|
 |~投稿日|2011-05-26 22:14:17 (木)|
 |~OS|Windows 7|
 |~依存するページ||
 |~バージョン|#listbox3(3.3.0,faq03,version)|
 
 ** メッセージ [#n57c69eb]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 初めまして。Calcでフォームを作りました。SHEET1が入力用、SHEET2が印刷用です。~
 SHEET1でレコードの検索や抽出を行い、SHEET2でそのまま印刷を行いたいのですが~
 ナビゲーションを共通化する方法がわかりません。~
 何かよい方法があればぜひ御教授ください。
 
 ----
 ***GUI ではないようなので [#a3474424]
 >ike@九州 (2011-05-27 10:43:44 (金))~
 ~
 マクロ割り当てになると思います~
 ~
 二つのフォームが同じソース元であるのを前提~
 Sheet1 のフォームの編集から以下マクロをイベント割り当てて下さい~
  'Sheet1のフォームのイベント "レコード変更後"に割り当て
  Sub Main
   On Error Goto Errorhandler
   oDoc = ThisComponent
   oSheet1 = oDoc.getSheets.getByName("Sheet1")
   oSheet2 = oDoc.getsheets.getByName("Sheet2")
   'Sheet1 のフォーム取得
   oForm1 = oSheet1.getDrawPage.getForms.getByIndex(0)
   'Sheet2 のフォーム取得
   oForm2 = oSheet2.getDrawPage.getForms.getByIndex(0)
   'フィルター設定をコピーする
   oForm2.ApplyFilter = oForm1.ApplyFilter
   oForm2.Filter = oForm1.Filter
   'oForm2 を再読み込み表示更新
   oForm2.reload
   '現在の行へ移動
   oForm2.absolute(oForm1.getRow)
   Errorhandler:
  End Sub
 ~
 フォーム構成が不明なので、そのまま動作するかは判りません~
 ドキュメントを開いた際にもイベントが発生するようなのでエラー処理を加えました~
 
 //
 ***ありがとうございました。 [#p87c2540]
 >あまの (2011-05-27 19:14:43 (金))~
 ~
 ご丁重な回答をいただきありがとうございましたた。~~
 早速試したところ、上手く抽出結果が反映されました。~~
 またマクロはこれから勉強しようとしていましたので良い教材になります。~~
 今後も色々教えていただくことになると思いますので、~~
 よろしくお願いします。~
 
 //
 ***今回の問い合わせで判明した事 [#m8eec791]
 >ike@九州 (2011-05-29 12:19:37 (日))~
 ~
 こちらの環境で~
 起動時にイベントが発生しエラーとなっていた原因が分かりましたので…~
 ~
 Calc ドキュメントは起動時に~
 アクティブなシートと Index(0) 番目のシートが読み込まれます。~
 (Sheet1 ならば通常読み込みが発生する事になります)~
 フォームを配置したシートが上記に該当しない(今回は oForm2 )場合に~
 起動時にはフォーム(Resultset)は読み込まれていませんでした。~
 その際 getRow メソッドがエラーを吐く事になります。~
 ~
 一度でもフォームのあるシートをクリックすると、ソース元に接続されその内容が読み込まれソース元の Lock ファイルが生成されます。~
 ~
 上記仕様も踏まえイベント割り当て有無に係わらず必要な時のみ reload するようにしてみました。~
  'Sheet1のフォームのイベント "レコード変更後" に割り当て
  Sub Main(Optional oEv as com.sun.star.lang.EventObject)
   Dim oDoc As Object,oSheet1 As Object,oSheet2 As Object
   Dim oForm1 As Object,oForm2 As Object
   
   'Sheet1 のフォーム取得
   IF IsMissing(oEv) Then
      oDoc = ThisComponent
      oSheet1 = oDoc.getSheets.getByName("Sheet1")
      oForm1 = oSheet1.getDrawPage.getForms.getByIndex(0)  
   Else
      oForm1 = oEv.Source
      oDoc = oForm1.getParent.getParent
   End If
  
   'Sheet2 のフォーム取得
   oSheet2 = oDoc.getsheets.getByName("Sheet2")
   oForm2 = oSheet2.getDrawPage.getForms.getByIndex(0)
   
   'Sheet1,Sheet2 配置のフォームが読み込みされていなければ読み込み
   IF Not oForm1.isLoaded Then oForm1.Load  
   IF Not oForm2.isLoaded Then oForm2.Load
   
   'フィルター内容が違う場合にフィルター設定をコピー
   IF oForm1.Filter <> oForm2.Filter Then
      oForm2.ApplyFilter = oForm1.ApplyFilter
      oForm2.Filter = oForm1.Filter
      'oForm2 を再読み込み表示更新
      oForm2.reload
   End IF
   
   'レコード位置が違うなら位置を合わせる
   IF oForm1.getCount = 0 or oForm2.getCount = 0 Then Exit Sub
   IF oForm1.getRow <> oForm2.getRow Then oForm2.Absolute(oForm1.getRow)
  End Sub
 ~
 SQL発行取得からシートへデータ転記するより~
 整形したシートフォームを連動させ印刷するのはとても良いアイデアだと思いました。~
 ~
 フィルターが転用出来ればフォームのソース元は別でもかまいませんね~
 
 //
 ***詳細まで検証いただきありがとうございます。 [#c52faed1]
 >あまの (2011-05-29 23:29:25 (日))~
 ~
 実際に使っていても気づかなかったところまで検証いただきありがとう~
 ございました。~
 複雑な計算を行う場合はシートへデータを転記、セル関数にる計算とかグラフを自動作成・印刷となるのですが、この場合入力が間違っていると、再度入力画面に戻る必要があるので、印刷画面もフォームを連動させ、印刷画面上からもデータ修正を可能にしたいと思いこの方法を考えました。~
 Calcをフォームにした方がWriterより色々便利ですね。~
 
 //
 #article