プロが教えるわが家の防犯対策術!

例えば、"123あいう"と"4え5おか"という文字があるとします。
これを前から5バイト取得したい、ただし、5バイト目が漢字の1バイト目なら4バイトを取得したいのですが、漢字の1バイト目か2バイト目か簡単に判定する方法をご存知の方いらっしゃらないでしょうか?
よろしくお願い致します。

"123あいう"は、"123あ"と"いう"に、
"4え5おか"は、"4え5"と"おか"に分割したいということです。

A 回答 (3件)

5バイト取得という事でガチガチに作っていますが、


必要なら引数を調整して汎用的にして下さい。

Sub TEST()

Dim pos As Integer
Dim s As String

s = "123あいう"

pos = Left5(s)
Debug.Print StrConv(MidB$(StrConv(s, vbFromUnicode), 1, pos), vbUnicode), StrConv(MidB$(StrConv(s, vbFromUnicode), pos + 1), vbUnicode)

s = "4え5おか"
pos = Left5(s)
Debug.Print StrConv(MidB$(StrConv(s, vbFromUnicode), 1, pos), vbUnicode), StrConv(MidB$(StrConv(s, vbFromUnicode), pos + 1), vbUnicode)


End Sub


Function Left5(ByVal vstr As String) As Integer
'切る位置が全角文字の真中かどうか判定する
If Len(StrConv(LeftB(StrConv(vstr, vbFromUnicode), 5), vbUnicode)) _
= Len(StrConv(LeftB(StrConv(vstr, vbFromUnicode), 4), vbUnicode)) Then
'1バイト前で切ったときに文字数が変わらないのは切った位置が全角文字の後半であるので
'切り位置が正しいと判断する
Left5 = 5
Else '泣き別れのパターン
Left5 = 4
End If
End Function
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
私の質問の仕方が悪かったのか、意図したものとズレがありました・・・申し訳ないです。

お礼日時:2006/06/01 17:42

「(N+0)バイトの文字列の文字数」


「(N+1)バイトの文字列の文字数」

のそれぞれが

※等しい:文字の最中で切られた
※等しくない:文字の最中で切られていない

という判断ができます。


Sub Test()
  Debug.Print Left_ポジション補正("123あいう", 5)
  Debug.Print Left_ポジション補正("4え5おか", 5)
End Sub

Function Left_ポジション補正(ByVal p_strWk As String, ByVal p_Postion As Long) As String
  Dim l_strWk1  As String
  Dim l_strWk2  As String
  Dim l_lngMax  As Long
  
  '最大文字数を取得
  l_lngMax = LenByte(p_strWk)
  
  If (l_lngMax < p_Postion) Then
    '文字バイト数より多いなら、そのまま返却
    Left_ポジション補正 = p_strWk
  Else
    '入力のバイト数の文字を取得
    l_strWk1 = LefByte(p_strWk, p_Postion + 0)
    '入力のバイト数+1の文字を取得
    l_strWk2 = LefByte(p_strWk, p_Postion + 1)
    
    If Len(l_strWk1) = Len(l_strWk2) Then
      '[(N+0)バイト = (N+1)バイト]なら、文字最中でぶった切ったことになる
      Left_ポジション補正 = LefByte(p_strWk, p_Postion - 1)
    Else
      Left_ポジション補正 = l_strWk1
    End If
  End If
End Function

Function LefByte(ByVal p_String As String, ByVal p_Length As Long) As String
  LefByte = ConvUnicode(LeftB(ConvFromUnicode(p_String), p_Length))
End Function
Function LenByte(ByVal p_String As String) As Long
  LenByte = LenB(ConvFromUnicode(p_String))
End Function
Function ConvFromUnicode(ByVal p_String As String) As String
  ConvFromUnicode = StrConv(p_String, vbFromUnicode)
End Function
Function ConvUnicode(ByVal p_String As String) As String
  ConvUnicode = StrConv(p_String, vbUnicode)
End Function
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
私の質問の仕方が悪かったのか、意図したものとズレがありました・・・申し訳ないです。

お礼日時:2006/06/01 17:42

通常は、



? LeftH("123あいう", 4)
123
? LeftH("123あいう", 5)
123あ

と思いますが...

Public Function LenH(ByVal Text As String) As Integer
  LenH = LenB(StrConv(Text, vbFromUnicode))
End Function

Public Function LeftH(ByVal Text As String, ByVal L As Integer) As String
  Dim I As Integer
  Dim J As Integer
  Dim K As Integer
  
  J = Len(Text)
  For I = 1 To J
    If LenH(Left$(Text, I)) > L Then
      Exit For
    End If
    K = I
  Next I
  LeftH = Left$(Text, K)
End Function

もしかして、下のような結果を望んでいるのでしょうか?

? LeftH("123あいう", 1)
1
? LeftH("123あいう", 2)
12
? LeftH("123あいう", 3)
123
? LeftH("123あいう", 4)
123あ
? LeftH("123あいう", 5)
123あ
? LeftH("123あいう", 6)
123あい
? LeftH("123あいう", 7)
123あい

Public Function LeftH(ByVal Text As String, ByVal L As Integer) As String
  Dim I As Integer
  Dim J As Integer
  Dim K As Integer
  
  J = Len(Text)
  For I = 1 To J
    If Not (LenH(Left$(Text, I)) <= (L + 1) And Len(Left$(Text, I)) <= L) Then
      Exit For
    End If
    K = I
  Next I
  LeftH = Left$(Text, K)
End Function
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
私の質問の仕方が悪かったのか、意図したものとズレがありました・・・申し訳ないです。

お礼日時:2006/06/01 17:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!