エクセルでマクロを使ってデータ管理をしています。
そのうちの一つなんですが、下記のようなデータがあります。
[コード][数量]
DESS 10
QWY 2
AFE 12
123BE 300
124BS 200
128BE1 5
と続いていきます(だいたいデータ量が1万件ぐらいです)
このデータのうち、”DESS”と”AFE”、そして末尾に”BE”、”BE1”がつくものだけ
データを抽出し、それ以外のデータを削除をしたいのです。
以前は、抽出するコードがそれほど多くなかったので、
If Cells(i, 5) <> "DESS" And _
Cells(i, 5) <> "AFE" And _
Cells(i, "E") <> "123BE" Then
.Rows(i).Delete
と書いて削除していたのですが、BEの頭につく数字のパターンが
あまりにも多いので(123BE,125BE,342BE等々、約30ほど)
末尾にBEがつくもの、BE1がつくものと、DESS、AFEを残して
それ以外を削除、とマクロを書きたいのですが、どうしてもうまくいかず・・
どなたか教えてください!!
どうぞよろしくお願い致します!!!
No.7
- 回答日時:
こんにちは!
>だいたいデータ量が1万件ぐらいです
というコトですので、オートフィルタで一気にやってみました。
1行目項目行でデータは2行目以降にあるとします。
ただ他の方々の回答を拝見するとE列に「コード」が記載されているのですね?
というコトだとするとE列でオートフィルタをかけています。
Sub Sample1()
Dim lastRow As Long, myRng As Range
lastRow = Cells(Rows.Count, "E").End(xlUp).Row
Application.ScreenUpdating = False
'▼まず「DESS」と「AFE」の完全一致のE列セルを変数「myRng」に格納//
Range("E:E").AutoFilter field:=1, Criteria1:=Array("DESS", "AFE"), Operator:=xlFilterValues
If Cells(Rows.Count, "E").End(xlUp).Row > 1 Then
Set myRng = Range(Cells(2, "E"), Cells(lastRow, "E")).SpecialCells(xlCellTypeVisible)
End If
'▼「BE」が含まれるE列セルを「myRng」に格納//
Range("E:E").AutoFilter field:=1, Criteria1:="*BE*"
If Cells(Rows.Count, "E").End(xlUp).Row > 1 Then
If myRng Is Nothing Then
Set myRng = Range(Cells(2, "E"), Cells(lastRow, "E")).SpecialCells(xlCellTypeVisible)
Else
Set myRng = Union(myRng, Range(Cells(2, "E"), Cells(lastRow, "E")).SpecialCells(xlCellTypeVisible))
End If
End If
ActiveSheet.AutoFilterMode = False
If Not myRng Is Nothing Then
myRng.EntireRow.Delete
End If
Application.ScreenUpdating = True
End Sub
※ コード内の
>Array("DESS", "AFE"), Operator:=xlFilterValues
の部分はExcel2007以降で使用可能だったと思います。
お使いのバージョンが2003以前の場合は
少しコードが変わってきます。m(_ _)m
おぉおお。こんなやり方も!
オートフィルターをかける方法は私もやれないかどうか試してみたんですが
まったくもってこのクォリティには追いついていなかったですね笑
そうなのです、E列にコードが入っています。すいません、説明不足で・・。
今書きかけなのですが、のちほどこれでやってみます!
ありがとうございました!!
No.5
- 回答日時:
それでしたら「No.3」の
「If Right(Cells(i, 5).Value, 2) <> "BE" Then」と「 If Right(Cells(i, 5).Value, 3) <> "BE1" Then」を削除して「If Not InStr(Cells(i, 5).Value, "BE") Then」を追加してください。また「End If」が1つ多くなるので1つ削除して下さい。
むむむ。すいません。
いろいろ変えてしまったせいなのか、BEを含むものが出てこなくなってしまいました。。
以下、変えたコードです。
Dim i As Long
Application.ScreenUpdating = False
For i = Cells(Rows.Count, 5).End(xlUp).Row To 2 Step -1
If Not InStr(Cells(i, 5).Value, "BE") Then
If Cells(i, 5).Value <> "DESS" Then
If Cells(i, 5).Value <> "AFE" Then
Rows(i).Delete
End If
End If
End If
Next
Application.ScreenUpdating = True
どこか間違ってしまっていますでしょうか・・すいません(;;)
ちなみにEnd subはこの後に続くコードの後で書いてあります!
どうぞよろしくお願いいたしますー!
No.4
- 回答日時:
No.3 の補足
②「BE1」を含む物
でしたら「If Right(Cells(i, 5).Value, 3) <> "BE1" Then」を「If Not InStr(Cells(i, 5).Value, "BE1") Then」に変更して下さい。
そしてこちらもありがとうございます!
含むもの、というのを選びたいときはこう書くのですねー。
にわかVBAというか、ほぼ初心者で、前任者が書き上げた立派なマクロを
なんとかかんとかしながら、データと向き合っているので、教えていただいたおかげで
少しわかってきた感じがします。
ちなみに、下の注釈につけていただいた、③ですが、ご指摘どおりタイトル行があって
2行目からだったので、書き換えてみました。ありがとうございましたー!
No.3
- 回答日時:
それでしたらこんなのはいかがでしょうか?
---------------------------------------------------------
Sub Sample()
Dim i As Long
Application.ScreenUpdating = False
For i = Cells(Rows.Count, 5).End(xlUp).Row To 1 Step -1
If Right(Cells(i, 5).Value, 2) <> "BE" Then
If Right(Cells(i, 5).Value, 3) <> "BE1" Then
If Cells(i, 5).Value <> "DESS" Then
If Cells(i, 5).Value <> "AFE" Then
Rows(i).Delete
End If
End If
End If
End If
Next
Application.ScreenUpdating = True
End Sub
---------------------------------------------------------
以下ループ命令の部分が書かれていなかったので大きなお世話かもしれませんが説明しておきます。
※①「Application.ScreenUpdating = False」と「Application.ScreenUpdating = True」は画面の書き換えを止めてスピードアップを図っています。
※②「Cells(Rows.Count, 5).End(xlUp).Row」はE列の最後の行になります。
※③ タイトル行があって2行目からデータが始まるのならば「For i = Cells(Rows.Count, 5).End(xlUp).Row To 1 Step -1」は「For i = Cells(Rows.Count, 5).End(xlUp).Row To 2 Step -1」に直して下さい。
いろいろな方法があるのですね!すごいです!
①のApplication.ScreenUpdating、やってみました!確かに早い!!
データ量が多くて抽出するのに時間がかかっていたんですがスピードあがりました!
ありがとうございますー!
No.2
- 回答日時:
続けて記述されてしまっているので判り難いので条件の確認です。
--------------------------------------------------
次の4つの条件を1つも満たさない物を削除
①「BE」で終わる物
②「BE1」を含む物
③「DESS」と一致する物
④「AFE」と一致する物
--------------------------------------------------
その他確認したい事項
・②の条件の「1」は全角ですよね?
・前後に空白を含んでいた場合、空白も文字列の一部として判定しますか?[ 例:「AFE」はOK、「AFE 」はNG]
ありがとうございます!
なんときれいに整理していただき、恐縮です。
ほとんどご指摘どおりで、②だけ、BE1で終わるもの、です。
そして1は全角になります。
空白があった場合でも文字列の一部と判定し、抽出したいです!
空白まで含めることができるのであればぜひぜひ、知りたいです!!
No.1
- 回答日時:
抽出する方をORで記述して、それ以外を削除 とした方が簡単です。
If Cells(i, 5).Value = "DESS" Or _
Cells(i, 5).Value = "AFE" Or _
Right(Cells(i, 5).Value, 2) = "BE" Or _
Right(Cells(i, 5).Value, 3) = "BE1" Then
Else
Rows(i).Delete
End If
うわぁぁぁ!ありがとうございます!ありがとうございます!
できましたできました(;;)涙、感動。助かりましたー!
Rightのあと、Valueで指定するんですね。
いいこと覚えました!ありがとうございますー!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- 英語 提示した名言の"be to be able to do"の意味等について 4 2023/05/17 10:02
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) VBA 指定した列にある日時データから時間を削除する方法について 4 2022/04/14 11:17
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Excel(エクセル) 特定のデータの抽出方法を教えてください@Excel 4 2023/06/13 18:38
- Visual Basic(VBA) Sheet2の日付をキーにオートフィルターで2023年1月のデータを抽出し、Sheet3へ書き出すた 2 2023/03/06 23:57
- Excel(エクセル) VBA 選択範囲とUnionの使い方について 8 2023/08/17 13:25
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- TOEFL・TOEIC・英語検定 【英会話】[Would]を使った文章の和訳方法や使い方がなかなか理解出来ません。 理解出来ない例文 1 2022/08/08 13:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで時刻(8:00~20:00)...
-
エクセルでオートフィルタのボ...
-
エクセルのオートフィルタで最...
-
Excelのオートフィルタで非表示...
-
エクセルで、条件に一致した行...
-
access マクロでのフィルタの...
-
エクセルの偶数行(奇数行)の抽出
-
オートフィルタで選択した項目...
-
Excel2003 オートフィルタで「...
-
[excel] 自由記述部分の抜き出し
-
スプレッドシートのチェックボ...
-
ACCESSでスペースの抽出
-
エクセル オートフィルター
-
Excelで文字を入力と自動的にフ...
-
エクセルにて、フィルタをかけ...
-
エクセル マクロ セルの文字と...
-
エクセル・条件付で行を削除す...
-
Excelで、オートフィルタを解除...
-
エクセル関数で、数字の入った...
-
オートフィルタで表示されるリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでオートフィルタのボ...
-
エクセルのオートフィルタで最...
-
エクセルで時刻(8:00~20:00)...
-
Excelのオートフィルタで非表示...
-
エクセルの偶数行(奇数行)の抽出
-
エクセル関数で、数字の入った...
-
エクセルで、条件に一致した行...
-
オートフィルタで3つ以上の条...
-
access マクロでのフィルタの...
-
Excel共有ブックのオートフィル...
-
なぜShowAllDataだとうまく行か...
-
エクセル・条件付で行を削除す...
-
オートフィルタで選択したデー...
-
【EXCEL】条件に一致した最新デ...
-
今日の日付のデータをすばやく...
-
エクセル、オートフィルタで最...
-
Excelオートフィルターで絞り込...
-
可視セルを対象としたcountifが...
-
【Excel/関数/条件付き書式】月...
-
データの抽出を教えてください
おすすめ情報
すいません、Goo先生を使ったのがはじめてで、お礼から返信してしまいました(>_<)
お礼に書き込んだ後に気づいたのですが、
「BE」も「BE1」もコードの終わりになるので、終わるもの、なのですが
そのほかのデータに「BE」が含まれることはないんです。
なので、
1.「BE」を含むもの、
2.「DESS」と一致するもの
3.「AFE」と一致するもの
それ以外を削除。
と、マクロが書けたらすごくすごくありがたいです。
そしていずれの場合も空白も文字列の一部として判定できたらありがたいです!
どうぞよろしくお願い致します!
みなさま、ありがとうございました!
いろいろな方法があるんですね。
本当に勉強になりました。お時間いただき、ありがとうございました!