• ベストアンサー

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

表-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
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA For Eachでセル内の文字列を一個ずつ取り出すには

    エクセル2000です。 たとえばA1セル内の文字列を一個ずつ取り出す場合、 Sub test01() For i = 1 To Len(Range("A1").Value) Cells(i, "B").Value = Range("A1").Characters(i, 1).Text Next End Sub このように最初から最後の文字まで何番目で指定することはわかるのですが、これをFor Each で回すにはどうしたらよいでしょうか? (⌒o⌒)? お教えください。 Sub test02() For Each ch In Range("A1").Characters i = i + 1 Cells(i, "B").Value = ch Next End Sub ではエラーになります。

  • 特定範囲のセルの最終文字1文字を削除

    よろしくお願いします。 Sheet1のJ26からJ56の、セルに入れた文字の最終文字1文字を 削除して表示したいのですが、下の構文で、 For Each r In Application.Selectionが黄色くエラー表示されます。 どこをどのように直せばよいのか解りません。 よろしくお願いします。 Private Sub CommandButton1_Click() Dim r As Range r = Worksheets("Sheet1").Range("J26:J56") For Each r In Application.Selection If Len(r.Value) > 0 Then r.Value = Left(r.Value, Len(r.Value) - 1) End If End Sub Next

  • エクセル2013 セル内の ( から右側を削除

    A列のセルにある文字列の中に ( が存在したら ( から右側を削除して左側だけをA列に表示したいのですが、 ( が存在するセルと存在しないセルがあります。 下記コードを現在使用していますが ( が存在しないとエラーになってしまうため エラーを回避するコードを教えてください。 宜しくお願い致します。 lastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 2 To lastRow r = Application.WorksheetFunction.Search("(", Range("A" & i), 1) k = Left(Range("A" & i).Value, r - 1) Range("A" & i).Value = k Next

  • セルに対してFor Each~In~Nextを使う

    セルに対してFor Each~In~Nextを使う事は出来ない? シートやブックに対してループする時は Sub aaa() Dim w As Worksheet For Each w In Worksheets MsgBox w.Name Next End Sub 等を使いますが、 A1に「あ」 A2に「い」 A3に「う」 が入っている場合、 Sub bbb() Dim i As Long For i = 1 To Range("a65536").End(xlUp).Row MsgBox Cells(i, 1) Next End Sub で、全ての値を取得できますが、 For~to~nextではなく セルに対してFor Each~In~Nextを使う方法があれば教えてください。 上記のように Dim w As Worksheetは宣言できますが Dim c As Workcellとはできませんでした。 なぜわざわざFor~to~nextでできる事をFor Each~In~Nextでやりたいかと言うと、 シートやブックはFor~to~nextでできるのに、セルはFor~to~nextができない理由を知りたいからです。 ご回答よろしくお願いします。

  • 結合セルのデータ消去でエラーになります。どのようにすればいいでしょうか?

    Range(”A1:A6”)にデータが入っていますが、そのうちA3、A4、A5セルは 結合されています。Range(”A1:A6”)のデータをクリアするために以下 コーディングをしましたが、結合セルの先頭でエラー(実行時エラー 1004)に なってしまいます。 結合セルのデータクリアはどのようにすればいいのでしょうか。 お分かりの方よろしくご教示ください。 Sub Sample() Dim i As Long For i = 1 To 6 Cells(i, 1).ClearContents Next i End Sub

  • 特定の文字を含まないセルの行を削除するには

    いつもお世話になっております。 特定の文字列(下記では"0610")を含まないセルの行を削除するプログラムを組むにはどのようにしたどのようにしたらよいのでしょうか。 以下のようなプログラムを組んでみました。 Sub test() Dim i As Long With Range("C1") For i = .CurrentRegion.Rows.Count To 1 Step -1 If .Offset(i, 0) <> "0610*" Then .Offset(i,0).EntireRow.Delete Next i End With End Sub しかしこれでは先頭行を残し全ての行が削除されてしまいます。 IF文の"<>"がうまくないのだと思いますが、Like演算子の反対のようなものはありませんでしょうか。ご教授いただければ幸いです。 *ちなみに上のプログラムは'06年10月以外のデータは削除するために作ったものです。

  • 空白のセルを行削除する。EXCELマクロなのですが・・

    VBA初心者です。 データーをHPから、単純にコピーしてきて、 EXCELに貼り付けています。 フィルターをかけても、画像かなにかがセルに張り付いているのか、 空白行をすべて削除できません。 いろいろ試して(HPから、空白セルの行削除について書かれてあるマクロを貼り付けて)動いたのが、このVBAです。 しかし、遅いので、早いVBAに簡略できればいいのですが。。 大体、1000行ぐらいの文字を貼り付けて、3/1ぐらいが空白行です。A行のセルの空白のみを、削除したいのですが。  まったくの素人なので、わかりません。 どうかよろしくお願いいたします。 Sub 空白の削除() x% = Worksheets("sheet1").Range("A65536").End(xlUp).Row For i = x% To 1 Step -1 If Worksheets("sheet1").Cells(i, 1).Value = "" Then Worksheets("sheet1").Rows(i).Delete Next End Sub

  • ある列の計算式が入っているセルの行のみを削除したい

    Excel2007でマクロを作成している超初心者です。 B列のセルには 空白 文字列 計算式が入っています。このうち計算式の入っているセルの行のみを削除したいのですが、どうしたらよろしいでしょうか?  セルには =IF(C17="","",+K17*L17)という式が入っています。 次式は0か空白の場合ですが、これをどのように修正したらできるでしょうか? Sub 行の削除() Dim i As Long For i = 1 To Selection.End(xlDown).Columns Step 1 Select Case Range("B" & i).Value Case 0, "" Columns(i).Delete End Select Next End Sub

  • セル内の値を消したら参照先セルを消す

    Excelのボタンクリックで下記コードにより上表のイニシャルがセル"B11:E13"に入力されるが下表の数字"B15"を消した場合、再度クリックしても入力されたイニシャルが消えないどんなコード入力をすれば良いのかどなたか解る方よろしくお願いします。 Sub 入力() Dim i As Long, j As Long On Error Resume Next For j = 2 To 5 For i = 1 To 3 Cells(i + 10, j) = WorksheetFunction.Index(Range("A1:A9"), WorksheetFunction.Match _ (i, Range(Cells(15, j), Cells(23, j)), False)) Next i Next j End Sub

  • VBA 文字列に関して

    現在 A22のセルに入力された文字列をボタンを押せば ばらばらにしてA22のセルから順番に入れるマクロを作りました (例)A22のセルに ”こんにちわ”の文字列が入っている場合 ボタン押下   ↓ A22のセル⇒こ B22のセル⇒ん C22のセル⇒に D22のセル⇒ち E22のセル⇒わ になる。 不思議なことに数字を16文字以上いれてボタンを押し文字を分離すると入力していない文字、数字が入ってしまいます。 数字だけこういう現象が発生してしまいます。 例えば "1111111111111111"と入力して文字を分離した場合 1.11111111111111E+15と個々のセルに格納されます。 原因がわかる方、教えて頂けないでしょうか? 以下がコードです。宜しくお願い致します。 Private Sub CommandButton1_Click()   Dim one As String   Dim myString As String   myString = Cells(22, 1)   numString = Len(Cells(22, 1))   If Len(myString) <= 50 Then    For i = 1 To Len(Range("A22").Value)      one = String(1, myString)      Cells(22, i) = one      myString = Replace(myString, one, "", 1, 1, vbTextCompare)    Next i   End If End Sub