ゆるおたノート

Tomorrow is another day.

リーダブルコードへの旅 ~箇条書きを表にする①~

タイトルも少しいつもと違う感じで。

リファレンスに挙げていたものですが、
モジュールごとアップしていたので一覧としては長くなってしまったのと
少し書き直し(リファクタリング)したくなったのもあって、
バージョン管理も兼ねて(?)独立してお送りします。

どこが変わったか、探しながら読んでみてください。
そしてカッコイイ方法をご存知の方!ぜひコメントなどで教えてください!!!

第一段階。コピペからなんとかモジュールへ。

まずは、現在の状態から。

こんな感じのメモを表に変えることを想定しています。
f:id:yuricks7:20180529221906p:plain

まぁ~「コロン」の使い方がバラバラなこと。神経質なので表記ゆれがあるとイライラします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

次回をお楽しみにネ

それでは、次の記事をお待ちくださいませ~

(2018/05/30) 更新しました。

少し修正してみました。
しかし道は険しそうです。。。
yuru-wota.hateblo.jp

目指せ脱初心者。