目次

Tips

 spreadsheetでマクロを定義したときに
 BASICコードでの記述という条件で便利
 なデバッグ手法を紹介しておきます。

 MsgBox活用

  デバッグモードでトレースするときには
  ブレークポイントを指定したり、参照で
  見たい変数値を選択してやらないと駄目。

  こういうのは面倒と感じたなら、MsgBoxを
  利用して、変数値を表示させます。

  マクロのコードは、次のように定義します。

Dim xidx As String
Dim yidx As String
Dim zidx As String

Dim xstr As String

Dim i As Byte
Dim i0 As Byte
Dim i1 As Byte
Dim i2 As Byte

Dim xcar As String
Dim xcdr As String

Sub MySplit()
  ' set pointer
  sidx = 2
  ' clear cells
  Sheets(sidx).Range("B2:I3").Value = ""
  ' loop
  For i=0 to 7
    ' set pointer
    Select Case i
      Case 1 : xidx = "B3"
               yidx = "B3"
               zidx = "C3"
      Case 2 : xidx = "C2"
               yidx = "D2"
               zidx = "E2"
      Case 3 : xidx = "C3"
               yidx = "D3"
               zidx = "E3"
      Case 4 : xidx = "D2"
               yidx = "F2"
               zidx = "G2"
      Case 5 : xidx = "D3"
               yidx = "F3"
               zidx = "G3"
      Case 6 : xidx = "E2"
               yidx = "H2"
               zidx = "I2"
      Case 7 : xidx = "E3"
               yidx = "H3"
               zidx = "I3"
      Case Else : xidx = "B2"
                  yidx = "B2"
                  zidx = "C2"
    End Case
    ' get context
    xstr = Range(xidx).Value
    ' split
    i0 = InStr(xstr,"rpm")
    i1 = InStr(xstr,"/")
    i2 = InStr(xstr,"deg")
    xcar = Left(xstr,i0-1)
    xcdr = Left(xstr,i1+1,i2-i1-1)
    ' debug
    MsgBox( xcar & chr(32) & xcdr )
    ' store
    Sheets(sidx).Range(yidx).Value = xcar
    Sheets(sidx).Range(zidx).Value = xcdr
  Next i
End Sub

 プロパティ活用

  セルには、数値、文字列、数式等のプロパティが
  用意されています。



  文字列をアクセスしたいとき、次のようにプロパティを
  指定すると、間違いなく処理できます。(Calcの場合)

Dim xstr As String

' set pointer
ptr0 = ThisComponent.Sheets(0).getCellByPosition(1,1)
' get context
xstr = ptr0.String

  Excelでは、Valueを利用。

Dim xidx As String
Dim xstr As String

' set pointer
xidx = "B2"
' get context
xstr = Range(xidx).Value

 文字列分離

  spreadsheetのセルに文字列が入っているときに
  特定文字列を利用して分離したい場合があります。

  関数のLeft、Mid、Right、InStrを利用して
  文字列を分離するのが定石。

  InStrは、便利な関数で、文字列の中に特定文字列が
  含まれているか否かを判定して、結果を整数で返す
  仕様になっています。

  パラメータ構成は、以下。

    InStr(start,string1,string2)

      start    検索開始位置(省略可能)
      string1  検索対象文字列
      string2  検索文字列

  関数InStrでは、検索文字列が存在しないときは
  0が返ってきます。存在すれば開始位置が返る
  ことになっていますが、それは1から。

  検索文字列の開始位置がわかれば、Left、Mid、Right
  の各関数を使い、必要な長さの文字列を切出しできる
  ようにできます。

  例えば、コンマを使った区切りでは
  次のコードで分離できます。

Dim xstr As String
Dim xcar As String
Dim xcdr As String

Dim xidx As Byte
Dim xlen As Byte

' store
xstr = "Hello,World!"
' which space
xidx = InStr(xstr,",")
xlen = len(xstr)
' split
xcar = Left(xstr,xidx-1)
xcdr = Mid(xstr,xidx+1,xlen-xidx-1)
' debug
MsgBox( xcar & Chr(32) & xcdr )

  検索文字列は、1文字でも2文字以上でもよいので
  InStr関数とlen関数を組み合わせて、分離するため
  の位置を求めればよいでしょう。

 文字列結合

  文字列を結合するには、「&」を利用。

  注意しないとならないのは、スペースが追加
  されることがあります。

  つぎのコードで調べるとよいでしょう。

Dim xstr As String
Dim xcar As String
Dim xcdr As String

' store
xcar = "Hello"
xcdr = "World !"
  ' debug
  MsgBox( xcar & Chr(32) & xcdr )
' concatenate
xstr = xcar & Chr(32) & xcdr
  ' debug
  MsgBox( xstr )

 英文字生成

  BASICでは、数値から文字を生成するには、2つの
  関数を利用できます。

  asc関数は、文字列を扱うと、先頭の1文字だけを
  chr関数は、1文字を生成。

  chr関数では、65から90を与えると、英大文字の'A'から'Z'を生成。
  48から57では、数字の'0'から'9'を生成。
  英小文字の場合、97から122を与えます。

  スペースは32、ダブルクオートは34のように
  数値を与えると対応する文字を出力します。

 区切り文字

  同じCalcでも、OpenOfficeとLibreOfficeでは
  区切り文字が異なります。

  OpenOffice  -> =IF(B2=1;0;1)
  LibreOffice -> =IF(B2=1,0,1)

  LibreOfficeは、Exelと同じで、コンマを区切り
  文字に使っています。

 マクロ変換

  CalcとExcelでは、利用しているBASICの仕様が異なります。
  また、関数のパラメータの区切り文字が異なります。
  どうやって、置き換えするのかを考えると、次のように
  すれば簡単。

  BASICコードだけを取り出して、テキストエディタで
  区切り文字を置換機能を使って置換後、クリップボード
  経由で書き戻します。


(under construction)

目次

inserted by FC2 system