#133 OpenOffice/Calcでエクセルの様に日付、時刻を自動入力するマクロ 

OpenOffice.orgのCalc用マクロを作ってみました。

エクセルのショートカット機能では現在の日付をCtrl+;、時刻はCtrl+:でセルに入力することができますが、Calcにはそういった機能はない様です。友人に頼まれてエクセルと同じ様な機能が欲しいというので作ったマクロがこれです。
最初にお断りしておきますが、私はOpenOfficeの経験はこのマクロを作る為に数時間さわった程度です。
マクロもネット上の情報を元にして作っていますので、作法にかなっていなかったり、命令の使い方がおかしな点等あるとは思いますが予めご了承ください。

<このマクロでできること>
選択したセルに現在の日付、または時刻を自動的に入力する。
書式はエクセルと同じ形式で、日付はYYYY/M/D形式、時刻はH:MM形式です。
マクロをショートカットキーとして割り当てればキーボード操作でマクロを呼び出せます。

<書式とXLSファイルの互換性>
マクロ内でエクセルと同じ形式の書式設定を行っています。
ファイルをエクセル形式で保存する際に書式に互換がない旨のメッセージが表示されますが、エクセル上で正しく表現できることを確認しています。
日付はCalc上ではユーザ定義書式、エクセル上では標準の書式として認識されます。
時刻はCalc上では標準の書式、エクセル上ではユーザ定義書式として認識されます。
※エクセルでショートカットを使って入力すると、日付は標準の書式、時刻はユーザ定義書式となっていました。

<参考>
OpenOffice.orgのバージョンは3.2.1、MSエクセルのバージョンは2002 SP3で検証しています。
エラー判定は行っていませんので、複数のセルを選択した状態でマクロを呼び出すとエラーが発生します。
エクセルの様に入力途中の値に日付、時刻を挿入する機能はありません。セルに日付、時刻をセットするだけの機能です。
Calc用に作成したマクロですので、他のアプリケーションでは使えません。
書式をセットした後に値をセットしているのは、逆にすると一時的にシリアル値が表示される為です。

<マクロの使い方>
Step1.マクロの記述
1.calcを起動する
2.メニューからツール>マクロ>マクロの管理>OpenOffice.org Basicを選択します
3.マクロの記録先欄から、マイマクロ>Standard>Module1を選びます
4.マクロのある場所からMainというマクロを選びます
5.編集ボタンを押します
6.「マイマクロ&ダイヤログ.Standard - OpenOffice.org Basic」というウィンドウが起動します
7.Sub Main ~ End Subという箇所があると思いますが、その下にコードを貼り付けます
8.「マイマクロ&ダイヤログ.Standard - OpenOffice.org Basic」を×で閉じます

Step2.ショートカットキーへの割り当て
1.calcのメニューから、ツール>カスタマイズを選択します
2.カスタマイズウィンドウを表示します
3.キーボードタブを選択します
4.ショートカットキーの欄からセットしたい項目を選びます(たとえば、Ctrl+Insert等)
5.分類欄からOpenOffice.org マクロ>user>Standard>Mdule1を選択します
6.関数欄から先に貼り付けたマクロを選びます(名称:subGetDate, subGetTime)
 ※fnFormatChkは共通関数なので直接使用することはありません
7.変更ボタンを押します
8.キー欄にショートカットキーを表示します
9.もうひとつのマクロのショートカットを登録します(手順4~8)
10.OKを押し、カスタマイズウィンドウを閉じます

以上で設定ができました。
割り当てたショートカットキーでマクロが動作するか確認してください。


<マクロのコード>

rem ********************************************
rem 現在の日付をセルに設定する
rem ********************************************
sub subGetDate

	'オブジェクト変数を設定
	oCELL = ThisComponent.CurrentSelection

	'書式と値をセットする
	oCELL.NumberFormat = fnFormatChk("YYYY/M/D")
	oCELL.value = DateValue(date)

end sub

rem ********************************************
rem 現在の時刻をセルに設定する
rem ********************************************
sub subGetTime

	'オブジェクト変数を設定
	oCELL = ThisComponent.CurrentSelection

	'書式と値をセットする
	oCELL.NumberFormat = fnFormatChk("H:MM")
	oCELL.value = timevalue(time)

end sub

rem ********************************************
rem 書式の存在をチェックし、なければ作成する
rem   引数
rem       sFormat(i)  調べたい書式 "YYYY/M/D"
rem   戻り値
rem      書式番号
rem ********************************************
Function fnFormatChk(Byval sFormat As String) as Long
	Dim oDocument As Object
	Dim oNumberFormats As Object
	Dim oLocale As New com.sun.star.lang.Locale
	Dim nKey As Long

	oDocument = ThisComponent
	oNumberFormats = oDocument.NumberFormats

	'書式の存在を確認
	nKey = oNumberFormats.queryKey(UCase(sFormat), oLocale, False)
	If nKey <> -1 Then
		'存在する
		fnFormatChk = nKey
	Else
		'書式を追加
		fnFormatChk = oNumberFormats.addNew(UCase(sFormat), oLocale)
	End If
