• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:こんにちは いつもお世話になっています)

エクセル2003で特定の文字列を削除する処理について

このQ&Aのポイント
  • エクセル2003を使って特定の文字列以降の文字列を削除する処理について質問します。具体的には、特定の文字列【@】と【変化】がバラバラに出てきますが、これらを一括で削除する方法を知りたいです。
  • 現在は置換機能を使って【@】と【変化】の後に「*」を付けて削除していますが、処理後にスペースが残ってしまい、自動調整ができません。どのようにしてスペースをつめることができるでしょうか。
  • または、別の方法で特定の文字列を一括で削除するマクロを紹介していただけると助かります。エクセル2003を使用しています。

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.10

 #8 DOUGLAS_ です。 >置換した部分を左クリックしたまま >カーソルで最終行まで選択できてしまう部分のこと >目で見る限りでは空白なのに、黒く反転表示される  #9 xls88 さんがお書きのように「改行文字」が挿入された状態かと存じます。  お示しの「記録マクロ」を Sub Macro1() Cells.Replace What:=Chr(10) & "【@】*", Replacement:="", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Range("L5").Select Cells.Replace What:=Chr(10) & "【変化】*", Replacement:="", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Cells.Replace What:="【@】*", Replacement:="", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Range("L5").Select Cells.Replace What:="【変化】*", Replacement:="", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End Sub のように書き直して、指定文字列の前に「改行文字」が入っている場合を先に置換しておくことで、問題が回避できるかと存じます。  ひょっとしたら、「Chr(10)」(vbLf、ライン フィード文字)以外にも、「目で見る限りでは空白」の文字というのがあるかも知れませんので、その数だけ「Chr(※)」を含む ステートメント の部分を付け加える必要があるかも知れません。  「Chr(10)」以外の場合については、例えば、「目で見る限りでは空白なのに、黒く反転表示される」セル を A1 とすると、 =CODE(A1) という式で、A1セル 内の 文字コード が取得できますので、その数字を「Chr(数字)」のように書いていけばOKです。

5goma
質問者

お礼

DOUGLAS 様 ありがとうございました。 お蔭様で解決しました。 改行文字とかChr関数とか勉強しなければなりませんが、とりあえず作業が前に進みます。 私の言葉足らずを補ってご理解頂き助かりました。 簡単で恐縮ですが、お礼申し上げます。

その他の回答 (9)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.9

>回答番号:No.3 この回答へのお礼 特定文字(【@】【変化】)のところで Alt+Enterでセル内改行されているのでは? セル範囲は限定した方が無難です。 Cellsだとシート全体のセルが処理対象になります。 下記で試してみてください。 とりあえず、全て特定文字の処で改行されている場合です。 Sub test1() With Range("B1:B10") .Replace What:=Chr(10) & "【*】*", Replacement:="", _ LookAt:=xlPart, SearchOrder:=xlByRows, _ MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End With End Sub あるいは Sub test2() With Range("B1:B10") .Replace What:=Chr(10) & "【@】*", Replacement:="", _ LookAt:=xlPart, SearchOrder:=xlByRows, _ MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False .Replace What:=Chr(10) & "【変化】*", Replacement:="", _ LookAt:=xlPart, SearchOrder:=xlByRows, _ MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End With End Sub

5goma
質問者

お礼

xls88 様 ありがとうございました。 重ね重ね言葉足らずで申し訳ありません。 PDICという辞書からのコピーしたデータなのですが、改行文字に気がつきませんでした。 特定文字の出現の仕方が不規則なせいか、せっかく教えていただいたコードがうまく働くところと、残ってしまうところとがありました。私の使い方が悪いのかもしれません。このコードでまた勉強させていただきます。 簡単で恐縮ですが、お礼申し上げます。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.8

