タイトルも少しいつもと違う感じで。
リファレンスに挙げていたものですが、モジュールごとアップしていたので一覧としては長くなってしまったのと、少し書き直し(リファクタリング)したくなったのもあって、バージョン管理も兼ねて(?)独立してお送りします。
どこが変わったか、探しながら読んでみてください。
そしてカッコイイ方法をご存知の方!ぜひコメントなどで教えてください!!!
第一段階。コピペからなんとかモジュールへ。
まずは、現在の状態から。
こんな感じのメモを表に変えることを想定しています。
まぁ~「コロン」の使い方がバラバラなこと。
神経質人間なので表記ゆれがあるとイラッとしますw
実際の業務ではもっとちゃんとした内容のメモですが笑、空き時間にせこせこ頑張ってマクロを作り上げました。
が、結構長いのでセクションごとに分割して掲載します。
コピペコードの組み合わせなので、まだまだ分かりづらいところや不要なところもあるかもしれませんが、生暖かく見守っていただければと思います。
書いてみたコード
宣言セクション。列の設定。
Option Explicit '列名を指定しておく Enum eCol Inputs = 1 Output1 Output2 End Enum
メインの処理。大枠。
大枠とは言うものの、まだゴチャゴチャしてて。
条件分岐の部分でもう少しシンプルにできるかなと思います。
というわけで、今回のターゲット。←タイトルの意味。笑
Sub SplitOverviewStrings() '※A2に文字列をペーストして、順に下のセルへ文字列が入力されている場合 Const InputRow As Long = 2 Cells(InputRow, eCol.Inputs).Select Dim ThisSheet As Worksheet Set ThisSheet = ThisWorkbook.ActiveSheet '不要であれば消してok With ThisSheet.Cells .NumberFormatLocal = “@" .Font.Name = "Meiryo UI" .Font.Size = 10 End With Dim ListRowCounts AsLong Dim LastRow As Long ListCounts = ThisSheet.UsedRange.Rows.Count LastRow = ThisSheet.UsedRange.Rows(ListCounts).Row Dim CurrentRow As Long For CurrentRow = 2 To LastRow Dim ThisStr As String ThisStr = Cells(CurrentRow, eCol.Inputs).Value Dim SplitedStr As Variant '": "(全角コロン+全角スペース) If InStr(1, ThisStr, ": ") <> 0 Then SplitedStr = Split(ThisStr, ": ") Call outputStrings(SplitedStr, CurrentRow) '": "(全角+半角) ElseIf InStr(1, ThisStr, ": ") <> 0 Then SplitedStr = Split(ThisStr, ": ") Call outputStrings(SplitedStr, CurrentRow) '":"(全角) ElseIf InStr(1, ThisStr, ":") <> 0 Then SplitedStr = Split(ThisStr, ":") Call outputStrings(SplitedStr, CurrentRow) '": "(半角+全角) ElseIf InStr(1, ThisStr, ": ") <> 0 Then SplitedStr = Split(ThisStr, ": ") Call outputStrings(SplitedStr, CurrentRow) '": "(半角+半角) ElseIf InStr(1, ThisStr, ": ") <> 0 Then SplitedStr = Split(ThisStr, ": ") Call outputStrings(SplitedStr, CurrentRow) '":"(半角) ElseIf InStr(1, ThisStr, ":") <> 0 Then SplitedStr = Split(ThisStr, ":") Call outputStrings(SplitedStr, CurrentRow) ElseIf ThisStr = "" Then End If Next CurrentRow '後処理 Columns(eCol.Output1).AutoFit Columns(eCol.Output2).ColumnWidth = 12# Range(Columns(eCol.Output1), Columns(eCol.Output2)) _ .HorizontalAlignment = xlLeft End Sub
サブの処理。作業いくつか。
まだ1つのみです。今後、ここが増えていくと思います。
Sub outputStrings(ByVal SplitedStr As Variant, _ ByVal CurrentRow As Long) Dim OutputColsCounts As Long Dim SplitedCounts As Long '取得した配列数(文字列を区切った数)分、Output列へ順に出力 '※UBound(0)が配列の1つ目※ For SplitedCounts = 0 To UBound(SplitedStr) OutputColsCounts = eCol.Output1 + SplitedCounts Cells(CurrentRow, OutputColsCounts) = SplitedStr(SplitedCounts) Next End Sub
このシリーズについて
VBAの文法を勉強しながら、長~い処理をスッキリ書く方法を学んでいます。
間違い探しのほうが時間掛かってますが、果たして終わるのか…
次回をお楽しみにネ
それでは、次の記事をお待ちくださいませ~
(2018/05/30) 更新しました。
少し修正してみました。
しかし道は険しそうです。。。
リーダブルコードへの旅 ~箇条書きを表にする②~ - ゆるおたノート
目指せ脱初心者。