• ベストアンサー

マクロ Trim

A列に1500件ほどデータがあります。 左右、真ん中に余分なスペースがありそれを取りたいのですが、 Trim関数では左右の空白しか削除できません。 で、ググってみるとマクロを発見しました。以下です。 Sub 空白除去プログラム() Dim abc As Range ‘セルを定義 For Each abc In Selection abc = Trim(abc) ‘左右の空白を削除、「abc」を置き換える   Next End Sub 勉強不足で、セルを定義できません。A1:A1500を定義したいのですが どのように記述すればよいですか?また、このマクロに手を付け加えて、 今後、A1500以降にスペースを含む文字列が書かれたとき、 自動でスペースを削除するマクロに変更できますか? どなたかお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

#6 の回答者です。 訂正です。 >処理に時間がかかりましたが、 自分の使っているマクロにこだわりがあったので、うっかりしていました。私のミスでした。#6 のhige_082さんのコードのように、配列する方法のほうが速いと思います。それで、コードを作り直してみました。 一応、回答の後だしですから、1行だけでも、可能なようにしておきました。 '------------------------------------------- Sub SpaceErasing()   '5000行程度まで   Dim Ar As Variant   Dim i As Long   Dim buf As String   With ActiveSheet     Ar = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)) 'A1 =Cells(1, 1)     Ar = Application.Transpose(Ar)     If IsArray(Ar) Then       For i = LBound(Ar) To UBound(Ar)         If IsError(Ar(i)) = False Then           Ar(i) = Replace(Ar(i), Space(1), "", , , vbTextCompare)         End If       Next       Ar = Application.Transpose(Ar)       .Cells(1, 1).Resize(UBound(Ar)).Value = Ar 'A1     Else       .Cells(1, 1).Value = Replace(Ar, Space(1), "", , , vbTextCompare)     End If   End With End Sub

その他の回答 (6)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.6

回答は出てますが Splitを使用した方法を紹介しておきます と言うほどたいしたコードではありませんが..笑 Sub 空白除去プログラム_test() Dim abc As Variant Dim def As Variant Dim x As Long, y As Integer abc = Range("A1", Range("A65536").End(xlUp)) For x = 1 To UBound(abc) '半角空白除去 def = Split(abc(x, 1), " ") abc(x, 1) = "" For y = 0 To UBound(def) abc(x, 1) = abc(x, 1) & def(y) Next y '全角空白除去 def = Split(abc(x, 1), " ") abc(x, 1) = "" For y = 0 To UBound(def) abc(x, 1) = abc(x, 1) & def(y) Next y Next x Range("A1", "A" & UBound(abc)) = abc End Sub 配列を使用しているため、処理列(A列)には2行以上データが必要です 以上参考まで

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#3の回答者です。 >ありがとうございます。処理に時間がかかりましたが、 そうなんですね。処理がどうしても遅いのです。あれこれ考えたけれども、解決する手段がありません。全部が入っていないなら、 Const MYRNG As String = "A1:A1500" On Error Resume Next 'こう書き換えればよいのですが……。 Set rng = Range(MYRNG).SpecialCells(xlCellTypeConstants, 23) On Error Goto 0 Application.ScreenUpdating = False   For Each c In rng   なお、#4のimogasiさんのおっしゃるご指摘「スペースが見つからなくなるまで繰り返すほかない」は、私も別のVBAのテキストで同様の内容を読んだことがあります。 ワークシートとは違う挙動があります。私のコードは、一応、数年、いつも使っているものを元にして掲示しています。だから、Unicode スペースの削除も含まれています。いままで問題はありませんが、うまくないケースが存在するかもしれません。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

VB(VBA)のTrim関数は先頭と後尾のスペースしか取り除かないがよいの? A1:J1000を捉えるだけなら Range("A1:J1000").Select Selection.・・ でよいが。 真中のスペースはVB(A)の場合はセルの文字列に対し、InStr関数でで見つけ削除して繰り返し、スペースが見つからなくなるまで繰り返すほかないと思う。 ーーー あとエクセルVBAで編集ー置換の操作をして、マクロの記録を採るとかでコードはわかる。 検索する文字列 1スペース 置換後の文字列 何も入力しない 半角スペースと全角スペースは1度では置き換わらないかも知れない。簡単な1例でやって見ればわかる。 あとスペースではない、画面では見えない制御文字の存在は大丈夫かな。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 以下のコードのようにすると、Replace 関数は、全角・半角、両方が一度に削除できます。ChrW(160)は、Unicode スペースです。 >今後、A1500以降にスペースを含む文字列が書かれたとき、 >自動でスペースを削除するマクロに変更できますか? 自動的というのはやめたほうがよいかな?あえて書けないこともないけれども、ボタンを押したりして削除したほうが良いような気がします。 処理範囲としては、少し広すぎるかもしれません。 '------------------------------------------- '実際に私が使っているものを加工してみました。 'VBA.Trim と書く必要がないけれども、ワークシート関数と見分けるために見かけで付けています。 Sub SpaceErasing()   Dim strVal As String   Dim c As Range   Dim Rng As Range   Const MYRNG As String = "A1:A1500"   Application.ScreenUpdating = False   For Each c In Range(MYRNG)    strVal = Application.Clean(c.Value)    strVal = Application.Substitute(strVal, ChrW(160), "")    strVal = Replace(strVal, Space(1), "", , , 1)    c.Value = VBA.Trim(strVal)   Next   Application.ScreenUpdating = True End Sub

motty7777
質問者

お礼

ありがとうございます。処理に時間がかかりましたが、無事できました!!

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

> 左右、真ん中に余分なスペースがありそれを取りたいのですが 空白を消すだけなら、置換(Replace)を使用します > A1:A1500を定義したいのですが For Each ~ In ~ の使い方を調べましょう この場合は For Each abc In Range("A1:A1500") でA1:A1500の範囲を捜査します セルの値はRangeオブジェクトのValueを使用します abc.Value = Replace(abc.Value," ","") でabcの値から空白を削除してくれます 文字列を書いたときに自動でマクロを動かすには、イベントを使用します 調べてみませう

回答No.1

A列を選択して、Ctrl+Fで「検索と置換」画面を表示します。 「置換」タブで「検索する文字列」に「<スペース>」、「置換後の文字列」になにも入力しないいままで「すべて置換」を実行すれば、左右、真ん中のスペースが取り除かれます。

関連するQ&A

  • エクセル,マクロのTrimの使い方

    エクセル2000を使っているのですが,マクロの使い方がよくわかりません. コピーペーストしてきた大量の文字行列の先頭末尾に余分な空白があって正しくソートされません.そこで,Trimを使おうと思ったのですが,使い方がいまいちよくわからず,エラーが出て実行できません. また,重複した内容のセルを抽出・削除もしたいのです. どうぞ教えてくださいm(_ _)m

  • マクロについて

    マクロ初心者です。 下記の操作をマクロで行いたいのですがうまくいかないのでどうすればうまくマクロが作動するのか教えて頂ければと思います。4の操作までは正しく作動しましたが5以降に困っています。。。 どなたかお願いしますmm (1) A列にフィルターをかけて[??????}を含むものを選択 (2). 1に.該当するもB列のDataを値のみ数値と値のClear (3) 2の後に再びA列で[??????]を含まないものを選択 (4)  3に該当するA列のDataを数値と値のClear (5)  4の操作で空白となったセルに=上のセルという計算式の指示を出す (6) すべて値貼り付けをし、空白のセルを削除する ※Dataの行数は毎回作業時に変更があります。 ※Dataは数値だけではなく文字列も含んでいます 失敗したマクロ--------------------------------------------- Range("A2").Select Selection.AutoFilter Field:=1, Criteria1:="=*[??????]*", Operator:=xlAnd Columns("B:B").Select Selection.ClearContents Selection.AutoFilter Field:=1, Criteria1:="<>*[??????]*", Operator:=xlAnd Columns("A:A").Select Selection.ClearContents For i = 3 To [A65536].End(xlUp).Row If Cells(i, "A") = "" Then Cells(i - 1, "A").Copy Cells(i, "A") Next i End Sub -----------------------------------------------------------

  • マクロについて

    マクロ初心者です。 下記の操作をマクロで行いたいのですがうまくいかないのでどうすればうまくマクロが作動するのか教えて頂ければと思います。4の操作までは正しく作動しましたが5以降に困っています。。。 どなたかお願いしますmm (1) A列にフィルターをかけて[??????}を含むものを選択 (2). 1に.該当するもB列のDataを値のみ数値と値のClear (3) 2の後に再びA列で[??????]を含まないものを選択 (4)  3に該当するA列のDataを数値と値のClear (5)  4の操作で空白となったセルに=上のセルという計算式の指示を出す (6) すべて値貼り付けをし、空白のセルを削除する ※Dataの行数は毎回作業時に変更があります。 ※Dataは数値だけではなく文字列も含んでいます 失敗したマクロ--------------------------------------------- Range("A2").Select Selection.AutoFilter Field:=1, Criteria1:="=*[??????]*", Operator:=xlAnd Columns("B:B").Select Selection.ClearContents Selection.AutoFilter Field:=1, Criteria1:="<>*[??????]*", Operator:=xlAnd Columns("A:A").Select Selection.ClearContents For i = 3 To [A65536].End(xlUp).Row If Cells(i, "A") = "" Then Cells(i - 1, "A").Copy Cells(i, "A") Next i End Sub -----------------------------------------------------------

  • (VBA)Trimでエラーが発生するのは ?

    不要な空白(半角、全角)を削除して  テキストに書き出すマクロを作成しましたが下記のコードでエラーが出ます。  原因は何でしょうか ? Cells(I, "A").Value = Trim(Cells(I, "A").Value) I=2の時 エラー 1004 「アプリケーション定義またはオブジェクト定義のエラーです。」 ----------------------------------------------------- Option Explicit '空白は半角・全角ともに削除。 '空白が複数あった場合でもすべて削除。 '文字列間の空白は削除されない。 Sub Delete_Space_With_Save_Text() Dim I As Long Dim EndLow As Long EndLow = Cells(Rows.Count, "A").End(xlUp).Row 'ファイルを書き込みで開く(無ければ新規作成、あれば上書き) Open "C:\Users\Nobu\Desktop\My_text.txt" For Output As #1 For I = 1 To EndLow 'Cells(I, "B").Value = Len(Cells(I, "A").Value) Cells(I, "A").Value = Trim(Cells(I, "A").Value) 'MsgBox I & ": " & Cells(I, "A").Value Print #1, Cells(I, "A").Value Next '開いたファイルを閉じる Close #1 '終わったのが分かるようにメッセージを出す MsgBox "完了!" End Sub

  • エクセル関数=TRIM()ができません

    =TRIM()という関数を使って余分な空白の削除を行うのですがどうしても空白が取れません。 計算されるところまでは良いのですが、それをコピーし、値の貼付けをすると空白が入ってしまいます。何故でしょう。どうしたら空白が取れるのでしょう。教えて下さい。

  • エクセルVBAで空白セルを削除する方法

    みなさん教えてください。 今エクセルVBAで、下記のようにのA列に空白セルがある場合にそのセルを削除し、 空白セルが無い場合何もしないと言うマクロを作っています(下記のように自動記録し ました)。 しかし、作成したマクロは、下記のようにA列に空白セルがない場合はエラーが出てし まいます。 空白セルが無い場合エラーが出ない方法を教えて頂けないでしょうか。 よろしくお願いします。 <マクロ> Sub Macro1() Columns("A:A").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.SpecialCells(xlCellTypeBlanks).Select Application.CutCopyMode = False Selection.Delete Shift:=xlUp End Sub <データ> A --------- 1 2 1 1 1 3 4 ・ ・ ・ (以降約300行続きます)

  • EXCELのマクロで複数選択したとき

    選択したセルに一つ左側の文字列をふりがなとして表示させる方法をマクロで 簡単に実行させたいのですが複数のセルを選択するとエラーになってしまいます。 Sub test() Selection.Characters.PhoneticCharacters = Selection.Offset(0, -1) Selection.SetPhonetic Selection.Phonetics.Visible = True End Sub マクロはさきほど調べたばかりでほとんど理解できていません。おそらく2行目のSelection.Offset(0, -1)の部分がエラーの原因かと思うのですが下記のような表現ができるマクロを教えて下さい。 B1~B10を選択してるときマクロを実行するとA1~A10の文字列をB1~B10にふりがなの文字になる。 * B1にはA1、B2にはA2の文字列とがふりがなになるようにしたい。 マクロに詳しい方よろしくお願いします。

  • Excel2003 データの中身?(=TRIM)

    お世話になります。 表題の件で質問が御座います。 今、CSVで取り出したデータをExcelに変更したのですが 文字列の後ろに無駄にスペースが入っていたり、“見た目空白”のセルも 実はスペースが入っていたりで「Ctrl」+「方向キー」が 端っこまで行ってしまうので 「=TRIM」でスペースを消しました。 その後「TRIM」で抽出した値を元のセルに「値で貼り付け」をしたのですが そうすると なぜか 今まで右に寄ってた「数値」までもが左に寄り、表示形式を「通貨」にしても 数値として読み取ってくれてないようで「¥マーク」が付きません。。 そこで「質問(1)」なのですが、「TRIM」で取り出して元のセルに値で貼り付けると「文字列」になってしまうのでしょうか? 数値に見える文字列(?)のセルに「F2キー」で一旦カーソルを入れると きちんと数値になるようで 「¥マーク」が付きます。 が、しかし 1列2000行程のデータがあり、しかも 10列ほどに渡って同じような現象になってしまったので 全部で「20000セル」このような状況です。 「質問(2)」としましては関数か何かで一度に「数値風文字列(?)」を「数値」に変換する方法は御座いますでしょうか? どなたか ご存知の方、宜しくお願い致します。

  • エクセル2013 既存コードを用いて修正

    Clean関数をマクロに取り込みたいのですが 下記コードの Trim部分をCleanにしただけではダメでした。 どのようなコードを組んだら宜しいでしょうか? ご教示ください。 Sub Clean() Dim rng As Range For Each rng In Selection rng.Value = Trim(rng.Value) '←TrimをCleanにしただけではダメでした Next rng End Sub 実際は AからL列まで入力されています。 D列の最終入力セルを取得してB,E,F列をCleanにしたいです。 (AからLでも構いません) ブックはパスワードで保護されています。 データは8行目から入力されています。 (7行目は見出し)

  • エクセル2000マクロで行を削除したいのですが

    エクセル2000で、社員台帳から特定の人物だけ削除しようと思いマクロを 組んだのですが、どうもうまくいきません。 社員には全員00から99の2桁のコードがついています。(列Aにあります) 2桁のコードが00の人物だけ削除したいのですが。 次のようなマクロを組んだのですが、どこがおかしいのでしょうか? とりあえず、20行程度処理しようと思います。 Range("A2").Select For Each セル In Range("A2:A20") If セル = "00" Then Selection.EntireRow.Delete Next

専門家に質問してみよう