2011年5月31日火曜日

文字列関数 (2)

文字列関数編、第二回。
  
Sub ExampleStringFunctions2()
       Dim objSheet As Object
       Dim objCell As Object

       Dim strText As String
       objSheet = ThisComponent.CurrentController.ActiveSheet
       '
       'Mid 関数 (1)
       objCell = objSheet.getCellRangeByName("A4")
       objCell.String = Mid("ABCDEFGHI", 2, 3)
       objCell = objSheet.getCellRangeByName("B4")
       objCell.String = Mid("ABCDEFGHI", 2, 3)
       objCell = objSheet.getCellRangeByName("C4")
       objCell.String = Mid("あいうえおかきくけこ", 3, 4)
       '
       'Mid 関数 (2)
       strText = "ABCDEFGHIJ"
       Mid(strText, 5, 2) = "xy"
       objCell = objSheet.getCellRangeByName("A5")
       objCell.String = strText
       '
       'Mid ステートメント (3)
       strText = "ABCDEFGHIJ"
       objCell = objSheet.getCellRangeByName("A6")
       Mid(strText, 5, 2, "いう")
       objCell.String = strText
       '
       'Mid ステートメント (4)
       strText = "ABCDEFGHIJ"
       objCell = objSheet.getCellRangeByName("A7")
       Mid strText, 5, 2, "はひ"
       objCell.String = strText
End Sub
  
上記マクロの実行結果は下図の通り :
  
1. Mid 関数
   指定した文字列より指定した部分を取り出す。書式は下記の通り :
  
      Mid(Text, StartPosition [, Length])
  
   Text には文字列、または、String 型の変数を指定する。
   StartPosition には取得したい文字列の開始位置を指定する。
   Length には取得したい文字列の文字数を指定する。省略可。省略した
   場合StartPosition から文字列の末尾までの文字列が取り出される。
   戻り値として、取り出された文字列が返される。
  
   以上が Calc のヘルプにも載っている Mid 関数の説明である。上記
   サンプルコードの「 Mid 関数 (1) 」の部分のコードである。
   以下は、サンプルコードの「 Mid 関数 (2) 」について。Calc のヘルプに
   は載っていないが、昔 Visual Basic で使った技なので、Calc Basic で
   試したところ、ちゃんと動いたので、以下、それについて述べる。
  
   Mid 関数を用いて、文字列の一部分を置き換えることができる。書式は
   下記の通り :
  
      Mid(TextStartPositionLength) = NewText
  
   この場合、文字列、または、文字列変数の Text のうち、StartPosition
   から Length で指定した文字数分だけ NewText で置き換わる。但し、
   NewText の文字数は、Length で指定した文字数以下でなければならない。
   後述の Mid ステートメントと同様の機能を、Mid 関数を用いて実現すること
   ができる (ようである、少なくとも現バージョンでは)。
  
2. Mid ステートメント
   指定した文字列の一部分を、他の文字列に置き換えるためのステートメント。
   書式は下記の通り :
  
      Mid(TextStartPositionLengthNewText)
  
   または、下記の記述もできるらしい :
  
      Mid TextStartPositionLengthNewText
  
   各引数は、上述のMid 関数と同様である。Text の一部分が NewText
   置き換わるが、NewText の文字数は Length を超えてはならない。

2011年5月30日月曜日

文字列関数 (1)

文字列関数について、第一回目。
  
Sub ExampleStringFunctions1()
       Dim objSheet As Object
       Dim objCell As Object

       objSheet = ThisComponent.CurrentController.ActiveSheet
       '
       'Len 関数
       objCell = objSheet.getCellRangeByName("A1")
       objCell.Value = Len("ABCDEFGHI")
       objCell = objSheet.getCellRangeByName("B1")
       objCell.Value = Len("ABCDEFGHI")
       objCell = objSheet.getCellRangeByName("C1")
       objCell.Value = Len("あいうえおかきくけこ")
      '
       'Left 関数
       objCell = objSheet.getCellRangeByName("A2")
       objCell.String = Left("ABCDEFGHI", 3)
       objCell = objSheet.getCellRangeByName("B2")
       objCell.String = Left("ABCDEFGHI", 3)
       objCell = objSheet.getCellRangeByName("C2")
       objCell.String = Left("あいうえおかきくけこ", 4)
       '
       'Right 関数
       objCell = objSheet.getCellRangeByName("A3")
       objCell.String = Right("ABCDEFGHI", 2)
       objCell = objSheet.getCellRangeByName("B3")
       objCell.String = Right("ABCDEFGHI", 2)
       objCell = objSheet.getCellRangeByName("C3")
       objCell.String = Right("あいうえおかきくけこ", 3)
