マクロ初心者です。
以前、以下のようなマクロコードをここで教えて頂きました。
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VBA基本構文の作り方 2列の...
-
Excel VBA テキストボックス内...
-
EXCEL VBAのソートについて
-
VB.NETでファイル名順にファイ...
-
Excel2010 /VBA ユーザー設定リ...
-
構造体配列のソート
-
単純挿入ソート法の要素の比較...
-
DirectoryInfo型配列ソート(C#)
-
datagridviewの並べ替え
-
C言語・要素除去
-
プログラミングについて 配列を...
-
csvファイル内にてソートす...
-
【WPF】【C#】【XAML】LISTBOX
-
構造体配列の並べ替え
-
GridViewで列のソートを無効に...
-
datatablesのソートを数字順に...
-
あるディレクトリ内のファイル...
-
excel VBA リストビューの行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
C# DataGridView のヘッダーセ...
-
あるディレクトリ内のファイル...
-
C言語・要素除去
-
ファイル名「1.jpg ~10.jpg~...
-
Excelですべての組合せ(重複組...
-
C言語でアナグラムを求めるプロ...
-
2次元配列を複数項目でソートし...
-
C# DataTableの行をソートしてD...
-
DataGridViewソート時に先頭行...
-
n番目に大きい数を求めるアル...
-
DataGridViewの複数列を連動し...
-
VBA基本構文の作り方 2列の...
-
配列の問題
-
10個の整数を入力して小さい順...
-
構造体配列の並べ替え
-
vbでDataTableの抽出コピー
-
リスト構造のソートで悩んでま...
-
DataGridViewの昇順降順。
おすすめ情報