コピペコードの修正に取り組んでいます。
かれこれ半月は悩んでいるのですが、少しずつアウトプットすることで頭を整理しています。
第一段階はこちら。
リーダブルコードへの旅 ~箇条書きを表にする①~ - ゆるおたノート
本日の進捗。
宣言セクション
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) 更新しました。
コンパイルエラーと闘っています。
リーダブルコードへの旅 ~箇条書きを表にする③~ - ゆるおたノート
目指せ脱初心者。