エクセルの変換機能 置き換えでセル内の不要な文字を削除しているが時間がかかってしまう。
ある立列セル内で 後半の不要な文字をとってしまいたい。
そのような場合が50以上あるがかなりマクロでも時間がかかってしまう。早くする方法はないものか。
結果として商品名だけにしたい。
セル内は 「商品名 何個(数量)」
結果として「商品名」だけにしたい。
(商品名の次 スペースがない場合もある・)
'
Columns("D:D").Select
Selection.Replace What:="1個", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="2個", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="3個", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="4個", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="0.5個", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
・・・・・・
・・・・・・・
・・・・・・
Selection.Replace What:="6g", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="7g", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End Sub
いい方法はないものでしょうか ご教授ください。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>(商品名の次 スペースがない場合もある・)
この条件が無ければ、自分なら「区切り位置」機能を使って商品名と数量を切り分けるんだけどなあ。
・・・
てことで、とりあえず「区切り位置」で「スペース」を区切り文字に指定して、商品名と数量を切り分けてしまいましょう。
でもって商品名の列だけを採用。
例外的にスペースで区切られていないものは手作業で修正。
それで良いと思うんだけど、ダメ?
銀鱗 先生 いつも的確なご回答 感謝申し上げます!。
先生の「自分なら「区切り位置」機能を使って商品名と数量を切り分けるんだけどなあ。
・・・」をご教授くださいまし、空白がないケースは少ないので、従来どおり消していってもそんなに時間はかからないでしょうから。
No.2
- 回答日時:
こんにちは!
別シートに置換する「検索する文字列」を羅列し、それを利用してはどうでしょうか?
例えば「Sheet2」のA列1行目から 1個 2個 ・・・7g と記入しておくとします。
Sub Sample1()
Dim i As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
For i = 1 To wS.Cells(Rows.Count, "A").End(xlUp).Row
Range("D:D").Replace what:=wS.Cells(i, "A"), replacement:="", lookat:=xlPart
Next i
End Sub
程度のコードで大丈夫です。m(_ _)m
No.3
- 回答日時:
こんにちは。
私には、マクロの内容は分かったけれども、具体例がないので、はっきりしていません。
>「商品名 何個(数量)」結果として「商品名」
例:
もも10個
みかん20個
バナナ 11本
ぶどう5房
というようになっているなら、マクロでしなくてもよいとは思いますが、マクロでやるなら、
スピードの保証はしかねますが、このようなものが考えられます。
Sub RemoveNumbers()
Dim RegEx As Object
Dim c As Range
Set RegEx = CreateObject("VBScript.RegExp")
With RegEx
.Global = False: .IgnoreCase = False
.Pattern = "\s*\d+.*" '*
End With
Application.ScreenUpdating = False
For Each c In Range("D1", Cells(Rows.Count, "D").End(xlUp))
If c.Value Like "*#*" Then
c.Value = RegEx.Replace(c.Value, "")
End If
Next
Application.ScreenUpdating = True
End Sub
* パターンの全角数字は考慮されていません。必要なら、一旦半角にするか、パターンに、全角数字を対象を含めなければなりません。
"\s*\d+.*"
この意味は、\s スペース等、\d は半角数字、* は、0個以上、+は、一個以上
.(点)は、ワイルドカードのすべての文字
No.4
- 回答日時:
マクロで行うよりも、エクセルの置換機能のほうが早いです。
>セル内は 「商品名 何個(数量)」
>結果として「商品名」だけにしたい。
>(商品名の次 スペースがない場合もある・)
>空白がないケースは少ないので、従来どおり消していってもそんなに時間はかからないでしょうから。
という条件であれば、空白があるケースを置換機能で削除していきます。
◆手順
1.対象範囲を選択
2.CTRL+"H"(置換のショートカットキー)
3.検索する文字列 『 *』 ← 空白とアスタリスク
4.置換後の文字列 『』 ← 何も入力しない
5.『すべて置換』をクリック
空白がないケースは従来通りの手法で対応ください。
とはいえ、一定の法則性があれば消せます。
例えば、1個、2個、など『1桁の数値+"個"』の場合。
◆手順
1.対象範囲を選択
2.CTRL+"H"(置換のショートカットキー)
3.検索する文字列 『?個』 ← 半角クエスチョンマークと個
4.置換後の文字列 『』 ← 何も入力しない
5.『すべて置換』をクリック
6g、7gという場合も手順3の"個"を"g"にかえれば対応できます。
No.5
- 回答日時:
No.3の回答者です。
私のマクロの前提となっている条件を書き入れておきます。
それから、修正をしておきます。理由は、製品名の型番が入っている可能性があるからです。
>セル内は 「商品名 何個(数量)」
>結果として「商品名」だけにしたい。
あくまでも、セルひとつの中に、「商品名 何個(数量)」とある場合で、
マクロをみると、「xlPart」になっているということからです。(マクロのベースとなっている商品リストのサンプル画像)
この場合、区切り位置を使えれば使ってもよいと思うのですが、元のレイアウトに戻すには、いくつか手間が増えます。
Sub RemoveNumbers1()
Dim RegEx As Object
Dim c As Range
Set RegEx = CreateObject("VBScript.RegExp")
With RegEx
.Global = False: .IgnoreCase = False
.Pattern = "\s*[\d\.]+\s?(個|[kg]+|セット|台)$"
End With
Application.ScreenUpdating = False
For Each c In Range("D1", Cells(Rows.Count, "D").End(xlUp))
If c.Value Like "*#*" Then
c.Value = RegEx.Replace(Trim(c.Value), "")
End If
Next
Application.ScreenUpdating = True
End Sub
//
パターンは、その状況によっていろいろ変わります。
正規表現というのですが、なかなかややこしいです。
kg と g と兼用
"\s*[\d\.]+(個|[kg]+|セット|台)$"
前回に続いて、
(個|[kg]+|セット|台)
それぞれの区切りのひとつに該当する。
$は、末尾。
早い遅いは別として、1回で済むようにマクロを考えました。
これは、正規表現が可能なエディタでも良いと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルマクロで教えてください 2 2022/05/04 09:07
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) マクロで最終行を取得してコピーしたい 3 2022/04/06 19:07
- Visual Basic(VBA) Excel vba で1と10を正確に判断させる方法を教えてください。 TからU列に1と入力があれば 3 2022/12/26 16:54
- Access(アクセス) エクセルのマクロについて教えてください。 2 2023/02/04 14:20
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/06/01 14:45
- その他(Microsoft Office) エクセルについて教えてください。 2 2022/10/20 14:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで文字の入力がセルの...
-
多数の計算セルに一括で同一の...
-
エクセルのセルの中の,よりも前...
-
Excelからテキストへのコ...
-
Excelのmatch関数エラー原因が...
-
【エクセル】ピボットテーブル...
-
Excelで、半角スペースをTABに...
-
excelで可視セルのみ置換
-
置換機能を使わずに先頭に「'」...
-
小数点を消す方法
-
VBAでの日付の置換方法を教えて...
-
エクセルでセル内の一部を一括...
-
Excelの空文字セルの削除方法を...
-
エクセルでセル内の一部分だけ...
-
企業名簿で(株)や(有)を無視し...
-
エクセルの文字列を数式に変換...
-
エクセルで複数ファイルからデ...
-
エクセルでのハイパーリンク切...
-
Excel折線グラフ作成でマイナス...
-
Excelのシートにある1行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで文字の入力がセルの...
-
多数の計算セルに一括で同一の...
-
Excelのmatch関数エラー原因が...
-
Excelの入力済みセルに一括で、...
-
エクセルのセルの中の,よりも前...
-
Excelからテキストへのコ...
-
excelで可視セルのみ置換
-
置換機能を使わずに先頭に「'」...
-
Excelで、半角スペースをTABに...
-
【エクセル】ピボットテーブル...
-
エクセルでセル内の一部を一括...
-
Excelの空文字セルの削除方法を...
-
Excelのシートにある1行...
-
エクセルの表ををメモ帳などに...
-
小数点を消す方法
-
Excelで電話番号などの-(ハイ...
-
Excelのアポストロフィーの削除
-
Excel "~区"のみを削除したい
-
エクセルでセル内の一部分だけ...
-
一括でダブルクリックした状態...
おすすめ情報