2011年6月29日水曜日

変数の有効範囲

Calc Basic の変数には、Global、Public、Private、ローカルの四種類の
変数がある。それぞれの変数の宣言と有効は下記の通りである。但し、
Global については、(VB の Public と同様の有効範囲であると推察される
が) どのような場面で使用するのか全く思いつかない為、ヘルプの内容を
ほぼそのまま記載させて頂いた。
  
1. Global 変数
   LibreOffice セッション終了時まで有効な変数。他のドキュメントから
   アクセスすることが可能と思われる。書式は下記の通り :
  
      Global Varname As Typename
  
2. Public 変数
   ドキュメント (プロジェクト) 内の全てのモジュールからアクセスすること
   が可能。書式は下記の通り :
  
      Public Varname As Typename
  
3. Private 変数
   モジュール内でのみ有効な変数。モジュール内の全てのプロシージャ
   や関数からはアクセス可。書式は下記の通り :
  
      Private Varname As Typename
  
4. ローカル変数
   プロシージャ、または、関数内でのみ有効な変数。書式は下記の通り :
  
      Dim Varname As Typename
  
Public変数、Private変数、ローカル変数の有効範囲について理解する為、
実際のサンプルコードを以下に記す。Module1、Module2 の二つのモジュール
があるものとし、それぞれのモジュール内のプロシージャを下記の通りとする :
  
Module1
  
Public gstrVar As String
Private mstrVar As String
  
Sub Proc0()
       Dim strVar As String
       gstrVar = "変数gstrVarはPublic変数です"
       mstrVar = "変数mstrVarはModule1のPrivate変数です"
       strVar = "変数strVarはModule1のProc0のローカル変数です"
       Module1.Proc2()
End Sub
  
Sub Proc1()
       Dim strVar As String
       gstrVar = "変数gstrVarはPublic変数です"
       mstrVar = "変数mstrVarはModule1のPrivate変数です"
       strVar = "変数strVarはModule1のProc1のローカル変数です (*)"
       Module2.Proc3()
End Sub
  
Sub Proc2()
       Dim strVar As String
       strVar = "変数strVarはModule1のProc2のローカル変数です (**)"
       Msgbox(gstrVar & Chr$(13) & _
                      mstrVar & Chr$(13) & _
                      strVar, 0, _
                      "Module1.Proc2のメッセージ")
End Sub
  
Module2
  
Private mstrVar As String
  
Sub Proc3()
       Dim strVar As String
       mstrVar = "変数mstrVarはModule2のPrivate変数です (***)"
       strVar = "変数strVarはModule2のProc3のローカル変数です (****)"
       Msgbox(gstrVar & Chr$(13) & _
                      mstrVar & Chr$(13) & _
                      strVar, 0, _
                      "Module2.Proc3のメッセージ")
End Sub
  
Module1の Proc0 プロシージャを実行した結果のメッセージボックスは
下図の通りとなる。この例からわかるように、Public と Private の値は
引き継がれることがわかる。また、Proc0 と Proc2 それぞれで宣言
されているローカル変数 strVar は、同じ名前であっても、異なる変数
であることも、この例からわかる :
  

Module1の Proc1 プロシージャを実行した結果のメッセージボックスは
下図の通り。Global 変数がモジュールを跨って値が保持されることが
この例からわかる :


2011年6月26日日曜日

シートの表示・非表示 (2)

シートの表示・非表示について、第二弾。
  
第一弾では、「マクロの記録」
で生成したコードを元にしたものであったが、
今回はシートオブジェクトに IsVisibleプロパティ、というものがあるのを
発見したので、今回はそのプロパティについて述べる。
  
IsVisible プロパティオブジェクトの書式については下記の通り :
  
   シートオブジェクト.IsVisible
  
値の取得だけでなく、値の代入も可能なプロパティのようであり、シート
表示・非表示の状態の確認、及び、シートを表示したり、非表示にしたり
する為のプロパティらしい。
シートが表示の場合、或いは、表示にする場合のプロパティ値は True、
非表示の場合、或いは、非表示にする場合のプロパティ値は False である。
  
以下は、IsVisible プロパティを使用して、シート「Sheet2」を表示したり
非表示にしたりするコードの例である。
  
Sub ExampleShowAndHideSheet()
       Dim objSheet As Object
       objSheet = ThisComponent.Sheets.getByName("Sheet2")
       If objSheet.IsVisible Then
              '
              'シートが表示されている場合は非表示にする
              Msgbox("Sheet2は表示されてます。")
              objSheet.IsVisible = False
              Msgbox("Sheet2は非表示になりました。")
       Else
              '
              'シートが非表示の場合は表示にする
              Msgbox("Sheet2は非表示になってます")
              objSheet.IsVisible = True
              Msgbox("Sheet2は表示されました。")
  End If
End Sub

2011年6月24日金曜日

シートの表示・非表示 (1)

下記にシートの非表示と表示のサンプルコードを記す。シート「Sheet2」を
非表示にしたり、表示したりするコードである。いずれも、「マクロの記録」
で生成されたコードをキレイにしただけのものである。
  
先ず、シート「Sheet2」を非表示にするコード。
  
Sub ExampleHideSheet()
       Dim objDoc As Object
       Dim objDisp As Object
       Dim args1(0) As New com.sun.star.beans.PropertyValue
'
       objDoc = ThisComponent.CurrentController.Frame
       objDisp = createUnoService("com.sun.star.frame.DispatchHelper")
       '
       args1(0).Name = "aTableName"
       args1(0).Value = "Sheet2"
       '
       objDisp.executeDispatch(objDoc, ".uno:Hide", "", 0, args1())
End Sub
  
次に、シート「Sheet2」を表示するコード。
  
Sub ExampleShowSheet()
       Dim objDoc As Object
       Dim objDisp As Object
       Dim args1(0) As New com.sun.star.beans.PropertyValue
       '
       objDoc = ThisComponent.CurrentController.Frame
       objDisp = createUnoService("com.sun.star.frame.DispatchHelper")
       '
       args1(0).Name = "aTableName"
       args1(0).Value = "Sheet2"
       '
       objDisp.executeDispatch(objDoc, ".uno:Show", "", 0, args1())
End Sub
  
いずれも、各々のオブジェクト等についてはわからないので、「おまじない」
に等しい。

2011年6月22日水曜日

マクロの記録

Excel の優れた機能の一つに「マクロの記録」がある。VBA を勉強する上
で、どんな参考書よりも役に立つのではないかと、個人的には思っている。
「マクロの記録」で自動生成されたコードを参考に、あとはヘルプで調べれ
ば、それなりに高度なマクロが作れるようになる。
当然 Calc にも同様の機能を期待をしていたのだか、「マクロの記録」という
のはあったが、下図のように白っぽくなっていて、どうも使えそうにない。そう
あきらめていた、今日まで...
  
ところが、参考文献 6) をよーく見てみると、どうやらマクロが使えるらしい!
ということで、実際、以下の通り設定を行ってみた :
  
1. メニューの「ツール」→「オプション」を選択
  
2. 「オプション」画面の「LibreOffice」→「全般」を選択し、一番下にある
   「実験的 (不安定) な機能を有効にする」にチェックをして「OK」ボタン
   をクリック。
  
3. 改めてメニューの「ツール」→「マクロ」を選択すると「マクロの記録」の
   文字が黒くなっていて、使えそう!
  
試しに、シートを非表示にするマクロが自動的に生成されるか確かめて
みる。以下、「Sheet2」を非表示にする手順である。
  
a. メニューの「ツール」→「マクロ」→「マクロの記録」を選択すると、
  
b. 「マクロ...」という小さな画面が表示される。
  
c. 「Sheet2」を選択し、メニューの「書式」→「シート」→「非表示」を選択。
  
d. 「Sheet2」が非表示になったことを確認したら、「マクロ...」画面の「記録
   の終了」ボタンをクリック
  
