ゆるおたノート

Tomorrow is another day.

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

コピペコードの修正に取り組んでいます。
かれこれ半月は悩んでいるのですが、少しずつアウトプットすることで頭を整理します。

第一段階はこちら。
yuru-wota.hateblo.jp

コンパイル・エラー…

いっけなーい!私、いまVBA2年生!
変数名も少し変えたりして可読性のアップに挑戦してみてるの!

おかげで少し読みやすくはなったんだけど、なんと今度はコンパイル・エラーが発生!!
頑張って書いたのに!どうして!?つまりコレは逆効果ってこと…?

でもね、苦労は買ってでもしなさいってばっちゃが言ってた
だからもっと頑張ってみるんだけど、わたしじゃどこまで続けられるかわからない!

こんなわたし、どうなっちゃうの~???

…というわけで、今回のコードはこちら↓。

本日の進捗。

宣言セクション

Option Explicit

    '列名を指定しておく
    Enum eCol
        Inputs = 1
        Output1
        Output2
    End Enum

    '※A2から下のセルへ文字列が入力されているとする。
    Const InputRow As Long = 2

少し細かく分けるために、入力セル(の行数)を定数化しちゃいます。

メインモジュール

操作を小分けにしてみます。

シートの設定
Sub setThisSheet()

    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
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
    End With

    Call splitOverviewStrings(ThisSheet)

End Sub
文字列を検索

まだまだ長い…

Private Sub searchStrings(ByRef ThisSheet As Worksheet)

    Dim ListRowCounts As Long
    Dim LastRow As Long
    ListRowCounts = ThisSheet.UsedRange.Rows.Count
    LastRow = ThisSheet.UsedRange.Rows(ListRowCounts).Row

    Dim CurrentRow As Long
    For CurrentRow = 2 To LastRow

        Dim ThisStr As String
        Dim SearchKey As String
        Dim hasSearchKey As Boolean
        ThisStr = Cells(CurrentRow, eCol.Inputs).Value
        hasSearchKey = InStr(1, ThisStr, SearchKey)
        
        Select Case SearchKey
            
            '全角コロン+全角スペース
            Case ": "

        Dim ThisStr As String
        Dim hasSearchKey As Boolean
        ThisStr = Cells(CurrentRow, eCol.Inputs).Value
        hasSearchKey = InStr(1, ThisStr, SearchKey)

                If hasSearchKey = True Then
                    Dim arrSplitedStr As Variant
                    arrSplitedStr = Split(ThisStr, SearchKey)
                    
                    Call outputStrArray(arrSplitedStr, CurrentRow)
                End If
                                
            '全角+半角
            Case ": "
                If hasSearchKey = True Then
                    Dim arrSplitedStr As Variant
                    arrSplitedStr = Split(ThisStr, SearchKey)
                    
                    Call outputStrArray(arrSplitedStr, CurrentRow)
                End If

            '全角コロンだけ
            Case ":"
                If hasSearchKey = True Then
                    Dim arrSplitedStr As Variant
                    arrSplitedStr = Split(ThisStr, SearchKey)
                    
                    Call outputStrArray(arrSplitedStr, CurrentRow)
                End If

            '半角+全角
            Case ": "
                If hasSearchKey = True Then
                    Dim arrSplitedStr As Variant
                    arrSplitedStr = Split(ThisStr, SearchKey)
                    
                    Call outputStrArray(arrSplitedStr, CurrentRow)
                End If

            '半角+半角
            Case ": "
                If hasSearchKey = True Then
                    Dim arrSplitedStr As Variant
                    arrSplitedStr = Split(ThisStr, SearchKey)
                    
                    Call outputStrArray(arrSplitedStr, CurrentRow)
                End If

            '半角コロンだけ
            Case ":"
                If hasSearchKey = True Then
                    Dim arrSplitedStr As Variant
                    arrSplitedStr = Split(ThisStr, SearchKey)
                    
                    Call outputStrArray(arrSplitedStr, CurrentRow)
                End If

        End Select

    Next CurrentRow
    
    Call formatThisSheet

End Sub
シートの後処理をする
Sub formatThisSheet()

    '後処理
    Dim ListColCounts As Long
    Dim LastCol As Long
    ListColCounts = ThisSheet.UsedRange.Columns.Count
    LastCol = ThisSheet.UsedRange.Columns(ListColCounts).Column

    Dim CurrentCol As Long
    For CurrentCol = 1 To LastCol
        ThisSheet.Cells.Columns(CurrentCol).AutoFit
    Next CurrentCol
    
    MsgBox "整理が完了しました。"
    
End Sub

サブ処理

配列をセルに出力

変数名を調整しました。

Function outputStrArray(ByVal arrSplitedStr As Variant, ByVal CurrentRow As Long)

    '取得した配列数(文字列を区切った数)分、Output列へ順に出力
    Dim SplitedCounts As Long
    For SplitedCounts = 0 To UBound(arrSplitedStr) 'UBound(0)が配列の1つ目※
        
        Dim OutputColCounts As Long
        OutputColCounts = eCol.Output1 + SplitedCounts
        Cells(CurrentRow, OutputColCounts) = arrSplitedStr(SplitedCounts)
    
    Next

End Function

結果と考察。

ここで、コンパイル・エラーが発生しました…Oh…

f:id:yuricks7:20180530005920p:plain

この辺の繰り返しが怪しそう。。。

If hasSearchKey = True Then
    Dim arrSplitedStr As Variant
    arrSplitedStr = Split(ThisStr, SearchKey)
                    
    Call outputStrArray(arrSplitedStr, CurrentRow)
End If

でも、そもそも文字列で対象は分岐するけど処理は同じ。
ってことは、これはまとめられそう…!回避できそう!

というわけで、次回はこのあたりで悩むと思います。
スペルミスが多くて悲しいですが、もう少し頑張ります。