はもちくわ

コードについて自分なりの解釈を書いてます。

【ExcelVBA】文字列の中の2個以上繋がった空白を置き換える関数作ったよ!

今日、バイト先で少し余裕ができたので、自作のVBAシステムを見返してたんです。
このシステムは、もう稼働させてから2年ぐらい無事に動いていて、効率化にちゃんと貢献してくれている可愛いやつなんです。
でも、、、私自身は、がっつり肉体労働の現場作業員が本来の業務なので、業務と業務の空き時間の、短い間でコードを追加、修正をするという感じで維持管理してまして、、、
そんなもんだから、中身のコードは、コピペの同じ処理が多発する、手抜き増築だらけなんです(笑)
さすがに整理しないとやばいなと、ずっと思っていたのでいい機会だったんです。
とりあえず、一緒にできる処理は関数化しながら統合して、データベースとして使っているCSVデータも、コード同様に重複しているものが多いので削ってと、、、、すると、CSVデータの中に、なんかカンマ区切りが異様に長いものがあったんです。
これは意図していない空白、、、、う〜ん、デバッグ面倒だな、、、、と、恐る恐る原因を探ってみたところ、、、、、


ここで!突然ですが、みなさんに質問です。
Excelのセルに改行入れるとき、みなさんはどうやって入力しますか??

私はですね、Alt押しながらEnterします。
これが普通だと思ってました。

でも、、、違ったんです!
セルに折り返し表示設定してある場合、改行するまでスペースを入れると改行するんです!

おお、、、、こんな手もあるのか。。。。

教訓です!自分が普通と思っちゃダメ(笑)

話を戻しまして、、、
とまあ、不特定多数の誰かが、毎日作成する報告ファイルを自動読み込みし、データベースに追加する仕組みをシステムに入れていたので、この改行をするための空白が、がっつり入っていたというのが原因だったんです(笑)
じゃあ、空白消すかってなったわけです。
ああ、もちろん、Alt+Enterの改行は対策してました。CSVデータに改行が入り込むとレコードがくずれますからね。ちゃんと消さないと使い物にならないですから。

はい、それでは私が作った空白を置き換える関数のコードはこちら


Function space_cancel(moji as String) As String
'2個以上並んだスペースは中点に置き換える関数
Dim sp_n As Integer, sp As String, i As Integer

moji = Replace(moji," "," ")'全角スペースを半角スペースに置き換える

Do While InStr(moji,"  ") <> 0 '半角スペース2個が文字列になければ終わり
   sp_n = 1
   sp="  "'2個の半角スペースを入れる
   
   ’この下のループでスペースを1つずつ増やしながら
   'いくつ繋がったスペースがあるか照合する
   Do While InStr(moji, sp)<> 0
      sp_n = sp_n + 1 'スペースの数
      sp = sp & " "’スペースを1つ増やす
   Loop

   If sp_n > 1 then 'スペースカウントが1より大きいなら処理
      '前のループで作ったspのスペースから1つ半角スペースを消してもOK
      ’ここでは再度作ります
      sp = "" '変数リセット
      For i= 1 to sp_n
          sp = sp & " "'半角スペースを追加していく
      Next i
      
      '上のループで作ったスペースと中点を入れ替える
      moji = Replace(moji,sp,"・")
   End If

Loop'2個繋がったスペースがまだあれば繰り返す

space_cancel = moji

End Function

解説はコード内のコメントでみてください。
スペースはコード見てもわかりにくいですが、コメントのようになってます。
ここでは2個以上の空白があれば、中点に入れ替えてますが、消すなら消すでもいいですし、入れ替える文字を変えれば変更できます。アレンジしてみてはいかがでしょうか?
これを実行すると、「データ          データ2         データ3」みたいなデータは「データ・データ2・データ3」になります。空白がなくなるまでループしますので、空白がいくつかあってもなくなるまで動きます。
私の作ったシステムでは、このままCSVに保存しておいて、使うときにSplit(文字列,"・")で切り出して使ってます。ここでは書いてませんが、改行も中点に置き換えてますので、長いスペースも改行と同じとして使っているわけです。
あと、スペース1つの場合、私の扱っていたデータでは、区切りとして使われることがなく、データの中に入り込んでいるものも多数あったので、データとして生かしてました。

これ、わざわざ面倒な処理つくるより、作業する人に「セルの改行はAlt+Enterにしてよっ!」と、注意をするのも手段としてはありだとは思うのですが、、、、
業務効率化を目指したシステムとか自動化って、出来る限りユーザー側の作業方法、やり方は、変えないほうが効果が高いと思うんですよね。無理矢理やり方を変えてもらって、「すぐに慣れるから」、「楽になるから」、、、、と伝えたところで、、、結構ユーザー側にはストレスかかりますし、やっているうちに前の癖が出て同じことが起きます(笑)
間違えるやつが悪い、ルールを守れないやつが悪いって言っちゃえば楽チンですが、、、多分、一番考えなきゃいけないのは、「誰のための効率化なのか?」ってことじゃないかと思うわけです。

はは、、、、バイトが偉そうに何か言ってら(笑)、、、、と、まあ、私の勝手な持論ではあります。
あとね、私も含めてそうなのですが、何かミスしちゃったとき、「気をつけて作業しなさい」って注意されたりしません?
そんなとき、いつも思うんです。

「いやいや、気をつけてないわけないじゃん」って(笑)
多分、なんでミスが起こるのか?っていう原因をつぶすことをちゃんと考えるの方が大事だと思うんですよね。それと良く似てます。ユーザー側に注意して入力してって伝えても、何回かに1回はやっぱり間違えちゃいますよ。これはもうしょうがない!だって人間だもの(笑)

だからガードかけたり、入力補助いれたり、、、なるべくミスの原因を潰していくことを考えればいいんです!PCは命令すれば間違えませんから(笑)

おっと、いかんいかん、また明日早朝バイトだ(笑)睡眠時間が、、、、
それでは、ここまで読んでいただきありがとうございます。