e. 「LibreOffice Basic マクロ」画面が表示されるので、現在のドキュメント
   (この例の場合「無題1」)を選択し、「新しいモジュール」ボタンをクリック。
  
f. 画面右側の「マクロのある場所(I) Module1」の「Main」が選択されている
   ことを確認し、「保存」ボタンをクリック。
  
g. 「マクロ 'Main' に上書きしますか」と尋ねられるが、構わず「はい」ボタン
   をクリックすると、Module1 の Main プロシージャに一連の動作のマクロ
   が生成されている。
  
h. 実際に生成されたマクロは下図の通り。
  
実際、「Sheet2」シートを再表示して、上記マクロを実行すると、ちゃんと
「Sheet2」シートが表示されなくなる。

2011年6月20日月曜日

メッセージボックスについて

今まで、サンプルコード中に何回も出てきたメッセージボックスについて
詳しく記す。
  
Msgbox 関数、または、Msgbox ステートメントは、メッセージを表示する
為のダイアログ。Msgbox 関数の場合は、どのボタンがクリックされたか
を戻り値として取得することができる。書式は下記の通り :
  
   Msgbox(Text [, Type] [, DialogTitle]])
  
または
  
   Msgbox Text [, Type] [, DialogTitle]]
  
Text には、ダイアログボックスにメッセージとして表示したい文字列を指定
する。
DialogTitle には、ダイアログボックスのタイトルバーに表示する文字列を指定
する。省略した場合は、(Ver.3.3 では)、「soffice」と表示される。
Type には、下記の数値を指定する。省略した場合は、ゼロを指定したものと
みなされる :
  
   ① ダイアログに表示するボタンの種類と数の指定 (0 ~ 5) :
      0 : 「OK」ボタンのみ表示
      1 : 「OK」、「キャンセル」の二つのボタンを表示
      2 : 「中止」、「やり直し」、「無視する」の三つのボタンを表示 (この
          場合のみ、ダイアログの「X」ボタンをクリックしても閉じなくなる)。
      3 : 「はい」、「いいえ」、「キャンセル」の三つのボタンを表示
      4 : 「はい」、「いいえ」の二つのボタンを表示
      5 : 「やり直し」、「キャンセル」の二つのボタンを表示
  
   ② ダイアログに表示するアイコンの種類の指定 (16 ~ 64) :
      16 : ストップ記号のアイコンを表示
      32 : 疑問符のアイコンを表示
      48 : エクスクラメーション記号のアイコンを表示
      64 : インフォメーション記号のアイコンを表示
  
   ③ ダイアログ上に複数ボタンがあった場合に、どのボタンをデフォルトの
       ボタンにする (どのボタンにフォーカスをセットするか) を指定。省略
       した場合は、一番左のボタンがデフォルトになる (128 ~ 512) :
      128 : 一番左のボタンをデフォルトに (フォーカスをセット) する
      256 : 二番目のボタンをデフォルトにする
      512 : 三番目のボタンをデフォルトにする
  
①、②、③ を組み合わせたい場合は、Type
  
   2 + 32 + 256
  
のように指定する。この場合、下図のようなダイアログとなる :
 
Msgbox 関数の戻り値は、クリックしたボタンに応じて、下記の通りの数値
が返される。但し、「X」ボタンでダイアログを閉じた場合 (上述のように、
Type が 2 の時は「X」をクリックしてもとじない) はゼロが返されるようである :
  
   1 : 「OK」ボタンがクリックされた場合
   2 : 「キャンセル」ボタンがクリックされた場合
   3 : 「中止」ボタンがクリックされた場合
   4 : 「やり直し」ボタンがクリックされた場合
   5 : 「無視する」ボタンがクリックされた場合
   6 : 「はい」ボタンがクリックされた場合
   7 : 「いいえ」ボタンがクリックさけた場合

2011年6月18日土曜日

経過時間を計算する