End Sub
  
上記マクロの実行結果は下記の通り :
  
1. Len 関数
   引数で指定した文字列の文字数を取得する。書式き下記の通り :
  
      Len(Text)
  
   Text には文字列、または、String 型の変数を指定する。
   戻り値は、長整数型の数値で、文字数を返す。
   Calc のヘルプには、「変数の格納に必要なバイト数を返します」とある
   が意味がわからなかった為、参考文献 9) を参考にさせて頂いた。
   Excel の場合でいうと、下記のサンプルマクロの場合、セル "A1" には
   8 が代入される :
  
Sub test()
       Dim myval0
       Dim myVal1 As Double
       myval0 = 1
       myVal1 = myval0
       Range("A1").Value = Len(myVal1)
End Sub

  
   おそらく、Calc のヘルプも同じことを言わんとしているはずなので
   試してみたが、返ってくる値は 1 であった。変数に代入する値を
   1234 のように 4 桁にしてみたところ結果として 4 が返ってきたので、
   推測だが、Calc の場合は文字数が返ってくるようである。
  
2. Left 関数
   指定された文字列の左端から指定した文字数分の文字を返す関数。
   書式は、
  
      Left(Text, Length)
  
   Text には文字列、または、String 型の変数を指定する。
   Length には、取り出したい文字数を指定する。ゼロを指定した場合は
   空文字列が戻り値として返される。
   戻り値は、取り出した文字列が返される。
  
3. Right 関数
   指定された文字列の右端から指定した文字数分の文字を返す関数。
   書式は、
    
      Right(TextLength)
  
   Text には文字列、または、String 型の変数を指定する。
   Length には、取り出したい文字数を指定する。ゼロを指定した場合は
   空文字列が戻り値として返される。
   戻り値は、取り出した文字列が返される。

2011年5月29日日曜日

日付の計算

Excel の場合、DateAdd 関数や DateDiff 関数のように、日付の加算や
間隔を求める関数が準備されているが、Calc Basic の場合は、見当た
らない。

Excel のように高機能ではないが、日にち単位だけであれば、DateValue
関数を使用して、下記の通り、ユーザー定義関数を作ることができる :
  
Function  DateDiff(ByVal strDate1 As String, _
                                 ByVal strDate2 As String) As Long
       DateDiff = DateValue(strDate2) - DateValue(strDate1)
End Function
  
Function DateAdd(ByVal lngInterval As Long, _
                                 ByVal strDate As String) As String
       DateAdd = DateValue(strDate) + lngInterval
End Function
  
この関数を使って、下記プロシージャを実行すると、セル "A1" には -5、
セル "A2" には "2011/06/02" がそれぞれ代入される :
  
Sub ExampleFunctionTest()
       Dim objSheet As Object
       Dim objCell As Object

       objSheet = ThisComponent.CurrentController.ActiveSheet
       '
       objCell = objSheet.getCellRangeByName("A1")
       objCell.Value = DateDiff("2011/6/2", "2011/5/28")
       '
       objCell = objSheet.getCellRangeByName("A2")
       objCell.String = DateAdd(5, "2011/5/28")
End Sub

時刻の関数 (2)

時刻関連の関数の続き。
  
Sub ExampleTimeFunction2()
       Dim objSheet As Object
       Dim objCell As Object

       objSheet = ThisComponent.CurrentController.ActiveSheet
       '
       'TimeSerial 関数
       objCell = objSheet.getCellRangeByName("A1")
       objCell.String = "22:56:23のシリアル値 (1)"
       objCell = objSheet.getCellRangeByName("B1")
       objCell.Value = TimeSerial(22, 56, 23)

       '
       'TimeValue 関数
       objCell = objSheet.getCellRangeByName("A2")
       objCell.String = "22:56:23のシリアル値 (2)"
       objCell = objSheet.getCellRangeByName("B2")
       objCell.Value = DateValue("22:56:23")

End Sub
  
上記マクロの実行結果は下記の通り :
  
