- ベストアンサー
セル範囲内値の一文字削除
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。お邪魔します。 まず、直接的な答えとしては、 【エラーの原因を排除する】 ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 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) とすると、 セル範囲の中で、数式が設定された(定数値が設定されたセルと空のセルを除いた)セル範囲を指します。 /// 以上です。
その他の回答 (1)
- n-jun
- ベストアンサー率33% (959/2873)
Sub 文字削除() Dim i, w For i = 1 To 20 w = Range("A" & i).Value If Len(w) > 0 Then Range("A" & i).Value = Right(w, Len(w) - 1) Next End Sub こんな感じかな? ⇒1~9と10~20に分ける事はないような。。。。?
お礼
ありがとうございます。勉強になりました。
お礼
有難うございます。大変助かり勉強になりました。