1)置換後の文字列は空白にしているのですが、スペースが残ってしまいます。 2)つまり、処理後にエクセルの書式メニューから「行」-「自動調整」をしてもスペースをつめられない状態です。 3)どうすればスペースをつめられるでしょうか。  (2) の頭に「つまり」と書かれていますが、(1) と (2) とが同義とは思えません。  (1) に書かれている「スペース」というのは、もちろん「全角スペース」とか「半角スペース」というような「スペース」ですよね。  (2)・(3) に書かれている「スペース」というのは、どういう意味でしょうか?  「スペースをつめられない状態」とお書きですが、[書式(O)] - [行(R)] - [自動調整(A)] を実行しても、選択した範囲の セル 内の内容に応じて、行の高さが自動的に調節されるだけです。  具体的には、[書式(O)] - [行(R)] - [自動調整(A)] を実行した場合には、「セル の内容が1行内に納まる セル」と「何も入力されていない 空白セル」とは同じ高さ(実際には、標準フォント の約1.1倍の高さ:http://homepage2.nifty.com/zaco/xlgrd/page01.html#3)に調節されるはずです。  もし(3)にお書きの意味が、下記のような意味合いでしたら、補足願います。 ・空白セル のある行の高さを「0」にする ・空白セル のある列の幅を「0」にする

5goma
質問者

お礼

DOUGLAS 様 ありがとうございました。 言葉足らずでごめんなさい。 置換した部分を左クリックしたままカーソルで最終行まで選択できてしまう部分のことを言いたかったのです。目で見る限りでは空白なのに、黒く反転表示されるのがわからないんです。 これも表現がおかしいかもしれませんが、ご理解いただけるとありがたいです。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.7

例えばA列のA1セルから下方にデータがあるとします。 B1セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A1="","",IF(AND(COUNTIF(A1,"*【@】*")>0,COUNTIF(A1,"*【変化】*")>0),IF(FIND("【@】",A1)>FIND("【変化】",A1),LEFT(A1,FIND("【変化】",A1)-1),LEFT(A1,FIND("【@】",A1)-1)),IF(COUNTIF(A1,"*【@】*")>0,LEFT(A1,FIND("【@】",A1)-1),IF(COUNTIF(A1,"*【変化】*")>0,LEFT(A1,FIND("【変化】",A1)-1),A1)))) C1セルには次の式を入力して下方にオートフィルドラッグします。 =IF(B1<>"",COUNTIF(B$1:B1,"?*"),"") E列に空白の行を除いた答えの表を表示させるとしてE1セルには次の式を入力して下方にオートフィルドラッグします。 =IF(ROW(A1)>MAX(C:C),"",INDEX(B:B,MATCH(ROW(A1),C:C,0)))

5goma
質問者

お礼

KURUMITO 様 ありがとうございました。 詳しく教えていただいて助かりました。 とても勉強になりました。 簡単で恐縮ですが、お礼申し上げます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

No.4・5です! ごめんなさい。 ダブって投稿してしまいました。 どちらかは無視してください。m(__)m

5goma
質問者

お礼

tom04 様 ありがとうございました。 せっかく作っていただいたコードなんですが「型が一致しません」というエラーがでました。私の作動のさせ方が間違っているのかもしれません。 簡単で恐縮ですが、お礼申し上げます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

こんにちは! 無理やりって感じの方法です。 Sheet上のセルに空白が残っているとしての方法です。 ↓のコードをSheet見出し上で右クリック、 → コードの表示 を選択し コピー&ペーストしてマクロを実行してみてください。 Sub test() Dim i, j, k As Long Dim str, buf As String For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row For j = 1 To Cells(i, Columns.Count).End(xlToLeft).Column For k = 1 To Len(Cells(i, j)) str = Mid(Cells(i, j), k, 1) '↓のIF文内 前者のスペースは「半角スペース」・後者のスペースは「全角スペース」で入力 If str = " " Or str = " " Then str = "" '←続けて""を入力 End If buf = buf & str Next k Cells(i, j) = buf buf = "" Next j Next i End Sub 以上、お役に立てばよいのですが・・・m(__)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんにちは! お役に立てるかどうか判りませんが・・・ Sheet上には空白が残っている状態でのコードです Sheet見出し上で右クリック → コードの表示 を選択し ↓のコードをコピー&ペーストしてマクロを実行してみてください。 Sub test() Dim i, j, k As Long Dim str, buf As String For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row For j = 1 To Cells(i, Columns.Count).End(xlToLeft).Column For k = 1 To Len(Cells(i, j)) str = Mid(Cells(i, j), k, 1) '↓のIF文内 前者のスペースは「半角スペース」・後者のスペースは「全角スペース」で入力 If str = " " Or str = " " Then str = "" '←続けて""を入力 End If buf = buf & str Next k Cells(i, j) = buf buf = "" Next j Next i End Sub 以上、お役に立てばよいのですが、 ダメならごめんなさいね。m(__)m

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

