大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで全角と半角を判断して文字列を切り出す方法についてご紹介します。LeftB、RightB、MidBとStrConvを組み合わせることで全角は2バイト、半角は1バイトで切り出すことができます。

はじめに

この記事では文字列を全角を2バイト、半角を1バイトとして切り出す方法についてご紹介します。

文字列がコンマ区切りや半角スペース区切りではなく、文字の長さで構成されているテキストデータを切り出したいといった場合に使えるVBAコードです。

なかなかそんな文字列を扱う機会はないかと思いますので、全角を2バイトで半角は1バイトで切り出す方法がVBAでもあるということだけ覚えておけばいいかと思います。

この記事で紹介すること

  • 全角を2バイト、半角を1バイトとして文字列を切り出す方法

目次から見たい項目へ移動すると便利ですよ。

目次

VBAコードまとめ

全角と半角を区別して切り出すVBAコードについて、まとめています。

VBAコードのみ確認したい場合に、ご活用ください。

'左から4バイト切り出す
Debug.Print StrConv(LeftB(StrConv("あいうえお", vbFromUnicode), 4), vbUnicode)

'右から5バイト切り出す
Debug.Print StrConv(RightB(StrConv("あいう123", vbFromUnicode), 5), vbUnicode)

'3バイト目から、5バイト切り出す
Debug.Print StrConv(MidB(StrConv("あいう123", vbFromUnicode), 3, 5), vbUnicode)

では、解説していきます。

全角を2バイト、半角を1バイトで左から文字列を切り取る(LeftB)

はじめに話しておくと『LeftB』だけでは全角を2バイト、半角を1バイトとして左から切り出せません。

『LeftB』と『StrConv』を組み合わせるとできます。

『LeftB』はバイト数分の文字列を左から切り出すVBA関数です。

『StrConv』は文字列を変換するVBA関数です。

LeftBだけではできない

『LeftB』は全角も半角も2バイトとして認識してしまいます。

なので『LeftB』だけでは全角は2バイト、半角は1バイトで切り出すことはできません。

たとえば全角文字列『あいうえお』を『LeftB』で『4バイト』切り出してみます。

Sub TEST1()
    
  '全角の文字列を左から4バイト切り出す
  MsgBox LeftB("あいうえお", 4)
      
End Sub

実行した結果です。

LeftBで全角を4バイト切り出し

LeftBで全角を4バイト切り出した結果

2文字が切り出されます。

次に半角文字列『12345』を同じように『LeftB』で『4バイト』切り出してみます。

Sub TEST2()
  
  '半角の文字列を左から4バイト切り出す
  MsgBox LeftB("12345", 4)
      
End Sub

実行した結果です。

LeftBで半角を4バイト切り出し

LeftBで半角を4バイト切り出した結果

半角でも同じで2文字切り出されました。

ほしいのは『1234』なんですよね。

解決策

解決策です。

『LeftB』と『StrConv』を組み合わせます。

Sub TEST3()
  
  Dim A, B
  
  '文字コードをShift-JISへ変換
  'これで全角を2バイト、半角を1バイトとして認識できます
  A = StrConv("12345", vbFromUnicode)
  
  '左から4バイト切り出す
  B = LeftB(A, 4) '←ここまでは文字化けしてVBAで認識できません
  
  '文字コードを元に戻す
  MsgBox StrConv(B, vbUnicode)  '←ここでVBAで認識できるようになります
    
End Sub

ではVBAコードを実行してみます。

半角の文字列『12345』から4バイト切り出してみます。

LeftBとStrConvの組み合わせ

半角を1バイトとして左から4バイト分切り出した結果

『1234』の4文字を切り出すことができました。

半角:1バイト×4=4バイトを切り出せました。

ちゃんと半角は1バイトとして切り出すことができていますね。

解説

VBAの手順はこちらです。

  • ①文字コードをUnicode⇒Shift-JISへ変換
  • ②LeftBで好きなバイト数を左から切り出し
  • ③文字コードをShift-JIS⇒Unicodeへ戻す

