• ベストアンサー

セル範囲内値の一文字削除

表-1のようにセル範囲A1:A9、A10:A20があり左1文字のみ削除し表-2のようにしたいのですが。 下記のコードでは空白セルにてどうしてもエラーが生じます。どなたか解る方よろしくお願いします。 Sub 文字削除() Dim i, w For i = 1 To 9 w = Range("A" & i) Range("A" & i) = Right(w, Len(w) - 1) '←この部分でエラー発生 Next For i = 10 To 20 w = Range("A" & i) Range("A" & i) = Right(w, Len(w) - 1) Next End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.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) とすると、 セル範囲の中で、数式が設定された(定数値が設定されたセルと空のセルを除いた)セル範囲を指します。 /// 以上です。

kuma0220
質問者

お礼

有難うございます。大変助かり勉強になりました。

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

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に分ける事はないような。。。。?

kuma0220
質問者

お礼

ありがとうございます。勉強になりました。