「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:1601
現在:4


Calcをフォームにした時、シート間のナビゲーション共通化

ページOpenOffice.org FAQの登録ページ
投稿者あまの
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2011-05-26 22:14:17 (木)
OSWindows 7
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

初めまして。Calcでフォームを作りました。SHEET1が入力用、SHEET2が印刷用です。
SHEET1でレコードの検索や抽出を行い、SHEET2でそのまま印刷を行いたいのですが
ナビゲーションを共通化する方法がわかりません。
何かよい方法があればぜひ御教授ください。


GUI ではないようなので

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


フォーム構成が不明なので、そのまま動作するかは判りません
ドキュメントを開いた際にもイベントが発生するようなのでエラー処理を加えました

ありがとうございました。

あまの (2011-05-27 19:14:43 (金))

ご丁重な回答をいただきありがとうございましたた。~
早速試したところ、上手く抽出結果が反映されました。~
またマクロはこれから勉強しようとしていましたので良い教材になります。~
今後も色々教えていただくことになると思いますので、~
よろしくお願いします。

今回の問い合わせで判明した事

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発行取得からシートへデータ転記するより
整形したシートフォームを連動させ印刷するのはとても良いアイデアだと思いました。

フィルターが転用出来ればフォームのソース元は別でもかまいませんね

詳細まで検証いただきありがとうございます。

あまの (2011-05-29 23:29:25 (日))

実際に使っていても気づかなかったところまで検証いただきありがとう
ございました。
複雑な計算を行う場合はシートへデータを転記、セル関数にる計算とかグラフを自動作成・印刷となるのですが、この場合入力が間違っていると、再度入力画面に戻る必要があるので、印刷画面もフォームを連動させ、印刷画面上からもデータ修正を可能にしたいと思いこの方法を考えました。
Calcをフォームにした方がWriterより色々便利ですね。

お名前:
題名: