ゆるおたノート

Tomorrow is another day.

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

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

第一段階はこちら。
リーダブルコードへの旅 ~箇条書きを表にする①~ - ゆるおたノート

本日の進捗。

宣言セクション

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…

コンパイル・エラーが発生…

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

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

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

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

このシリーズについて

VBAの文法を勉強しながら、長~い処理をスッキリ書く方法を学んでいます。
間違い探しのほうが時間掛かってますが、果たして終わるのか…

次回予告。

私、いまVBA2年生!
変数名も少し変えたりして可読性のアップに挑戦してみてるの!
おかげでほーーーんの少しだけ読みやすくなったよ!

…って、いっけなーい!
なんと今度はコンパイル・エラーが発生!!😨
頑張って書いたのに!なんで!?どうして!?
つまりコレは逆効果ってこと???😫

ここまでが今日のできごと。ちょっとヘコむよね…
でもね、「苦労は買ってでもしなさい」ってばっちゃが言ってた
だからもうちょっと頑張ってみるね!
そうは言っても、わたしじゃどこまで続けられるかわからない!

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

(2018/06/02) 更新しました。

コンパイルエラーと闘っています。
リーダブルコードへの旅 ~箇条書きを表にする③~ - ゆるおたノート

目指せ脱初心者。

連載目次

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