という流れです。

手順①

文字コードをUnicodeからShift-JISへ変換することで全角を2バイト、半角を1バイトとして認識することができます。

こんなイメージです。

全角2バイト、半角1バイト

難しいことは考えず文字列を『StrConv(文字列, vbFromUnicode)』で変換すれば全角を2バイト、半角を1バイトで認識することができると理解すればいいかと思います。

手順②

文字コードをStrConvで変換したので全角を2バイト、半角を1バイトで切り出すことができます。

ここでは左から4バイト切り出すということで『LeftB(文字列, 4)』としています。

全角2バイト、半角1バイトで4バイト切り出す

手順③

この段階までは文字化けしてしまっているので、VBAが認識できる文字コードに戻してあげます『StrConv(文字列, vbUnicode)』。

Unicodeに戻す

これで全角を2バイト、半角を1バイトとして切り出すことができます。

全角でも試してみる

こちらのコードを全角の文字列で試してみます。

全角の文字列『あいうえお』を左から4バイトを切り出すVBAコードです。

Sub TEST4()
  
  Dim A, B
  
  '文字コードをShift-JISへ変換
  A = StrConv("あいうえお", vbFromUnicode)
  
  '左から4バイト切り出す
  B = LeftB(A, 4)
  
  '文字コードを戻す
  MsgBox StrConv(B, vbUnicode)
  
  MsgBox c
  
End Sub

実行結果です。

全角を4バイト左から切り出し

全角文字列を4バイト左から切り出した結果

『あい』となり、全角を2文字だけ切り出せました。

全角を2バイトとして2バイト×2=4バイト切り出せています。

ちゃんと全角は2バイトとして認識されてますね。

全角をShift-JISへ変換したイメージです。

Shift-JISへ変換

全角をShift-JISへ変換

全角では元々2バイトで認識できますのでバイト数に変化はないです。

これから4バイト切り出すとこのような形です。

4バイト切り出し

全角を2バイトとして4バイト切り出す

もちろんこのままでは文字化けしているので最後に『Unicode』へ戻してあげます。

Unicodeへ戻す

Unicodeに戻す

これで全角を2バイトとして4バイトが切り出せるということになります。

全角と半角を混ぜてみる

全角と半角を混ぜた文字列で試してみます。

Sub TEST5()
  
  Dim A, B
  
  '文字コードをShift-JISへ変換
  A = StrConv("あ123い", vbFromUnicode)
  
  '左から4バイト切り出す
  B = LeftB(A, 4)
  
  '文字コードを元に戻す
  MsgBox StrConv(B, vbUnicode)
    
End Sub

全角を2バイト、半角を1バイトとして4バイトの文字列を抜き出すVBAコードになっています。

実行した結果です。

全角と半角を混ぜた文字列で4バイト切り出し

全角と半角を混ぜた文字列で4バイト切り出し

3文字切り出せました。

全角が1つと半角が2つで、2バイト×1+1バイト×2=4バイト切り出せています。

ちゃんと全角は2バイト、半角は1バイトで切り出せていますね。

『あ123い』をShift-JISへ変換したイメージです。

Shift-JISへ変換

全角と半角を混ぜた文字列をShift-JISへ変換したイメージ

これから4バイトを切り出すと次のようになります。

4バイト切り出し

全角と半角を混ぜた文字列で4バイトを切り出す

文字化けしているのでUnicodeへ戻してあげます。

Unicodeへ戻す

Unicodeへ戻す)imp-mix4

これで全角は2バイト、半角は1バイトとして4バイト分の文字列『あ12』が切り出せます。

使う場面

全角を2バイト、半角を1バイトで切り出す場面なんてあまりないと思います。

使う必要が出てきたのが次のような文字列を切り出す場合です。

全角を2バイト、半角を1バイトで切り出す場面

全角を2バイト、半角を1バイトで切り出す場面

コンマとか半角スペースで区切ってくれればいいのに文字の長さでデータを作っているんですね。

