Excel (VBA) |
![]() ![]() |
(Windows 10 Pro : Excel 2016)
エクセルのカウント、抽出方法について
投稿日時: 23/05/27 01:18:14
投稿者: CT2_7
|
---|---|
エクセルのカウント、抽出方法について
|
![]() |
投稿日時: 23/05/27 05:21:05
投稿者: simple
|
---|---|
フィルタオプション(Advanced Filter)を使った例を示します。
<<Sheet1>>データ(A列)および抽出条件(C列) B列は空白列としてください。 A列 B列 C列 1 内容 内容 2 WI-FI接続できない。配線抜け。D-ONUリセット。WIFIルータリセット。 *WI*FI* 3 WI-FI接続できない。配線抜け。 *D*ONU* 4 WI-FI接続できない。 *リセット* 5 D-ONUリセット ↑OR条件 6 WIFIルータリセット。 個数は不問 7 全角カタカナ。リセットを使ったデータがあるとする。(非抽出) 8 半角小文字英数はどう? wi-fi(大文字小文字は同一視され抽出) 9 WIFI(これも抽出されない。こういうデータは無いそうだ。) <<Sheet2>>処理前 A列 B列 C列 1 内容 2【注】(【重要】ここを読み飛ばすと機能しません) Sheet1のA1セル、C1セル、Sheet2のA1 セルの3つのセルは、 すべて同一文字の見出しとしてください。 前後にスペースがあっても機能しません。 ■下記のマクロをボタンに登録して、実行してください。 Sheet2に結果が得られます。 <<Sheet2>>処理後 A列 B列 C列 1 内容 8セル内で 6件(セル)が該当 2 WI-FI接続できない。配線抜け。D-ONUリセット。WIFIルータリセット。 3 WI-FI接続できない。配線抜け。 4 WI-FI接続できない。 5 D-ONUリセット 6 WIFIルータリセット。 7 半角小文字英数はどう? wi-fi(大文字小文字は同一視され抽出) ■参考コード Sub main() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim rng As Range Dim cnts As Long Dim hitCnts As Long Dim t t = Timer - t Set ws1 = Worksheets("Sheet1") ' ■必要に応じてシート名を修正 Set ws2 = Worksheets("Sheet2") ' ■同上 '対象範囲 Set rng = ws1.Range("A1", ws1.Cells(Rows.Count, "A").End(xlUp)) 'フィルタオプション(Advanced Filter)の実行 rng.AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=ws1.Range("C1").CurrentRegion, _ CopyToRange:=ws2.Range("A1"), Unique:=False cnts = Application.CountA(rng) - 1 hitCnts = ws2.Cells(Rows.Count, "A").End(xlUp).Row - 1 ws2.Range("C1") = cnts & "セル内で " & hitCnts & "件(セル)が該当" Application.Goto ws2.Range("A1"), True MsgBox "抽出終了 " & Format(Timer - t, "0.00") & "秒" End Sub 【補足】 AdvancedFilterメソッドは、かなり高速なはずです。 抽出やシート書き込みが、内部に備わったワークシート処理用のコードで実行されるので。 -- なお、chatGPTのさらに下請けはご遠慮ください。相手と更問を続けたらどうですか? # 敢えて言うなら、キーワードにワイルドカードが含まれることを説明しなかったとしたら、 # その問答は蒟蒻問答となりますね。 |
![]() |
投稿日時: 23/05/27 10:40:10
投稿者: WinArrow
|
---|---|
>=COUNTIFS(A1:A15000,"*WI*FI*")+COUNTIFS(A1:A15000,"*D*ONU*")+COUNTIFS(A1:A15000,"*リセット*")>>
|
![]() |
投稿日時: 23/05/28 12:49:55
投稿者: CT2_7
|
---|---|
他にもご回答ありましたら、何卒 ご教示をお願い致します。 |
![]() |
投稿日時: 23/05/28 13:06:01
投稿者: simple
|
---|---|
他の回答を要望する前に言うことはないんですか?
|
![]() |
投稿日時: 23/05/28 15:27:30
投稿者: CT2_7
|
---|---|
simple さんの引用: 申し訳ありません。大変、失礼いたしました。 ご教示頂き、誠にありがとうございます。 明日、会社で確認させていただきますm(__)m |
![]() |
投稿日時: 23/05/28 15:45:20
投稿者: CT2_7
|
---|---|
<ご質問1>
|
![]() |
投稿日時: 23/05/28 15:55:31
投稿者: WinArrow
|
---|---|
引用: ↑の数式は、COUNTIF関数を使った時と同じになります。 そういう意味で COUNTIFS関数の使い方が間違っていると回答しました。 これについては、原因を究明するなり・・・その結果は、どのようになったのですか? |
![]() |
投稿日時: 23/05/28 16:06:07
投稿者: WinArrow
|
---|---|
=COUNTIFS(A1:A15000,"*WI*FI*")+COUNTIFS(A1:A15000,"*D*ONU*")+COUNTIFS(A1:A15000,"*リセット*")
|
![]() |
投稿日時: 23/05/28 17:51:33
投稿者: CT2_7
|
---|---|
>WinArrow さんの引用:
|
![]() |
投稿日時: 23/05/28 18:38:17
投稿者: WinArrow
|
---|---|
引用: それだったら、 作業列を使って判定しましょう 作業列の数式 =IF(COUNTIF(A2,"*WI*FI*")>0,1,IF(COUNTIF(A2,"D*COUNT*")>0,1,IF(COUNTIF(A2,"*リセット*")>0,1,0))) 下へフィルドラッグ して、全部を合計します。 作業列のセルは、 どれかに該当すると「1」が返ります。 |
![]() |
投稿日時: 23/05/28 19:32:19
投稿者: CT2_7
|
---|---|
作業列の数式
|
![]() |
投稿日時: 23/05/28 21:23:45
投稿者: 半平太
|
---|---|
引用: 実際はワイルドカード考慮後でのカウントですよね? つまり、*WI*FI* *D*ONU* *リセット* 等でカウントするのあり、上記項目と同じ文字列ではない。 そうなると、数十個あると言うその他の項目名もどのようにワイルドカードが 挿入されているのか説明が必要と思うのですが? それとも、*WI*FI* *D*ONU* 以外は「*リセット*」の様に前後に*を付ければいいのですか? ><私のPC環境> >エクセル2016、アクセス2016がPCに入っています。 最終的には会社のPCで処理するハズなので、会社のバージョンを申告して下さい。 ※複数種ある場合は保守的に一番古いバージョン |
![]() |
投稿日時: 23/05/28 22:07:50
投稿者: simple
|
---|---|
>DONU 3000件
C列 D列 1 内容 内容 2 A B 3 C 「(Aが含まれ、かつ Bが含まれる) または Cが含まれる」という条件になります。 (2) また、もとと複雑な組合わせがあるなら、 上記記事の「条件設定に数式を使う方法」の項目を参照してください。 C列 1 条件 (C2セルは空白か、見出しと一致しない例えば「条件」などとします) 2 =OR(COUNTIF(A2,"*WI*FI*")>0, COUNTIF(A2,"D*COUNT*")>0, COUNTIF(A2,"*リセット*")>0))これは作業列を作成してそれをフィルタで抽出する作業と機能的には同等です。 ただ、フィルタオプションは、一つのセルの設定だけですみ、抽出、コピー処理を お任せにできる、ということです。 ■ ・項目の抽出はオートフィルタでも可能ですが、 オートフィルタは設定できる条件に個数の上限があったり、条件設定がしにくいですが、 ・フィルタオプションはどのような条件でも設定が可能です。 これを使いこなせば、たいていの抽出は可能です。 データ個数の制限もありません。スムーズに抽出ができます。 # どうやら提案したフィルタオプションはお好みではないようですね。 # 高機能の道具を使わないのは機会損失だと個人的には思いますが、各人の自由です。 # こちらは情報提供するまでです。別に使わなくても差し支えありません。 |
![]() |
投稿日時: 23/05/28 22:31:59
投稿者: CT2_7
|
---|---|
[quote="半平太"] 引用: →こちらが会社PCのことです。 (自宅PCには元データがないため、試しておりませんが。。2019以上が確か入ってたかと思います。) |
![]() |
投稿日時: 23/05/28 22:41:39
投稿者: WinArrow
|
---|---|
ここは、VBAのばんだから、VBAで考えてみましょう。
Sub test() Dim SLTMOJI, i As Long Dim DATACELL, RX As Long SLTMOJI = Range(検索文字列).Value DATACELL = Range("A1:B15000").Value For RX = LBound(DATACELL) To UBound(DATACELL) DATACELL(RX, 2) = 0 For i = LBound(SLTMOJI) To UBound(SKTMOJI) If WorksheetFunction.CountIf(DATACELL(RX, 1), SLTMOJI(i, 1)) > 0 Then DATACELL(RX, 2) = 1 Exit For End If Next Next Range("A1:B15000").Value = DATACELL Range("B15001").Value = "=SUM(B1:B15000)" End Sub |
![]() |
投稿日時: 23/05/28 22:42:54
投稿者: CT2_7
|
---|---|
データ個数の制限もありません。スムーズに抽出ができます。
|
![]() |
投稿日時: 23/05/29 10:33:04
投稿者: WinArrow
|
---|---|
1列の複数OR条件に対応して抽出するには、
|
![]() |
投稿日時: 23/05/29 10:44:53
投稿者: 半平太
|
---|---|
こんな感じかな? 実質、数式とフィルタオプションだけれども・・
Sub trial() Dim rScope As Range Dim bottom As Range Dim rSearch As Range Dim vOrigin Set rScope = Range("A1", Cells(Rows.Count, "A").End(xlUp)) Set bottom = Cells(Rows.Count, "B").End(xlUp) Set bottom = bottom.Offset(IIf(bottom = "重複除き", -1, 0)) Set rSearch = Range("B2", bottom) vOrigin = rSearch.Value With rSearch.Offset(, 1) .Formula = "=IF(B2=""WIFI"",""*WI*FI*"",IF(B2=""DONU"",""*D*ONU*"",""*""&B2&""*""))" .Value = .Value .Offset(, -1).Value = .Value .FormulaLocal = "=COUNTIF(A:A,B2)" .Value = .Value End With Range("D1", Cells(Rows.Count, "D").End(xlUp)).ClearContents Range("D2").Formula = "=SUMPRODUCT(COUNTIF(A2," & rSearch.Address & ":$B$5))>0" rScope.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("D1:D2"), _ CopyToRange:=Range("D3"), Unique:=False Range("D3", Cells(Rows.Count, "D").End(xlUp).Offset(2)).Copy Range("D1") Range("D1") = "該当セル" bottom.Offset(1) = "重複除き" bottom.Offset(1, 1) = Evaluate("COUNTA(D:D)-1") rSearch.Value = vOrigin '検索値をワイルドカードなしに戻す End Sub <実行前> 行 _________________A_________________ _____B_____ __C__ 1 対象データ 検索文字列 件数 2 WI-FI接続不可。配線抜け。D-ONUリセット WIFI 3 a DONU 4 WIRELESS リセット 5 b WIRELESS 6 WI-FI接続不可。 7 WI-FI接続不可。配線抜け 8 WI-FI接続不可。配線抜け。D-ONUリセット 9 WIRELESS LAN <実行後> 行 _________________A_________________ _____B_____ __C__ _________________D________________ 1 対象データ 検索文字列 件数 該当セル 2 WI-FI接続不可。配線抜け。D-ONUリセット WIFI 4 WI-FI接続不可。配線抜け。D-ONUリセット 3 a DONU 2 WIRELESS 4 WIRELESS リセット 2 WI-FI接続不可。 5 b WIRELESS 2 WI-FI接続不可。配線抜け 6 WI-FI接続不可。 重複除き 6 WI-FI接続不可。配線抜け。D-ONUリセット 7 WI-FI接続不可。配線抜け WIRELESS LAN 8 WI-FI接続不可。配線抜け。D-ONUリセット 9 WIRELESS LAN |
![]() |
投稿日時: 23/05/29 14:30:48
投稿者: simple
|
---|---|
間違い易いので予め指摘しておきます。
|
![]() |
投稿日時: 23/05/29 14:40:24
投稿者: CT2_7
|
---|---|
>ともあれ、フィルタオプションを検討してみてください。[/quote]
|
![]() |
投稿日時: 23/05/29 14:41:46
投稿者: CT2_7
|
---|---|
[quote="半平太"]こんな感じかな? 実質、数式とフィルタオプションだけれども・・
|
![]() |
投稿日時: 23/05/29 14:43:09
投稿者: CT2_7
|
---|---|
>安全側に倒してこう書くことも一法でしょうか。
|