1. TimeSerial 関数
   引数に指定した時、分、秒の時刻のシリアル値を取得する。DateSerial

   関数と違い、特定の時刻を基準からの経過時間ではないので、値が
   一体何を意味するかは不明。但し、時刻間の時間計算には使用できる、
   とヘルプには書いてあるが、個人的には、意味不明な値を使うのには
   抵抗がある。
   それはさて置き、書式は下記の通りとなる :
        
      TimeSerial(HourMinuteSecond)
  
   Hour には時間を表す 0 ~ 23 の整数を指定する。
   Minute には分を表す 0 ~ 59 の整数を指定する。
   Second  も同様に、秒を表す 0 ~ 59 の整数を指定する。
   この関数の戻り値は、既述の通り、時刻のシリアル値を表す整数を返す。

  
   さて、この TimeSerial 関数について、ヘルプには、例として
    
      「12, -5, 45 は 11, 55, 45 と見なされます」
  
   との記述がある。意味がわからなかったので Excel の TimeSerial 関数の
   ヘルプを参照したら、どうやら、
  
      「12 時 5 分前 45 秒の TimeSerial 関数の値は、TimeSerial(11, 55, 45)
       と同じこと」
  
   ということを意味することが判明したので、実験してみると、
  
      「アクションは支援されません。無効なプロシージャーの呼び出し」
  
   というエラーメッセージが表示されてしまう (Excel は問題なく動作)。 
   結局、Calc では、TimeSerial 関数の引数としては上述の通りの値しか指定
   できないようである。
  
2. TimeValue 関数
   引数で指定した時刻文字列を日付のシリアル値に変換し戻り値として返す。
   書式は下記の通り :
  
      TimeValue(TimeString)
  
   TimeString には HH:MM:SS 形式の、時刻として妥当な文字列を指定する。
   この関数の戻り値も、既述の通り、時刻のシリアル値を表す整数を返す。

2011年5月28日土曜日

時刻の関数 (1)

Basicの時刻関連の関数を使用したサンプルコードを下記に記す :
  
Sub ExampleTimeFunction1()
       Dim objSheet As Object
       Dim objCell As Object
       objSheet = ThisComponent.CurrentController.ActiveSheet
       '
       'Now 関数
       objCell = objSheet.getCellRangeByName("A1")
       objCell.String = "現在の日時"
       objCell = objSheet.getCellRangeByName("B1")
       objCell.String = Now()
       objCell = objSheet.getCellRangeByName("C1")
       objCell.Value = Now()
       '
       'Time ステートメント
       objCell = objSheet.getCellRangeByName("A2")
       objCell.String = "現在の時刻"
       objCell = objSheet.getCellRangeByName("B2")
       objCell.String = Time
       objCell = objSheet.getCellRangeByName("C2")
       objCell.Value = Time
'
      'Hour 関数
       objCell = objSheet.getCellRangeByName("A3")
       objCell.String = "現在の時刻...「時」"
       objCell = objSheet.getCellRangeByName("B3")
       objCell.String = Hour(Now())
       '
       'Minute 関数
       objCell = objSheet.getCellRangeByName("A4")
       objCell.String = "現在の時刻...「分」"
       objCell = objSheet.getCellRangeByName("B4")
       objCell.String = Minute(Now())
       '
       'Second 関数
       objCell = objSheet.getCellRangeByName("A5")
       objCell.String = "現在の時刻...「秒」"
       objCell = objSheet.getCellRangeByName("B5")
       objCell.String = Second(Now())
End Sub
  
上記マクロの実行結果は下図の通りである :

  
各関数、及び、ステートメントについての説明は下記の通りである :
  
1. Now 関数
   現在のシステム日付、及び、時刻の値を取得する。
   書式は下記の通り :
  
      Now()
  
   戻り値として日時の値を返す。
   上記サンプルコードと結果からもわかるように、Now() の戻り値は、
   String 型の変数に代入するなど、文字列として日時の値を取得する
   場合は日付と時刻の文字列となり、Long 型の変数に代入するなど、
   数値として取得する場合は日時のシリアル値を取得することができる。
  
2. Time ステートメント
   現在の時刻を文字列として取得する。

   書式は下記の通り :
  
      変数 = Time
  
   変数 が String 型の場合、HH:MM:SS 形式の文字列として取得できる...
   とヘルプには記載されているが、上図からもわかるように、実際は
   HH:MM 形式の文字列となるようである。
   また、試しに、数値として取得しようとすると、時刻の数値しか取得
   できないようである。
   秒単位の値が必要な場合は、Time ステートメントよりも、Now 関数を
   使用した方が無難なように気がする。
  
