
マクロ初心者です。
以前、以下のようなマクロコードをここで教えて頂きました。
Sheet 2 にSheet1 の代表を抽出させ、かつ
それに対応する個数の合計を表示させるというものです。
しかし、
ここで、Sheet 1 の内容はソートさせずに(データの順番の変化を起こさせず)、
Sheet 2 にはソートをさせた代表の状態で表示させることはできますでしょうか?
Sheet 1(登録)
A B C E
品名 種 産地 個数
りんご 赤 30
バナナ 台湾 30
りんご 青 20
りんご 赤 25
バナナ 国産 14
バナナ 国産 22
バナナ 台湾 30
Sheet 2(代表)
A B C D
品名 種 産地 個数
りんご 赤 55
りんご 青 20
バナナ 台湾 60
バナナ 国産 36
長々と申し訳ありませんが、ご助力の程よろしくお願い致します。
Sub 抽出_Click()
Dim 元行 As Long
Dim 先行 As Long
Dim 小計 As Long
Dim 一致 As Boolean
Sheets("代表").Select
Rows("2:" & Rows.Count).ClearContents
Sheets("登録").Select
Cells.Sort _
Key1:=Range("A2"), Order1:=xlAscending, _
Key2:=Range("B2"), Order2:=xlAscending, _
Key3:=Range("C2"), Order3:=xlAscending, _
Header:=xlYes, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
元行 = 2
Do While Cells(元行 - 1, 1).Value <> ""
一致 = False
If Cells(元行, 1).Value = Cells(元行 - 1, 1).Value Then
If Cells(元行, 2).Value = Cells(元行 - 1, 2).Value Then
If Cells(元行, 3).Value = Cells(元行 - 1, 3).Value Then
一致 = True
End If
End If
End If
If 一致 Then
小計 = 小計 + Cells(元行, 6).Value
Else
先行 = 先行 + 1
Sheets("代表").Cells(先行, 1).Value = Cells(元行 - 1, 1).Value
Sheets("代表").Cells(先行, 2).Value = Cells(元行 - 1, 2).Value
Sheets("代表").Cells(先行, 3).Value = Cells(元行 - 1, 3).Value
Sheets("代表").Cells(先行, 4).Value = 小計
小計 = Cells(元行, 6).Value
End If
元行 = 元行 + 1
Loop
Sheets("代表").Select
Cells(1, 4).Value = "小計"
End Sub
No.4ベストアンサー
- 回答日時:
Excel2003だと、RemoveDuplicates だけではなく、SUMIFS も使えませんね~。
そうなるとスマートな書き方ができません。ゴリゴリのVBAになりますが、こんな感じでどうでしょう。
Sub 抽出_Click()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim dic As Variant
Dim Key As Variant
Dim MaxRow As Long
Dim I As Long
Dim J As Long
Set ws1 = Sheets("登録")
Set ws2 = Sheets("代表")
Set dic = CreateObject("Scripting.Dictionary")
ws2.Rows("2:" & Rows.Count).ClearContents
MaxRow = 1
For I = 2 To ws1.Cells(Rows.Count, "A").End(xlUp).Row
Key = ws1.Cells(I, "A") & "|" & ws1.Cells(I, "B") & "|" & ws1.Cells(I, "C")
If dic.Item(Key) = "" Then
MaxRow = MaxRow + 1
dic.Item(Key) = MaxRow
J = dic.Item(Key)
ws2.Cells(J, "A") = ws1.Cells(I, "A")
ws2.Cells(J, "B") = ws1.Cells(I, "B")
ws2.Cells(J, "C") = ws1.Cells(I, "C")
End If
J = dic.Item(Key)
ws2.Cells(J, "D") = ws2.Cells(J, "D") + ws1.Cells(I, "E")
Next
End Sub
で、できました。
ありがとうございます!
スマートとかゴリゴリとかすら分からないレベルですが
素直に感動しております。
コード表記をして頂いて、一番力になっていただけたと
感じましたので、ベストアンサーに選ばせて頂きます。
No.3
- 回答日時:
これでどうでしょう?(一応、こちらでは動作確認できているのですが・・・)
それから、RemoveDuplicatesメソッドがエラーになってしまうということですが、このメソッドはExcel2007からの実装です。それより前のバージョンでは使えません。notimeさんのExcelは何ですか?
Sub 抽出_Click()
With Worksheets("登録")
.Range("A2:C" & .Cells(Rows.Count, "A").End(xlUp).Row).Copy _
Destination:=Worksheets("代表").Range("A2")
End With
Application.CutCopyMode = False
With Worksheets("代表")
.Range("A:C").RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes
.Range("D2:" & "D" & .Cells(Rows.Count, "A").End(xlUp).Row).Formula = _
"=SUMIFS(登録!$D:$D,登録!$A:$A,A2,登録!$B:$B,""="" & B2,登録!$C:$C,""="" & C2)"
End With
End Sub
ママチャリ様
ご回答ありがとうございます。
また返信が遅くなり、申し訳ありません。
EXCEL ですが2003 を使用しております。
試行錯誤しておりますが、なかなか歯が立たない状態でして、
コードを記して頂けるのは非常に助かります。
もしよろしければ、これに対応しているものを
頂けますと、幸いであります。
No.2
- 回答日時:
こんにちは
ご提示のコードを活かす前提であるなら・・・
>Sheet 1 の内容はソートさせずに、Sheet 2 にはソートを
>させた代表の状態で表示させることはできますでしょうか
ご提示のコードはおっしゃるようにSheet1上でソートをしています。
これを行わないためには、まず、Sheet1の内容を全部Sheet2にコピーしておいて、その後の作業をすべてSheet2上で行うようにすれば宜しいのではないでしょうか?
この考え方なら、基本的にご提示の処理の内容がほぼ活かせますし(操作対象のシートを変えるなどの必要はありますが)、若干の修正程度で実現できるものと思います。
(最後に、不要になった行の内容を消去する必要はありますが)
シート全部のコピーを行うマクロの記述方法については、ANo1様の回答でも最初の行で同様のことをなさっていますね。
No.1
- 回答日時:
こんな感じで、いかがしょうか。
ただ、同じ品名でも離れ離れになってしまうことがありますが…。
Sub 抽出_Click()
Worksheets("登録").Cells.Copy Destination:=Worksheets("代表").Range("A1")
Application.CutCopyMode = False
With Worksheets("代表")
.Cells.RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes
.Range("D2:" & "D" & .Cells(Rows.Count, "A").End(xlUp).Row).Formula = _
"=SUMIFS(登録!$D:$D,登録!$A:$A,A2,登録!$B:$B,""="" & B2,登録!$C:$C,""="" & C2)"
End With
End Sub
ご回答、ありがとうございます。
試してみたのですが、登録の画面が全て代表に
コピーされて、なおかつデバックしてしまいます。
箇所は
.Cells.RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes
の部分です。
登録のシートのABCE列を代表のシートのABCD列に貼りたいのですが
どのようにすれば宜しいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
おすすめの美術館・博物館、教えてください!
美術館・博物館が大好きです。みなさんのおすすめをぜひお聞きしたいです。
-
今の日本に期待することはなんですか?
目まぐるしく、日本も世界も状況が変わる中、あなたが今の日本に期待することはなんですか?
-
あなたなりのストレス発散方法を教えてください!
自分なりのストレス発散方法はありますか?
-
集中するためにやっていること
家で仕事をしているのですが、布団をはじめ誘惑だらけでなかなか集中できません。
-
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# DataGridView のヘッダーセ...
-
DataGridViewの昇順降順。
-
System.IO.Directory.GetFiles...
-
DataGridViewでのソート制御
-
VB.NETでファイル名順にファイ...
-
Excel VBAで並べ替えをしたい
-
VBA基本構文の作り方 2列の...
-
C# DataTableの行をソートしてD...
-
配列の問題
-
データ数が多い場合のソート
-
VB6 任意の順番でのソート
-
ブック.csvを開かずに他のブッ...
-
ファイル名「1.jpg ~10.jpg~...
-
IPアドレスのSORTについて
-
配列の中身を入れ替える方法を...
-
2次元配列を複数項目でソートし...
-
構造体配列のソート
-
偶数奇数の判別!!
-
ListViewのソートについて
-
あるディレクトリ内のファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
C# DataGridView のヘッダーセ...
-
VBA基本構文の作り方 2列の...
-
C# DataTableの行をソートしてD...
-
DataGridViewの複数列を連動し...
-
C言語・要素除去
-
ファイル名「1.jpg ~10.jpg~...
-
あるディレクトリ内のファイル...
-
Excelですべての組合せ(重複組...
-
DataGridViewの昇順降順。
-
n番目に大きい数を求めるアル...
-
C++ 入力した3つのint型の整数...
-
vbでDataTableの抽出コピー
-
2次元配列を複数項目でソートし...
-
DataGridViewソート時に先頭行...
-
文字列をソートする方法
-
(VBA) Dir 関数で取得するファ...
-
excel VBA の条件をつけての列...
-
excel VBA リストビューの行...
おすすめ情報