1)他に、【@】と【変化】に類似する文字が無いのなら B列の対象セル範囲を選択 編集メニューの「置換」で 検索する文字列に、【*】 置換後の文字列に、何も入力せず空白のまま で「すべて置換」 これでスペースが残ることなく特定文字列を削除できます。 それでもスペースが残るようなら 置換後の文字列入力欄でBackSpaceキーを操作し、全く何もない状態を確認してください。 2)類似する文字があるのなら、【@】と【変化】個々に「置換」を行ってください。 B列の対象セル範囲を選択 編集メニューの「置換」で 検索する文字列に、【@】 置換後の文字列に、何も入力せず空白のまま で「すべて置換」 >二つの文字列に対して別々にやるようなので、記録マクロで一括で処理しています。 「新しいマクロの記録」で得られたコードがあるなら提示してみてください。

5goma
質問者

お礼

xls88 様 ありがとうございました。  言葉足らずで申し訳ありません。  記録マクロは以下の通りです。   Sub Macro1() Cells.Replace What:="【@】*", Replacement:="", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Range("L5").Select Cells.Replace What:="【変化】*", Replacement:="", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End Sub このマクロを実行後、「行」の自動調整をするのですが、最終行全部とその前の行(この行には検索をかけた特定文字列の直前の文字列がありますが)に表示上は空白ですがカーソルでなぞると反転表示され選択される部分が残ります。選択したまま削除すると「行」の自動調整が働いて空白部分がつまります。しかし、この削除処理をしないと自動調整がきかず空白のままなのです。この一行ちょっとのことを「スペース」と表現してしまいました。該当セルが多数のため手動での上記の処理は避けたいです。 この「スペース」を削除して自動調節を効かせる方法、あるいはマクロの手直しを教えていただけないでしょうか。

noname#192382
noname#192382
回答No.2

あなたのマクロの中で置換後の文字のところに空白でなく、NULL(なにも入力しない)に指定すればうまくいくと思います。

5goma
質問者

お礼

optimumsoup 様 ありがとうございました。  言葉足らずで申し訳ありません。  記録マクロは以下の通りです。   Sub Macro1() Cells.Replace What:="【@】*", Replacement:="", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Range("L5").Select Cells.Replace What:="【変化】*", Replacement:="", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End Sub このマクロを実行後、「行」の自動調整をするのですが、最終行全部とその前の行(この行には検索をかけた特定文字列の直前の文字列がありますが)に表示上は空白ですがカーソルでなぞると反転表示され選択される部分が残ります。選択したまま削除すると「行」の自動調整が働いて空白部分がつまります。しかし、この削除処理をしないと自動調整がきかず空白のままなのです。この一行ちょっとのことを「スペース」と表現してしまいました。該当セルが多数のため手動での上記の処理は避けたいです。 この「スペース」を削除して自動調節を効かせる方法、あるいはマクロの手直しを教えていただけないでしょうか。 NULLに指定する方法も教えていたけると助かります。一応ネットで調べたんですが・・・

noname#204879
noname#204879
回答No.1

「置換」でも「適当なマクロ」でもない別解です。 D1: =IF(ISERROR(FIND("【@】",A1)),1000,FIND("【@】",A1)) E1: =IF(ISERROR(FIND("【変化】",A1)),1000,FIND("【変化】",A1)) B1: =LEFT(A1,MIN(D1:E1)-1)

5goma
質問者

お礼

mike_g 様 ありがとうございました。 詳しく教えていただいて助かりました。 とても勉強になりました。 簡単で恐縮ですが、お礼申し上げます。

関連するQ&A