End Function




- 2011/7/5 追記 -
<日付+時刻をセットするマクロ>
日付+時刻を入力するマクロが欲しいとのリクエストをいただき、作成したのが次の2つのサブルーチンです。
これらのサブルーチンは従来のものと組み合わせて使うこともできますし、特別版だけを単独で実行することも可能です。特別版だけを単独で使用する際は、関数fnFormatChkが必要です。関数fnFormatChkは、上の<マクロのコード>という欄にあります。

その1
subGetDateTimeは、日付と時刻をセルにセットするサブルーチンです。
例)2011/7/5 8:05

その2
subGetTimeXXは、従来のsubGetTimeに機能を加えたものです。当日の日付を入力済のセル上で実行することで、時刻を追加することができます。
使い方としては、subGetDateに続けてsubGetTimeXXを実行することで、日付+時刻の形式で値をセットできる様にしました。
例)時刻をセルにセット・・・8:05(従来と同等の機能)
  当日日付を入力済みの場合・・・2011/7/5→2011/7/5 8:05

<特別版:日付+時刻バージョン2種類>
rem ********************************************
rem 現在の日付+時刻をセルに設定する
rem ********************************************
sub subGetDateTime

	'オブジェクト変数を設定
	oCELL = ThisComponent.CurrentSelection

	'書式と値をセットする
	oCELL.NumberFormat = fnFormatChk("YYYY/M/D H:MM")
	oCELL.value = DateValue(date) + timevalue(time)

end sub


rem ********************************************
rem 現在の時刻をセルに設定する(拡張仕様版)
rem <特殊機能>
rem セルの値が今日の日付ならセルの日付+時刻をセット
rem ********************************************
sub subGetTimeXX

	'オブジェクト変数を設定
	oCELL = ThisComponent.CurrentSelection

	'セルのデータを判定
	if oCELL.value <> DateValue(date) then
		'時刻をセットする
		oCELL.NumberFormat = fnFormatChk("H:MM")
		oCELL.value = timevalue(time)
	else
		'セルの内容(日付)+時刻をセットする
		oCELL.NumberFormat = fnFormatChk("YYYY/M/D H:MM")
		oCELL.value = oCELL.value + timevalue(time)
	endif

end sub

スポンサードリンク


コメント

お礼とお願い

もう随分前に作られた記事なので今更かも知れませんが、

この度、新しいPCに買い換えたのを契機にMS officeから
Open Officeに切り替えましたが、作業性の違いに戸惑っていました。

本機能も重宝していただけになんとも残念で、
なんとかならないものかと検索していて
当記事を見つけました。

早速使わせていただきます。
ありがとうございます。

そこでお願いなのですが、EXCELでは、同じセル内で、
ctrl + ; スペース ctrl + : と押すと
年月日 スペース 時刻 と表示されたのですが、
同じようなことが可能なのでしょうか。
マクロには全くと言ってもよいぐらいの素人なので、
もし可能なら作っていただけると幸いです。

よろしくお願いいたします。

Re: お礼とお願い

いーとも 様

コメントありがとうございます。
私の作成したマクロがお役に立てたとのことでうれしく思います。

さて、マクロの機能ですが、記事本文にも記載した様にエクセルのショートカットの様な機能はありません。
マクロを作成した際、エクセルと同等の機能にしようと考えていたのですが、OpenOfficeで入力途中のデータ(セルの値が未確定)を扱う方法が分からなかった為に断念しました。また、そこまでの機能も必要なかったので、日付、時間をセットするだけのマクロを作成した次第です。

今日も色々とネットを検索したのですが、良い情報はありませんでしたし、私のOpenOfficeの知識ではエクセルと同等の機能を作るのは難しい様です。
エクセルに近い機能は無理としても、もっと単純な機能であれば実現可能かもしれません。例えば、日付と時刻を一度にセットする機能なら簡単に出来ます。
例)"yyyy/m/d h:mm"の書式で現在の日付と時刻をセルに設定する。セル上では"2011/7/4 22:08"の様になります。

この様な機能なら作成することもできると思いますので、どの様なものをお望みなのかお聞かせいただければと思います。

早速のご丁寧なお返事ありがとうございます。

まさしく、例)のとおりの仕様であれば万々歳です!

EXCELでは ;とスペースと:を押してましたので
ショートカットキーひとつで代用できるようになれば
却って楽になります。

よろしくお願いします。

Re: 日付+時刻のマクロ

いーとも 様

こんにちは。

日付+時刻を入力するマクロの件ですが、2種類のサブルーチンを作成しました。
コードは記事本文に追記しています。

2種類の内どちらを使っても日付+時刻の入力は可能ですので、どちらか使いやすい方を選んでください。
単純に日付+時刻がセットできるのはsubGetDateTimeです。
subGetTimeXXは日付または時刻を単独でセットすることもある場合を想定して作成しました。時刻だけをセットするのにも日付+時刻の形式にするのにも使えるサブルーチンです。

マクロの組み込み方は従来のものと同じですので、記事本文をご覧いただければと思います。

ありがとうございます

