2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« 文字列中の異文字を16進表示する関数(VB.NET) | トップページ | MidA(文字列, 開始バイト位置, バイト長)関数を作る(VBA) »

2008年10月 1日 (水)

MidA(文字列, 開始バイト位置, バイト長)関数を作る(VBScript)

Mid(文字列, 開始文字位置, 文字長)でもなく、
MidB(バイト列, 開始バイト位置, バイト長)でもない、
MidA(文字列, 開始バイト位置, バイト長)関数。

Unicode文字列からシフトJISコードでの開始バイト位置とバイト長で切り出します。
当然、2バイト文字の泣き分かれの可能性があるので、その場合は、1バイト前や、1バイト短くなります。

まず、VBScriptで、

MsgBox MidA("abcdefg",3,2)
MsgBox MidA("あいうefg",3,2)
MsgBox MidA("あいうefg",3,3)
MsgBox MidA("aいうefg",3,2)
MsgBox MidA("aいうefg",3,3)

Function MidA(Str,bStart,bLength)
Dim aStart,aLength,bPosition,aPosition
aStart=0
aLength=-1
bPosition=1
For aPosition=1 To Len(Str)
  If aStart=0 Then
    If bStart=bPosition Then
      aStart=aPosition
    ElseIf bStart<bPosition Then
      aStart=aPosition-1
      bStart=bPosition-2
    End If
  Else
    If bStart+bLength=bPosition Then
      aLength=aPosition-aStart
      Exit For
    ElseIf bStart+bLength<bPosition Then
      aLength=aPosition-aStart-1
      bLength=bPosition-bStart-2
      Exit For
    End If
  End If
  bPosition=bPosition+1-(Asc(Mid(Str,aPosition,1))<0)
Next
If aStart Then
  If aLength=-1 Then
    aLength=aPosition-aStart
    bLength=bPosition-bStart
  End If
  MidA=Mid(Str,aStart,aLength)
End If
End Function

引数の位置と長さは、補正後の値を返すように、ByRefにしています。

« 文字列中の異文字を16進表示する関数(VB.NET) | トップページ | MidA(文字列, 開始バイト位置, バイト長)関数を作る(VBA) »