ゆるおたノート

Tomorrow is another day.

リーダブルコードへの旅 ~箇条書きを表にする~ ①目標と現状の確認

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

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

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

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

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

こんな感じのメモを表に変えることを想定しています。
このメモを表に変えたい。

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

少し修正してみました。
しかし道は険しそうです。。。
リーダブルコードへの旅 ~箇条書きを表にする②~ - ゆるおたノート

目指せ脱初心者。

連載目次

  1. 当記事リーダブルコードへの旅 ~箇条書きを表にする①~ - ゆるおたノート
  2. リーダブルコードへの旅 ~箇条書きを表にする②~ - ゆるおたノート
  3. リーダブルコードへの旅 ~箇条書きを表にする③~ - ゆるおたノート