早速作っていただきありがとうございました。

コピペして早々に使わせていただきました。感謝です。

尚、蛇足かも知れませんが、オリジナルコードを含め、
コピペしたあとに、各コマンド(というのでしょうか)の
左のスペースは全部半角に直さないと動作しない(エラーになる)ようです。
補記されたほうが良いかも知れませんね。
(私のPCだけの症状だったら失礼お許しください)

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

Re: ありがとうございます

こんにちは。

ご指摘ありがとうございます。
色々なブラウザで試しましたが、いーともさんのおっしゃる「左側のスペースを半角スペースにしないとエラーになる」という現象は再現できませんでした。

テスト中にインターネットエクスプローラー(IE)でコードをコピーして貼り付けると、改行コードが無視される(無くなる)現象をみつけましたので修正しました。
IEの改行コードの件はブラウザの動作の違いによるものだと思いますが、左側のスペースの問題は分かりませんでした。一般的なブラウザでテストをしたのですが、こちらでは再現しませんでした。
※Opera11.50, Firefox3.6, Chrome12.0, IE8, IE9にて確認しています。

またまたご丁寧にありがとうございます。

ちょっと表現が曖昧だったかも知れませんが、
ブラウザではなく、OpenOfficeのマクロに貼り付け、
マクロを実行すると途中で止まってしまうので、
こういう行↓

'オブジェクト変数を設定
oCELL = ThisComponent.CurrentSelection

の左のスペースをすべて消して改めて半角で入れてみると
問題なく作動しました。という意味でした。

そういえば
>改行コードが無視される(無くなる)現象
もありました。
原文と比較しながら一行ずつ改行を入れましたので、
その影響だったのかも知れません。

ご参考にと思いましたが、いらぬお節介というか勘違いかも
知れませんのでご放念いただければと思います。

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

Re: 左側スペースのエラーの件

こんにちは。

先のコメントが説明不足でしたが、ブラウザをテストしたのはOpenOfficeにコードを貼り付けておかしくなるとしたらブラウザが原因の可能性が高いからです。
私の使っているブラウザではいーともさんのおっしゃるような事象は発生しませんでしたので、数種類のブラウザでOpenOfficeにコードを貼り付けてテストを行いました。

改行コードが無くなっていたのでしたら、改行し直した時になにかおかしなデータが入ったのかもしれませんね。
その後記事本文を修正し、主要なブラウザで正しく動作することも確認していますので、今後は大丈夫だと思います。
またなにかありましたらコメントいただければと思います。

最後まで本当にご丁寧にありがとうございました。

再度です・・・

複数のアプリを立ち上げてイロイロやっていると、突然OpenOfficeが起動できなくなってしまい、再インストールしたところ、マクロが消えてしまいました。

で、またこちらにやってきてコピペさせていただいたのですが、マクロを実行すると、

BASIC ランタイムエラー
Sub または Function プロシージャーの未定義。

というアラーム画面がポップアップし、

oCELL.NumberFormat = fnFormatChk("YYYY/M/D H:MM")

の行が反転、マクロがストップ状態になってしまいます。

ヘルプを見てもさっぱりです。
OpenOfficeのバージョンは 3.3.0 となっています。

大変申し訳ありませんが、また助けていただけないでしょうか。
お手数をおかけしますがよろしくお願いいたします。

Re: 再度です・・・

いーとも 様

こんにちは。

エラーの件ですが、fnFormatChkの関数が定義されていないのだと思います。
マクロのコードは、2回掲載しています。元々の公開していたものと、あとから追加した特別版です。
いーともさんは、特別版の部分だけを貼り付けていませんか?

特別版は元のマクロに追加できる形で公開しているのですが、実行するには元のマクロの一部が必要です。
<マクロのコード>の全部を貼り付けるか、<マクロのコード>のfnFormatChkの部分だけを貼り付けて試してみてください。

よろしくお願いします。

できました

<マクロのコード>の全部を貼り付けてできました。

なんともお恥ずかしいかぎりで・・・

お手間を取らせ申し訳ありません。ありがとうございました。

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

Re: 参考になりました

コメントありがとうございます。
参考になったとのこと、私の記事がお役に立てたようで良かったです。

大分前に書いた記事ですが、今見直してみるとコード(マクロ)が少し複雑かなとも思いました。
日付と時刻をセットするだけならもっとシンプルにできるのですが、エクセルと同じ書式を実現する為にあのようなコードにしています。

毎日の日付更新が楽になりました。ありがとうございます

Re: タイトルなし

こんにちは。管理者の2ZZです。
お役に立てたようで良かったです。このマクロも人気がありますね。ちょうどAutoHotKeyというキーボード操作のプログラムを試しているところなので、汎用的に使える日付入力プログラムでも作ってみようかと思います。

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

コメントの投稿

この記事に対するご意見・ご感想を募集しています。
コメント内容のみ必須入力です。それ以外は任意でご入力ください。











管理者にだけ表示を許可する(再編集はできません)

トラックバック

この記事のトラックバックURL
http://zze128.blog9.fc2.com/tb.php/175-6a2fa75e