質問: "-" End If Next End Sub ``` ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/4325bee1bf175ea1875ea87daaf7e3ab.png) どなたかご教授願います。
回答: ynakanoさんの置換する方法は、今回やりたいことにマッチしており、かつシンプルでいい案だと思います。 私からは技術的なアドバイスとして、指定範囲のループを簡潔に記述する方法、という観点で提示いただいたソースコードの改良案を提案させていただきます。 動的な範囲選択 まず、動的な範囲選択についてですが、最終行を調べる`.End(xlUp).Row`はもう実装されているようですので、行方向への動的な範囲選択はできています。 もし列方向に対しても動的に範囲が変更されるようでしたら、例えば`Cells(2, Columns.Count).End(xlToLeft).Column`とすることで2行目の最終列が取得できます。 ループ処理のアドバイス1 提示いただいたサンプルコードで「非効率」と思われている箇所は、ほぼ同じ内容のループ処理を何度も繰り返している部分ですよね。 確かに見た目にも美しくありませんし、ちょっと変更したいとき(例えば""だけでなく" "も変換したいとき)にたくさんの箇所に同じ修正が必要になってしまいます。 各ループ処理の中では、列番号の部分だけが2,3,4,5と変更されているだけですので、これもループ変数にしてしまえば記述をまとめることができます。 サンプルソース1 ``` Sub test() Dim C_MaxRow As Long 'C列の最終行 Dim iCol As Long Dim iRow As Long 'C列最終行を取得 C_MaxRow = Cells(Rows.Count, 3).End(xlUp).Row For iCol = 2 To 5 'B~E列をループ処理 For iRow = 3 To C_MaxRow '3行目~C列最終データ行をループ処理 If Cells(iRow, viColumn).Value <> "" Then 'データーがある場合は、何もしない。 Else Cells(iRow, viColumn).Value = "-" End If Next Next End Sub ``` ループ処理のアドバイス2 アドバイス1でも問題はありませんが、自分がVBAで選択範囲のループ処理を行うのなら以下のような記述にします。 サンプルソース2 ``` Sub test() Dim C_MaxRow As Long 'C列の最終行 'C列最終行を取得 C_MaxRow = Cells(Rows.Count, "C").End(xlUp).Row Dim rngArea As Range '対象範囲 Set rngArea = Range(Cells(3, "B"), Cells(C_MaxRow, "E")) 'ここではB~E列の3行目~C列最終データ行の範囲としています。 Dim rng As Variant '範囲内のセルを格納する変数 For Each rng In rngArea If rng.Value <> "" Then 'データーがある場合は、何もしない。 Else rng.Value = "-" End If Next End Sub ``` `For Each ~ In 対象範囲`のようなループ処理を記述することで、その範囲内のすべてのセルを1つずつ取り出すことができます。 目的からいってもこのほうが分かりやすい記述になると思います。 どちらを使っても(またはynakanoさんの案のような別の方法を使っても)、今回は同じ結果が得られると思います。 好みに応じて、また今後のメンテナンス性も考えて、一番使いやすいものを選択されればよいでしょう。 参考になれば幸いです。