マクロの処理にどれ位時間がかかったか、等のように経過時間を求め
たい場合は、Timer 関数を使用する。
  
Timer 関数は午前零時からの経過秒数を取得する関数である。書式は
下記の通り :
  
   Timer()
  
戻り値は、午前零時からの経過秒数を表す長整数値を返す。
  
Timer 関数を用いて、処理に要した時間 (秒数) を求めるサンプルコード
を下記に記す :
  
Sub ExampleGetProcessTime()
       Dim lngStartTime As Long
       lngStartTime = Timer()
       '
       '4 秒待機する(実際は何等かの処理を行うコードが書かれる)
       Wait(4000)
       '
       Msgbox(Timer() - lngStartTime & " 秒経過しました。")
End Sub

2011年6月17日金曜日

配列のインデックス範囲を求める

「文字列関数 (5)」の項で既に触れてしまったが、配列のインデックス範囲
の下限値、上限値を求める為には、LBound 関数、UBound 関数をそれぞれ
用いる。各関数の書式は下記の通り :
  
   LBound(ArrayVarname [, Dimension])
   UBound(ArrayVarname [, Dimension])
  
ArrayVarname は対象となる配列変数。
Dimension には、インデックス範囲の下限値、上限値を求めたい次元を指定
する。例えば、ArrayVarname が 3 次元配列変数であった場合、第 2 次元目
のインデックス範囲を求めたい場合は、Dimension に 2 を指定する。省略時
は 1 次元とみなされる。
  
サンプルコードを以下に記す(わざわざ値を代入する必要はないのだが...) :
  
