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

Q&A集[?]

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

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

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

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:0
総数:2206
現在:2


別シートへの転記を行うマクロについて

ページOpenOffice.org FAQの登録ページ
投稿者川崎
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2008-05-29 19:57:59 (木)
OSwin XP
依存するページ
バージョン
edit/refer

メッセージ

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

表1にフォームと、そのフォーム横にフォームから入力されたデータが入ります。
表1のフォームの「確定」ボタンをクリックすることで、表2には表1の入力データが転記
されていくようにしたいです。

「確定」ボタンにマクロを当てるまではわかるのですが、肝心のそのマクロが・・・
http://www.eurus.dti.ne.jp/~yoneyama/Excel/form.html
まさにこのページに載っていることがしたいのですが、記載されているEXCELのVBAは使
えないようで、その上自力でOOoのマクロを書けない初心者なもので手も足も出ません。

どうかよろしくお願いいたします。


Calcでないといけませんか

M.Kamataki (2008-05-29 22:42:30 (木))

Baseならマクロを書かなくてもできます。

もちろんCalcで回答できる方、お願いします。

そうですね

川崎 (2008-05-30 11:41:09 (金))

最初はBaseで作ろうかと思い動いてました。
しかし自分も含め何人かがエクセルを使い慣れていることで移行するにあたり抵抗が少なく、またグループ内でこれから使ってもらう人達がPC自体になれていないので操作を教育する際、自分がなれた表計算アプリであればなんとか対応ができそうなので、それらを考えるとcalcが良いかなと。
あと、Baseのフォーム作成がCalcでないこともBaseに踏み切れない理由でしょうか。

データの転記部分

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())

まずは最初の一歩から

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です。

やってみました!

川崎 (2008-05-30 21:36:21 (金))

>ike@九州さん
ご回答ありがとうございます。
転記先の表内に転記しようと思ったのですが、罫線があったため表の下に転記されてしまいました。罫線を消して塗りつぶしに変えてみても結果は同じでした。
つまり、セルの中は空でも書式が設定されていてると空白と認識されないということでしょうか?
転記先の罫線がすでにあり(転記先は印刷用フォーマットなので)A10:G20の表内への転記、また「元A1→先B2」のように一対一の転記などセルの指定などはどのようにしたらよろしいでしょうか。

>ponkanさん
意外とコピペのような単純な作業でもマクロの記録はかなり長い命令になっているのですね。驚きました!


早速教えていただいたマクロを表1の選択範囲や表の名前、マクロの記録で得たプログラムを加えたり、自分の作っているものに当てはめながら試行錯誤して、まったく理解できなかったものが色々いじってみて初めて本当に少しですがわかった気がします。

ようこそ、月の砂漠へ

ponkan (2008-05-30 23:07:03 (金))

いや、別に深い意味はありませんが・・・
ようこそ

次の世界への始まりですね(ジレンマ付)

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")

を使います

誤解だけは解いておきたい

M.Kamataki (2008-06-03 23:46:02 (火))

>Baseのフォーム作成がCalcでないこともBaseに踏み切れない理由

実はCalcでもフォームを作成できます。Calcフォーム+Baseの連携は手元では実現できています。まだ、オプションボタンとかリストボックスは設置していませんが。

完全に誤解してました

ike@九州 (2008-06-04 15:40:58 (水))

以前リストボックス配置でトライしたのですが、これでは思う事ができず断念した経緯がありました。
そしてBasicを使いモードレスダイアログ上でBaseからCalcへ任意に転記などコントロールするものを今作成してる途中でした。orz

コンボボックスで配置するのですね、ウィザードも備わっていてスムーズに内容設定できました。(ラベルは別途手動作成必要)

データベースへの追加書き込み、Baseウィザードで作成したWriterフォームにはないドロップダウンによる絞込み検索等簡単に出来るのを知りました。
日付の絞り込みも >=04/1/1 and <= 04/1/2 と入力すると自動で変換されました
Baseウィザード作成したWriterフォームより扱いやすいというのが印象です。

calc_form.png


絞込み結果のCalcへの取り込みが1通りしか無いのが不便ですが、特定のシートへ取り込みその後請求書等へと自動で転記させればよい事ですし

目から大きな鱗が落ちました
追記
Baseからフォームウィザードを使わないでデザイン表示でWriterフォーム作成するとコンボボックス等任意のコントロールを配置する事ができました。但し具体的な設置設定応用例が少ないので、私のようなBase初心者にはかなり時間を要しました。
今後自身も含めて、良い例がありましたら別ページにてご紹介して頂ければとおもいます

ありがとうございました

川崎 (2008-06-09 14:23:33 (月))

なんとか転記を含むフォームができました。
皆さんご協力ありがとうございました。

Baseとの連携、機会があれば自分も勉強してみたいと思います。
でもなぜBaseからのフォーム作成がWriter固定なんでしょうか・・・

遅くなりましたが、これで完了とさせていただきます。

Re: 完全に誤解してました

M.Kamataki (2008-06-11 17:42:58 (水))

>今後自身も含めて、良い例がありましたら別ページにてご紹介して頂ければとおもいます

過去、コントロールのリファレンスを作成したことがあります。セミナーで利用したものなので網羅的になっています。もし、まだ未入手でしたらご利用ください。以下のページの「グラス片手にフォーム設計」の下のPDFです。

http://openoffice-docj.sourceforge.jp/wiki/Documentation/Base_Seminar

また、ドキュメントプロジェクトのサイトではBaseに関するドキュメントの作成も予定しています。

お名前:
題名:


添付ファイル: filecalc_form.png 934件 [詳細]