3. Hour 関数
   書式は下記の通り :
  
      Hour(日時の値)
  
   ここで、引数で指定する 日時の値 は、日時のシリアル値、または、
   日時の文字列、或いは、時刻の文字列、いずれでも良いようである。
   戻り値は、引数で指定した日付の「時」を表す整数値を返す。
  
4. Minute 関数
   書式は下記の通り :
  
      Minute(日付の値)
  
   ここで、引数で指定する 日時の値 は、日時のシリアル値、または、
   日時の文字列、或いは、時刻の文字列、いずれでも良いようである。
   戻り値は、引数で指定した日付の「分」を表す整数値を返す。
  
5. Second 関数
   書式は下記の通り :
  
      Second(日付の値)
  
   ここで、引数で指定する 日時の値 は、日時のシリアル値、または、
   日時の文字列、或いは、時刻の文字列、いずれでも良いようである。
   戻り値は、引数で指定した日付の「秒」を表す整数値を返す。

2011年5月26日木曜日

日付の関数 (2)

前回に引き続き、日付関連の関数について。
  
Sub ExampleDateFunction2()
       Dim objSheet As Object
       Dim objCell As Object

       objSheet = ThisComponent.CurrentController.ActiveSheet
       '
       'DateSerial 関数
       objCell = objSheet.getCellRangeByName("A1")
       objCell.String = "2011/5/26のシリアル値 (1)"
       objCell = objSheet.getCellRangeByName("B1")
       objCell.Value = DateSerial(2011, 5, 26)
       '
       'DateValue 関数
       objCell = objSheet.getCellRangeByName("A2")
       objCell.String = "2011/5/26のシリアル値 (2)"
       objCell = objSheet.getCellRangeByName("B2")
       objCell.Value = DateValue("2011/5/26")
       '
       'WeekDay 関数
       objCell = objSheet.getCellRangeByName("A3")
       objCell.String = "2011/5/26の曜日"
       objCell = objSheet.getCellRangeByName("B3")
       Select Case WeekDay(DateValue("2011/5/26"))
              Case 1
                     objCell.String = "日曜日"
              Case 2
                     objCell.String = "月曜日"
              Case 3
                     objCell.String = "火曜日"
              Case 4
                     objCell.String = "水曜日"
              Case 5
                     objCell.String = "木曜日"
              Case 6
                     objCell.String = "金曜日"
              Case 7
                     objCell.String = "土曜日"
       End Select
End Sub
  
上記マクロの実行結果は下記の通り :
  
1. DateSerial 関数
   引数に指定した年、月、日の日付のシリアル値を取得する。ここで、
   日付のシリアル値とは、1899 年 12 月 30 日 を起点(ゼロ)とした経過
   日数を言う。例えば、1900 年 1 月 1 日のシリアル値は 2 となる。上記
   起点日以前の日付は負の整数が結果として返される。
   書式は下記の通り :
  
      DateSerial(Year, Month, Day)
  
   Year には年を表すゼロ以上の整数を指定する。0 ~ 99 の値を指定
   した場合は、1900 ~ 1999 と解釈される。それ以外の年については必ず
   4 桁の正の整数を指定すること。
   Month には月を表す 1 ~ 12 の整数を指定する。
   Day には日を表す 1 ~ 31 の整数を指定する。例えば二月の日付として
   30 をこの引数に指定してもエラーにはならない。
   この関数の戻り値は、既述の通り、日付のシリアル値を表す整数を返す。
  
2. DateValue 関数
   引数で指定した日付文字列を日付のシリアル値に変換し戻り値として返す。
   書式は下記の通り :
  
      DateValue(DateString)
  
   DateString には 1582 年 12 月 1 日から 9999 年 12 月 31 日までの間の
   日付を表す文字列を指定する。
   この関数の戻り値も、既述の通り、日付のシリアル値を表す整数を返す。
  
3. WeekDay 関数
   引数で指定した日付文字列、または、シリアル値を曜日を表す整数値に
   変換する関数。
   書式は下記の通り :
  
      WeekDay(DateSerial)
  
   DateSerial には日付文字列、または、日付のシリアル値を指定する。ヘルプ
   等には、シリアル値を指定する、と記述されているが、
    
      WeekDay("2011/5/26")
  
   と指定しても、同じ結果を得ることができる。
   戻り値は、1 ~ 7 の整数値を返す。サンプルコードにもあるように、各数値が
   表す曜日は下記の通り :
  
      1 : 日曜日
      2 : 月曜日
      3 : 火曜日
      4 : 水曜日
      5 : 木曜日
      6 : 金曜日
      7 : 土曜日