こんにちは。お邪魔します。
まず、直接的な答えとしては、
【エラーの原因を排除する】
' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub Re8271442a()
Dim i, w
For i = 1 To 9
w = Range("A" & i)
Range("A" & i) = Mid(w, 2) '←この部分
Next
For i = 10 To 20
w = Range("A" & i)
Range("A" & i) = Mid(w, 2) '←この部分
Next
End Sub
' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ご提示のコードでの問題は
Right(w, Len(w) - 1)
の部分のRight()関数の第2引数には負数を指定することは出来ないということ。
Len(w)
が、0 である場合は
Len(w) - 1
が、-1 になってしまい。
Right()関数の引数エラーになります。
そこで、
「左1文字のみ削除」
というのを、
「文字列の2文字め以降を取り出す」
という風に解釈替えしたのが、
Mid(w, 2)
です。
Mid()関数は第3引数を省略すると、
文字列の第2引数文字め以降を取り出す、ように処理します。
For Each Next ループを使って総当たりにして、
うんとシンプルに、こんな風にも書けます。
【A1:A20 の セル範囲にあるセルを総当たりでループして】
【2文字め以降を取り出してセルに返す】
' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub Re8271442b()
Dim rng As Range
For Each rng In Range("A1:A20")
rng.Value = Mid(rng.Value, 2)
Next
End Sub
' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
もうひとつ解釈替えの例として
「セル範囲すべてをループして、空のセルでない場合は処理」
これを
「セル範囲の中で値(定数値)が設定されているセルだけをループして処理」
という方法が適している場面も良く見かけます。
' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub Re8271442c()
Dim w As Variant
Dim rng As Range
For Each rng In Range("A1:A9,A10:A20").SpecialCells(xlCellTypeConstants)
w = rng.Value
rng.Value = Mid(w, 2)
Next
End Sub
' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
因みに、
"A1:A9,A10:A20"
という書き方を敢えてしています。
これは、離れた(複数の領域を持つ)セル範囲であっても
機能することを暗示しているだけで、
"A1:A20"
に置き換えても、この場合はまったく同じ結果を返します。
.SpecialCells(xlCellTypeConstants)
と書いて、
セル範囲の中で、定数値が設定された(数式が設定されたセルと空のセルを除いた)セル範囲を指します。
この部分を書き換えて
.SpecialCells(xlCellTypeFormulas)
とすると、
セル範囲の中で、数式が設定された(定数値が設定されたセルと空のセルを除いた)セル範囲を指します。
/// 以上です。
お礼
有難うございます。大変助かり勉強になりました。