Sheet1をフィルターで「りんご」を抽出し、Sheet2へ地域を貼り付ける下記マクロを変更して
Sheet2のB列で青森が2行あれば、C列へ「2」、B列で長野が1行あればC列へ「1」と
行をカウントした数値を入れたいのですができません。教えてください。
Sub test1()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim LastCell As Long
Set ws1 = Worksheets(1)
Set ws2 = Worksheets(2)
LastCell = ws1.Cells(Rows.Count, 2).End(xlUp).Row
With ws1.Range("B4")
.AutoFilter 1, "りんご"
.Offset(1, 3).Resize(LastCell - 4).Copy ws2.Range("B3")
.AutoFilter
End With
End Sub
No.2ベストアンサー
- 回答日時:
実験用コードです(添削)
Sub test1()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim LastCell As Long
Set ws1 = Worksheets(1)
Set ws2 = Worksheets(2)
LastCell = ws1.Cells(Rows.Count, 2).End(xlUp).Row
ws2.Cells(1, 1) = "りんご"
ws2.Cells(2, 2) = "地域"
ws2.Cells(2, 3) = "カウント"
ws2.Range("B3", ws2.Cells(Rows.Count, "B").End(xlUp).Offset(1)).ClearContents
With ws1.Range("B4")
.AutoFilter 1, "りんご"
.Offset(1, 3).Resize(LastCell - 4).Copy ws2.Range("B3")
.AutoFilter
End With
End Sub
test2代替えScripting.Dictionary
Sub test2()
'Worksheets(2)をデータ加工
Dim dic As Object, vKey
Set dic = CreateObject("Scripting.Dictionary")
Dim ws2 As Worksheet: Set ws2 = Worksheets(2)
Dim rng As Range, r As Range
Set rng = ws2.Range("B3", ws2.Cells(Rows.Count, "B").End(xlUp))
'一意データを作成+カウント
For Each r In rng
If Not dic.Exists(r.Text) Then
dic.Add r.Text, 1
Else
dic.Item(r.Text) = dic.Item(r.Text) + 1
End If
Next
Dim n As Long
n = 3
'出力先をClearContents
rng.Resize(, 2).ClearContents
For Each vKey In dic.Keys
ws2.Cells(n, 2) = vKey
ws2.Cells(n, 3) = dic.Item(vKey)
n = n + 1
Next
Set dic = Nothing
End Sub
やっぱり加工したものを出力したいですね
AutoFilter第2基準キーを使って
Sub test3()
Dim dic As Object, vKey As Object
Set dic = CreateObject("Scripting.Dictionary")
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = Worksheets(1)
Set ws2 = Worksheets(2)
Dim rng As Range, r As Range
Set rng = ws1.Range("B5", ws1.Cells(Rows.Count, "B").End(xlUp))
'一意データを作成(地域)
For Each r In rng.Offset(, 3)
If Not dic.Exists(r.Text) Then
dic.Add r.Text, 1
End If
Next
Dim arrKey, Ky, ary()
Dim n As Long, cnt As Long
arrKey = dic.Keys
ReDim ary(UBound(arrKey), 1)
Application.ScreenUpdating = False
With ws1
If .AutoFilterMode Then
.AutoFilterMode = False
End If
With .Range("B4")
.AutoFilter 1, "りんご" '第1キーワードでフィルタ(品名
For Each Ky In arrKey
.AutoFilter 4, Ky, xlFilterValues '第2キーワードでフィルタ(地域
cnt = Application _
.Subtotal(3, .Range("B5").CurrentRegion.Columns(1)) - 1
If cnt > 0 Then
'対象地域があった場合に各値を配列に代入
ary(n, 0) = Ky
ary(n, 1) = cnt
n = n + 1
End If
Next
End With
.AutoFilterMode = False
End With
'取得処理終了後 対象シート範囲に出力
ws2.Cells(1, 1) = "りんご"
ws2.Cells(2, 2) = "地域"
ws2.Cells(2, 3) = "カウント"
ws2.Cells(3, 2) _
.Resize(UBound(ary, 1) + 1, UBound(ary, 2) + 1) = ary
Application.ScreenUpdating = True
End Sub
test2代替えScripting.Dictionaryの
If Not dic.Exists(r.Text) Then
dic.Add r.Text, 1
とn = n + 1
この2つがやっと理解できました。
またDictionaryオブジェクトには色々な決め事があり少しづつ勉強して利用できるようにしたいです。
ありがとうどざいました。
No.1
- 回答日時:
こんばんは
>test1実行後、別の下記コードで長野の数はカウントできるのですが、長野など他の地域がカウントできません。
これは長野に対しての基準キーワードが無い為です
同じ範囲に改めてRange("B2").AutoFilter 1, Range("B4")とすれば取得できると思いますが・・ループなどでそのまま変えていくと長野がまた実行されてしまいますね
test1についてはリストなどから"りんご"を設定すれば良いかも知れませんが
test2は結果に応じてフィルタ基準キーワードを作る必要があります
test1もすべての品名を一度に処理する場合は必要
一意の基準キーワードを作成するには UNIQUE 関数+FILTER関数や
CreateObject("Scripting.Dictionary")で作る方法が好ましいと思います
DictionaryはUniqueデータ作成時にitemを作成する事が出来るので出現回数をカウントする事も出来ます
しかし、すべての品名を出力したい場合、 test2はWorksheets(2)に対しての加工なので課題が残りそうですね
品名ごとにシートをずらせば良さそうですがどうかな・・
Sub test1()とSub test2()を同じAutoFilterで行う事も出来ると思いますが
Copyを使うのをあきらめる必要があるかも知れませんね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
URLのリンク切れをマクロを使っ...
-
B列の最終行までA列をオート...
-
IIF関数の使い方
-
【VBA】2つのシートの値を比較...
-
targetをA列のセルに限定するに...
-
VBAを使って検索したセルをコピ...
-
VBAのFind関数で結合セルを検索...
-
Changeイベントでの複数セルの...
-
VBAで、特定の文字より後を削除...
-
VBAコンボボックスで選択した値...
-
rowsとcolsの意味
-
期限を超えた日付に警告のメッ...
-
マクロ 最終列をコピーして最終...
-
データグリッドビューの一番最...
-
VBAで指定範囲内の空白セルを左...
-
ExcelVBAで配列2つを結合させ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
VBAを使って検索したセルをコピ...
-
rowsとcolsの意味
-
文字列の結合を空白行まで実行
-
VBAのFind関数で結合セルを検索...
-
【VBA】2つのシートの値を比較...
-
VBAコンボボックスで選択した値...
-
データグリッドビューの一番最...
-
セルに値が入っていた時の処理
-
Changeイベントでの複数セルの...
-
VBAで、特定の文字より後を削除...
-
VBAで指定範囲内の空白セルを左...
-
マクロ 最終列をコピーして最終...
おすすめ情報
test1実行後、別の下記コードで長野の数はカウントできるのですが、長野など他の地域がカウントできません。
Sub test2()
Dim Count As Long
Range("B2").AutoFilter 1, Range("B3")
Count = WorksheetFunction.Subtotal(3, Range("B3").CurrentRegion.Columns(1))
Range("C3").Value = Count - 1
ActiveSheet.AutoFilterMode = False
End Sub