Sub ExampleIndexBounds()
       Dim arr1(3) As String
       Dim arr2(2, 3) As String
       '
       '変数 arr1 に値を代入する
       arr1(0) = "0"
       arr1(1) = "1"
       arr1(2) = "2"
       arr1(3) = "3"
       '
       '変数 arr2 に値を代入する
       arr2(0, 0) = "00"
       arr2(0, 1) = "01"
       arr2(0, 2) = "02"
       arr2(0, 3) = "03"
       arr2(1, 0) = "10"
       arr2(1, 1) = "11"
       arr2(1, 2) = "12"
       arr2(1, 3) = "13"
       arr2(2, 0) = "20"
       arr2(2, 1) = "21"
       arr2(2, 2) = "22"
       arr2(2, 3) = "23"
       '
       Msgbox("arr1のインデックス範囲は " & _
                      LBound(arr1) & "-" & UBound(arr1))
       Msgbox("arr2のインデックス範囲は " & _
                      LBound(arr2, 1) & "-" & UBound(arr2, 1) & " " & _
                      LBound(arr2, 2) & "-" & "UBound(arr2,2))
End Sub
  
実行の結果、
  
   「arr1のインデックス範囲は 0-3」
   「arr2のインデックス範囲は 0-2 0-3」
  
とメッセージが表示される。
ここで、インデックスは 0 から始まり、次元は 1 から始まることに注意する
こと(なんとなく、統一感がないが...)。

2011年6月16日木曜日

マクロを指定時間待機させる

マクロの実行を指定時間待機させるには、Wait ステートメントを使用する。
書式は下記の通り :
  
   Wait Milliseconds
  
または
  
   Wait(Milliseconds)
  
Milliseconds には待機したい時間をミリ秒で指定する。
サンプルコードは下記の通り :
  
Sub ExampleSleepMacro()
       Msgbox("時間よ止まれ!!")
       Wait 3000
       Msgbox("動いた!!")
End Sub
  
上記サンプルコードでは、最初のメッセージボックスの OK ボタンをクリック
してから処理が 3 秒停止した後、二つ目のメッセージ「動いた!!」が表示され
る。

2011年6月15日水曜日

他のアプリケーションの起動

Calc マクロから、電卓やブラウザー等の、他のアプリケーションを起動
するには Shell 関数を使用する。起動時のウィンドウのスタイルや、起動
したアプリケーションを待機するか否かなどのも行うことができる。
書式は下記の通り :
  
   Shell(Pathname, [Windowstyle] [, Parameter [, WaitOnReturn]])
  
Pathname は起動するアプリケーションの絶対パス。
Windowstyle には起動するアプリケーションのウィンドウスタイルを設定する。
指定する値は下記の通り。省略した場合は 1 のようである :
  
   0 : ウィンドウを非表示にして、フォーカスを移動
   1 : ウィンドウを標準サイズにして、フォーカスを移動
   2 : ウィンドウを最小化 (アイコン化) して、フォーカスを移動
   3 : ウィンドウを最大表示にして、フォーカスを移動
   4 : ウィンドウを標準サイズにするが、フォーカスは移動しない
   6 : ウィンドウを最小化するが、フォーカスはアクティブウィンドウに留める
   10 : 全画面表示にする
  
Parameter には、起動するアプリケーションに渡すコマンド行パラメータを
示す文字列を指定する。
WaitOnReturn には、起動したアプリケーションが終了するまで LibreOffice
の全タスクを待機するか否かをブール値を指定する。True を指定した場合
は待機し、False を指定した場合は待機せずに起動した後、マクロ次の命令
に制御が戻る。省略した場合は、False とみなされる。
  
以下、サンプルコードを記す :
  
Sub ExampleShellFunction()
       Shell("C:\Windows\notepad.exe", 1, "D:\Temp\sample.txt", True)
       Msgbox("終わったよ!!")
End Sub
  
上記サンプルの場合、「メモ帳」で D:\Temp\sample.txt というファイルを
標準のウィンドウサイズで開き、メモ帳を閉じたところで、「終わったよ!!」
というメッセージがひょうじされる。つまり、起動したメモ帳が終了するまで、
次の命令に制御がうつるのを待機していたことになる。

2011年6月14日火曜日

テスト関数

今回は Calc Basic の各種テスト関数について。
  
1. IsArray 関数
   書式は
  
      IsArray(Varname)
  
   変数 Varname が配列であるか否かを判定する。配列の場合は True、
   そうでない場合は False を、それぞれ戻り値として返す。
  
2. IsDate 関数
   書式は
  
      IsDate(Expression)
  
   引数 Expression に指定された数式、または、文字列が日付や時刻として
   妥当であるかの判定を行う。日付や時刻として妥当であれば 戻り値として
   True を、そうでない場合は False をそれぞれ返す。
  
3. IsEmpty 関数
   書式は
  
      IsEmpty(Varname)
  
   Variant 型の変数 Varname が空 (Empty) である場合、すなわち、初期化前
   である場合、戻り値として True を、そうでない場合は False を返す。
   ここで、Variant 型変数の Empty であるが、これは null でも、"" (空文字列)
   でもない、Variant 型特有の値で、「初期化されていない」ことを表すキーワード
   らしい。実際、下記のサンプルコード、
  
Sub ExampleTestFunctions1()
       Dim var As Variant
       '
       var = Empty
       If IsEmpty(var) Then
              Msgbox("変数は「空」です-その1-")
       Else
              Msgbox("変数は「空」ではありません-その1-")
       End If
       '
       var = null
       If IsEmpty(var) Then
              Msgbox("変数は「空」です-その2-")
       Else
              Msgbox("変数は「空」ではありません-その2-")
       End If
       '
       var = ""
       If IsEmpty(var) Then
              Msgbox("変数は「空」です-その3-")
       Else
              Msgbox("変数は「空」ではありません-その3-")
       End If
End Sub
  
を実行すると、
  
      ・変数は「空」です-その1-
      ・変数は「空」ではありません-その2-
      ・変数は「空」ではありません-その3-
  
の順にメッセージが表示される。つまり、Empty は null でも "" でもない、
ということになる。摩訶不思議...
  
4. IsMissing 関数
   書式は
  
      IsMissing(Argumentname)
  
   Funtion や Sub で指定した Optional パラメータが指定されているか否か
   の判定に用いる。たとえば、
  
      Sub xxxx(ByVal arg1, Optional arg2)
  
   や
  
      Function xxxx(ByVal arg1, Optional arg2)
  
   というプロシージャや関数で
  
      IsMissing(arg2)
  
   の戻り値が True の場合、arg2 は省略されてないことを示し、逆に戻り値
   が False の場合、引数 arg2 が省略されたことを示す。
  
5. IsNull 関数
   書式は
  
      IsNull(Varname)
  
   変数 Varname が null の場合、戻り値として True を返し、null でない場合は
   False が戻り値として返される。
  
6. IsNumeric 関数
   書式は
  
      IsNumeric(Expression)
  
   引数 Expression に指定された数式、または、文字列が数字として妥当であるか
   の判定を行う。数字として妥当であれば 戻り値として True を、そうでない場合は
   False をそれぞれ返す。
  
7. IsObject 関数
   書式は
  
      IsObject(Varname)
  
   変数 Varname がオブジェクト型の変数の場合、戻り値として True を返し、そう
   でない場合は False が戻り値として返される。
  
もうひとつ、ヘルプに IsUnoStruct 関数というのがあったが、使い途が全くわから
ないので割愛する。

2011年6月13日月曜日

データ型変換関数

Calc Basic で用意されているデータ型変換関数は下記の通り。いずれの
関数も書式は
  
      Cxxxx(Value)
  
である。
  
1. CBool 関数
   引数 Value に指定された文字列や数式をブール型の値に変換する。
   例としては、幾つか下記に挙げる :
  
      ・ CBool("True") の場合の戻り値は (ブール型の値の) True
      ・ CBool("False") の場合の戻り値は False
      ・ CBool(1) の場合の戻り値は True
      ・ CBool(0) の場合の戻り値は False
      ・ CBool(2 < 3) の場合の戻り値は True
      ・ CBool(2 > 3) の場合の戻り値は False
  
    引数に変数を用いた数式を指定するのも可。
  
2. CDate 関数
   日付や時刻を表す文字列、または、日付のシリアル値を指定すると
   日付型の値に変換する。
   日付や時刻として指定できる文字列は、確認した限りでは、
  
      yy/mm/dd、yyyy/mm/dd、yy-mm-dd、yyyy-mm-dd、hh:mm:ss
  
   漢字混じりの"2011年12月31日"や"11時23分45秒"、或いは、"20111231"
   はエラーになる。
  
3. CDbl 関数
   文字列、数値や数式を倍精度浮動小数点型の値に変換する。
  
4. CInt 関数
   文字列、数値や数式を整数型の値に変換する。
  
5. CLng 関数
   文字列、数値や数式を長整数型の値に変換する。
  
6. CSng 関数

   文字列、数値や数式を単精度浮動小数点型の値に変換する。
  
7. CStr 関数
   ブール値、数値、数式(20 - 11 のような)、日付型の値を文字列の値
   に変換する。引数に文字列を指定すれば、そのまま文字列を戻り値
   として返す。

2011年6月12日日曜日

文字列関数 (7)

文字列関数編、第七弾。今回は Format 関数について。
  
Sub ExampleStringFunctions7()
       Dim objSheet As Object
       Dim objCell As Object
       objSheet = ThisComponent.CurrentController.ActiveSheet
       '
       objCell = objSheet.getCellRangeByName("A1")
       objCell.String = Format(12.2, "00000.000")
       objCell = objSheet.getCellRangeByName("B1")
       objCell.String = Format(-154.3, "00000.000")
       objCell = objSheet.getCellRangeByName("C1")
       objCell.String = Format(1546, "00000.000")
       objCell = objSheet.getCellRangeByName("D1")
       objCell.String = Format(654321.2734, "00000.000")
       '
       objCell = objSheet.getCellRangeByName("A2")
       objCell.String = Format(00012.3, "##,##0.000")
       objCell = objSheet.getCellRangeByName("B2")
       objCell.String = Format(12.340, "##,##0.###")
       objCell = objSheet.getCellRangeByName("C2")
       objCell.String = Format(45.000, "##,##0.###")
       objCell = objSheet.getCellRangeByName("D2")
       objCell.String = Format(0.45, "##,###.###")
       '
       objCell = objSheet.getCellRangeByName("A3")
       objCell.String = Format(0.765, "%")
       '
       objCell = objSheet.getCellRangeByName("A4")
       objCell.String = Format(CDate("2001/10/2"), "yyyy/mm/dd")
       objCell = objSheet.getCellRangeByName("B4")
       objCell.String = Format(CDate("2001/10/2"), "yyyy年mm月dd日")
       objCell = objSheet.getCellRangeByName("C4")
       objCell.String = Format(CDate("2001/10/2"), "yyyy-mm-dd")
       '
       objCell = objSheet.getCellRangeByName("A5")
       objCell.String = Format(CDate("23:45:11"), "hh:mm:ss")
       objCell = objSheet.getCellRangeByName("B5")
       objCell.String = Format(CDate("23:45:11"), "hh時mm分ss秒")
End Sub
  
上記サンプルコード中の CDate 関数は、文字列を日付や時刻の値に
変換する関数である (後日、詳述する)。
  
上記マクロの実行結果は下図の通り(小さくて見辛いが) :
  
Format 関数とは、値を指定された書式の文字列に変換する関数である。
書式は下記の通り :
  
      Format(Value , Format)
  
Value には数値や日付や時刻の値を指定する。
Format には後述の書式コードを用いて書式を指定する。
戻り値は、変換された文字列が返される。
  
書式コードについて。
  
1. 数値の書式コードについて
   Value に指定された数値の書式を指定する主な書式コードは下記の
   通り :
  
      0 : Value に指定された数値の先頭や小数部の末尾の該当桁に数値
          がない場合にゼロを表示させる。小数部については、サンプルコード
          にもあるように、Value の小数点以下の桁数が4 桁あっても、書式
          で小数点以下を 3 桁しか指定していないと、書式に合わせて値が
          切り捨てられてしまう。
      # : Value に指定された数値の先頭や小数部の末尾の該当桁のゼロを
          表示させないようにする書式コード。小数点以下の桁数については、
          上の場合と同様、書式の桁数に合わせられる。
      . (ピリオド) : 小数点の位置を指定する書式コード。
      , (カンマ) : 千単位の区切り記号として指定する書式コード。
      % : 数値を 100 倍してパーセント記号を付与するときに指定する。
          小数部は切り捨てられるようだ。
  
2. 日付と時刻の書式コードについて
   Value に指定された日付や時刻の書式を指定する主な書式コードは
   
下記の通り :
  
      yyyy : Value で指定された値の「年」を 4 桁で表示する書式コード。
      yy : Value で指定された値の「年」を 2 桁で表示する書式コード。
      mm : Value で指定された値が日付の場合は「月」を 2 桁で表示する。
             1 ~ 9 月については、先頭らゼロがついた形で表示される。
             また、Value で指定された値が時刻の場合は「分」が 2 桁で表示
             される。Excel VBA の場合、「分」は nn で指定するが、試してみた
             ところ曜日が表示されてしまった。Value で日時を指定して試して
             みたが、「月」と「分」はちゃんと表示されるようである。
      mmm : Value で指定された値の「月」を、Jan、Feb、Mar、...の形式で
                表示する。
      dd : Value で指定された日付の「日」を 2 桁で表示する。
      hh : Value で指定された時刻の「時」を 2 桁で表示する。
      ss : Value で指定された時刻の「秒」を 2 桁で表示する。
      /、-、:、年、月、日、時、分、秒 : Value で指定された値の、年月日や
                                                 時分秒の区切り記号。
  
ヘルプの説明がわかり難い為、Excel VBA のFormat 関数を参考にして
実験した結果に基づいて、上記の内容を記載した為、正しいかどうか自信
はない。ほぼ、あっているとは思うが...