これは全角は2バイト、半角は1バイトとしてきれいに長さを整えて作られているテキストデータです。

昔のソフトではこんな感じで全角と半角のバイト数を区別して長さを整えてテキストデータを作成していたりしているものもあります。

こんなテキストデータから一つ一つのデータを切り出したい場合に全角は2バイト、半角は1バイトで切り出す方法が使えます。

なかなかこんな文字列を切り出す場面に出くわすことはありませんが、とりあえず全角は2バイト、半角は1バイトで切り出す方法があるということだけ覚えておけばいいかと思います。

右から切り出す場合(RightB)

全角は2バイト、半角は1バイトで右から切り出す方法についても記載しておきます。

右から切り出す場合は『RightB』と『StrConv』を組み合わせます。

左から切り出す方法と手順は同じで『LenB』を『RightB』に変えればできます。

これでわかる場合は特に見る必要はありません。

VBAコード

全角を2バイト、半角を1バイトとして文字列を右から切り出すVBAコードです。

Sub TEST6()
  
  Dim A, B
  
  '文字コードをShift-JISへ変換
  A = StrConv("あいう123", vbFromUnicode)
  
  '右から5バイト切り出す
  B = RightB(A, 5)
  
  '文字コードを元に戻す
  MsgBox StrConv(B, vbUnicode)
    
End Sub

こちらのVBAコードは右から5バイト切り出すコードになっています。

手順は同じで、次のようになります。

  • ①文字コードをUnicode⇒Shift-JISへ変換
  • ②RightBで好きなバイト数を右から切り出し
  • ③文字コードをShift-JIS⇒Unicodeへ戻す

右から切り出すので『RightB』でできます。

結果

全角と半角を混ぜた文字列『あいう123』を右から5バイト切り出してみます。

RightBとStrConvの組み合わせ

全角と半角を混ぜた文字列の右から5バイト切り出した結果

『う123』が切り出せました。

全角×1+半角×3=2バイト×1+1バイト×3=5バイトが切り出せています。

中間を切り出す場合(MidB)

全角は2バイト、半角は1バイトとして文字列の中間を切り出す方法についても記載しておきます。

文字列の中間を切り出す場合は『MidB』と『StrConv』を組み合わせます。

左から切り出す方法と手順は同じで『LenB』を『MidB』に変えればできますのでこちらも参考までに記載しておきます。

VBAコード

全角を2バイト、半角を1バイトとして文字列の中間を切り出すVBAコードです。

Sub TEST7()
  
  Dim A, B
  
  '文字コードをShift-JISへ変換
  A = StrConv("あいう123", vbFromUnicode)
  
  '3バイト目から、5バイト切り出す
  B = MidB(A, 3, 5)
  
  '文字コードを元に戻す
  MsgBox StrConv(B, vbUnicode)
  
End Sub

こちらのVBAコードの中間を5バイト切り出すコードになっています。

手順は同じで、次のようになります。

  • ①文字コードをUnicode⇒Shift-JISへ変換
  • ②MidBで好きなバイト数分だけ中間を切り出し
  • ③文字コードをShift-JIS⇒Unicodeへ戻す

中間を切り出すので『MidB』でできます。

結果

全角と半角を混ぜた文字列『あいう123』を左の3バイト目から5バイト切り出してみます。

MidBとStrConvの組み合わせ

全角と半角を混ぜた文字列の中間を5バイト切り出した結果

『いう1』が切り出せました。

全角×2+半角×1=2バイト×2+1バイト×1=5バイトが切り出せています。

やり方は他の方法と同じです。

おわりに

この記事では文字列を全角を2バイト、半角を1バイトとして切り出す方法についてご紹介しました。

文字列が文字の長さで構成されているテキストデータの場合に使えるVBAコードです。

なかなかそんな文字列を扱う機会はないかと思いますので、全角を2バイトで半角は1バイトで切り出す方法がVBAでもあるということだけ覚えておけばいいかと思います。

参考になればと思います。最後までご覧くださいましてありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す