5月も、今日で終わりですね。
先日、自宅マンションの廊下でコクワガタのオスを捕まえました。
今季初です。
去年捕まえたクワガタが産んだ卵もサナギになっています。
夏はもうすぐだな、と感じます。
今日のメルマガでは、マクロでの文字列データの整形について書きます。
というのは、ちょうど、以下のような問いあわせをいただいたので。
型式ごとに月別の購入データを作成する時に、元データを半角関数に整えてピボットで集計しています。
同じ商品でも微妙に抽出するエクセルシートで表記が違う場合があります。
プログラムで表記を整える(型式を統一)指示はできるのでしょうか?
数あり(例)データのabc-zとabcz、ABC-Zは同じ商品、bcd-zとbcdzとBCD-Zは同じ商品と言った具合に。
以下は、僕からした回答。(に、ちょっと編集+追記をしたもの)
こんにちは。
文字列の書式を整えるには。
いろんな関数がありますが、基礎編で登場する基本的なものに加えて、trim関数、strconv関数、replace関数を組み合わせればたいていなんとかなります。
以下のとおり。
Sub MojiretsuSample() Range("B2").Value = " AaBbCc−Dd " '←セルB2にテストデータ投入 '以下が本番 Dim st As String st = Range("B2").Value Debug.Print st Range("C2").Value = Trim(st) Range("D2").Value = StrConv(st, vbLowerCase + vbNarrow) Range("E2").Value = Replace(st, "−", "") Range("F2").Value = Trim(StrConv(st, vbLowerCase + vbNarrow)) Range("G2").Value = Trim(Replace(StrConv(st, vbLowerCase + vbNarrow), "-", "")) End Sub
複数行にあるデータを整形するには、上記に基礎編で学ぶFor Next構文を組み合わせます。
以下のとおり。
Sub MojiretsuSample_ForNext() Range("B2:B11").Value = " AaBbCc−Dd " '←セルB2:B11にテストデータ投入 '以下が本番 Dim st As String Dim gyo As Long For gyo = 2 To 11 st = Range("B" & gyo).Value Debug.Print st Range("C" & gyo).Value = Trim(st) Range("D" & gyo).Value = StrConv(st, vbLowerCase + vbNarrow) Range("E" & gyo).Value = Replace(st, "−", "") Range("F" & gyo).Value = Trim(StrConv(st, vbLowerCase + vbNarrow)) Range("G" & gyo).Value = Trim(Replace(StrConv(st, vbLowerCase + vbNarrow), "-", "")) Next End Sub
上記のサンプルでは以下のとおりに文字列を整形しました。
[1] 文字列前後のスペースを削除
[2] ハイフンは消す
[3] 全部小文字に
[4] 全部半角に
[3], [4]では、「全部大文字に」とか「全部全角に」といったことも可能です。
strconv関数でできることについては、Microsoftの公式ページで調べてみてください。
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/strconv-function
なお、
「エクセルに値が入ってしまっているから、マクロをガシガシ書いて修正する」というのも解決アプローチのひとつですが。
「入力フォームを用意し、データベース利用者がおかしな値を入れられないようにする」というのもこういう仕事では有力なアプローチです。
そのときは、エクセルマクロのフォーム機能を使います。
以下に動画デモがあります。
https://www.exvba.com/demo_formsample.php
☆この記事に関連する講座: