前提・実現したいこと
ある会員データを集計するにあたり、重複している会員を見つけ、重複者を1つのデータに作り替えて元のリストに戻したいと考えています。
1つのVBAで完結まで想像できなかったので以下の作業で切り分けようと考えております。
このような会員リストがあります。
1)「個人番号」をキーに重複者を見つけ別シートに重複者リストを作成します。
2)重複者を1つのデータに作り替えるのですが
「会員番号」「住所」「会員取得年月日」「身長」「体重」は「会員取得年月日」の最新日の方のデータを採用
「プラン面談」「食事相談」は丸がついているものを合算
「オプション1料金」「オプション2料金」はそれぞれ合算
というルールで1つのデータに作り替えます。
3)1つのデータに作り替えたら元のリストに戻す
このようなVBAを作りたいと考えています。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
Sub リスト取得() Dim i As Long Dim j As Long Dim lastrow As Long lastrow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row Worksheets("Sheet2").Cells.Clear Worksheets("Sheet2").Cells(1, 1) = "個人番号" Worksheets("Sheet2").Cells(1, 2) = "会員番号" Worksheets("Sheet2").Cells(1, 3) = "氏名" Worksheets("Sheet2").Cells(1, 4) = "性別" Worksheets("Sheet2").Cells(1, 5) = "年齢" Worksheets("Sheet2").Cells(1, 6) = "生年月日" Worksheets("Sheet2").Cells(1, 7) = "住所" Worksheets("Sheet2").Cells(1, 8) = "会員取得年月日" Worksheets("Sheet2").Cells(1, 9) = "会員喪失年月日" Worksheets("Sheet2").Cells(1, 10) = "身長" Worksheets("Sheet2").Cells(1, 11) = "体重" Worksheets("Sheet2").Cells(1, 12) = "プラン相談" Worksheets("Sheet2").Cells(1, 13) = "食事相談" Worksheets("Sheet2").Cells(1, 14) = "オプション1利用料" Worksheets("Sheet2").Cells(1, 15) = "オプション2利用料" For i = 4 To lastrow Worksheets("Sheet2").Cells(i - 2, 1) = Worksheets("Sheet1").Cells(i, 1) Worksheets("Sheet2").Cells(i - 2, 2) = Worksheets("Sheet1").Cells(i, 2) Worksheets("Sheet2").Cells(i - 2, 3) = Worksheets("Sheet1").Cells(i, 3) Worksheets("Sheet2").Cells(i - 2, 4) = Worksheets("Sheet1").Cells(i, 4) Worksheets("Sheet2").Cells(i - 2, 5) = Worksheets("Sheet1").Cells(i, 5) Worksheets("Sheet2").Cells(i - 2, 6) = Worksheets("Sheet1").Cells(i, 6) Worksheets("Sheet2").Cells(i - 2, 7) = Worksheets("Sheet1").Cells(i, 7) Worksheets("Sheet2").Cells(i - 2, 8) = Worksheets("Sheet1").Cells(i, 8) Worksheets("Sheet2").Cells(i - 2, 9) = Worksheets("Sheet1").Cells(i, 9) Worksheets("Sheet2").Cells(i - 2, 10) = Worksheets("Sheet1").Cells(i, 10) Worksheets("Sheet2").Cells(i - 2, 11) = Worksheets("Sheet1").Cells(i, 11) Worksheets("Sheet2").Cells(i - 2, 12) = Worksheets("Sheet1").Cells(i, 12) Worksheets("Sheet2").Cells(i - 2, 13) = Worksheets("Sheet1").Cells(i, 13) Worksheets("Sheet2").Cells(i - 2, 14) = Worksheets("Sheet1").Cells(i, 14) Worksheets("Sheet2").Cells(i - 2, 15) = Worksheets("Sheet1").Cells(i, 15) Next Worksheets("Sheet2").Activate Range(Cells(2, 1), Cells(i - 3, 16)).Select ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 1), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 2), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 3), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 4), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 5), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 6), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 7), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 8), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 9), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 10), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 11), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 12), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 13), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 14), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Cells(2, 15), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet2").Sort '並べ替える範囲を指定 .SetRange Range(Cells(2, 1), Cells(i - 3, 16)) '1行目がタイトル行かどうか .Header = xlNo '大文字と小文字を区別するかどうか .MatchCase = False '並べ替えの方向(行/列)を指定 .Orientation = xlTopToBottom 'ふりがなを使うかどうか .SortMethod = xlPinYin '並べ替えを実行 .Apply End With Call 最新の取り出し End Sub Sub 最新の取り出し() Dim i As Long Dim j As Long Dim lastrow As Long Dim kei As Long Dim kei1 As Double Dim kei2 As Double Dim maru1 As String Dim maru2 As String lastrow = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To lastrow Worksheets("Sheet2").Cells(i, 16) = 1 Next Worksheets("Sheet3").Cells(1, 1) = "個人番号" Worksheets("Sheet3").Cells(1, 2) = "会員番号" Worksheets("Sheet3").Cells(1, 3) = "氏名" Worksheets("Sheet3").Cells(1, 4) = "性別" Worksheets("Sheet3").Cells(1, 5) = "年齢" Worksheets("Sheet3").Cells(1, 6) = "生年月日" Worksheets("Sheet3").Cells(1, 7) = "住所" Worksheets("Sheet3").Cells(1, 8) = "会員取得年月日" Worksheets("Sheet3").Cells(1, 9) = "会員喪失年月日" Worksheets("Sheet3").Cells(1, 10) = "身長" Worksheets("Sheet3").Cells(1, 11) = "体重" Worksheets("Sheet3").Cells(1, 12) = "プラン相談" Worksheets("Sheet3").Cells(1, 13) = "食事相談" Worksheets("Sheet3").Cells(1, 14) = "オプション1利用料" Worksheets("Sheet3").Cells(1, 15) = "オプション2利用料" Worksheets("Sheet3").Cells(1, 16) = "件数" j = 2 kei = 0 maru1 = "" maru2 = "" kei1 = 0 kei2 = 0 For i = 2 To lastrow kei = kei + Worksheets("Sheet2").Cells(i, 16) kei1 = kei1 + Worksheets("Sheet2").Cells(i, 14) kei2 = kei2 + Worksheets("Sheet2").Cells(i, 15) If Worksheets("Sheet2").Cells(i, 12) = "○" Then maru1 = "○" End If If Worksheets("Sheet2").Cells(i, 13) = "○" Then maru2 = "○" End If If Worksheets("Sheet2").Cells(i, 1) <> Worksheets("Sheet2").Cells(i + 1, 1) Then Worksheets("Sheet3").Cells(j, 1) = Worksheets("Sheet2").Cells(i, 1) Worksheets("Sheet3").Cells(j, 2) = Worksheets("Sheet2").Cells(i, 2) Worksheets("Sheet3").Cells(j, 3) = Worksheets("Sheet2").Cells(i, 3) Worksheets("Sheet3").Cells(j, 4) = Worksheets("Sheet2").Cells(i, 4) Worksheets("Sheet3").Cells(j, 5) = Worksheets("Sheet2").Cells(i, 5) Worksheets("Sheet3").Cells(j, 6) = Worksheets("Sheet2").Cells(i, 6) Worksheets("Sheet3").Cells(j, 7) = Worksheets("Sheet2").Cells(i, 7) Worksheets("Sheet3").Cells(j, 8) = Worksheets("Sheet2").Cells(i, 8) Worksheets("Sheet3").Cells(j, 9) = Worksheets("Sheet2").Cells(i, 9) Worksheets("Sheet3").Cells(j, 10) = Worksheets("Sheet2").Cells(i, 10) Worksheets("Sheet3").Cells(j, 11) = Worksheets("Sheet2").Cells(i, 11) Worksheets("Sheet3").Cells(j, 12) = maru1 Worksheets("Sheet3").Cells(j, 13) = maru2 Worksheets("Sheet3").Cells(j, 14) = kei1 Worksheets("Sheet3").Cells(j, 15) = kei2 Worksheets("Sheet3").Cells(j, 16) = kei j = j + 1 kei = 0 kei1 = 0 kei2 = 0 maru1 = "" maru2 = "" End If Next Worksheets("Sheet3").Select End Sub
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
いろんなところを参考にVBA書いてみたのですがうまくいきません。
またデータが多くなるとこのコードではすごく重くなります。
ご教授いただきたくよろしくお願いいたします。
途中まででもご自身で書かれたコードを提示してください。
と書いた瞬間に修正されたのですね。失礼しました。
どの箇所が重くなるのかは把握されていますか?
For i = ~ NEXT
の繰り返しの部分でしょうか。
もう少し具体的に、どの For が重くなるのかを把握する必要がありますね。
ぱっと見、並べ替えが重くなりそうな気はしますが。
動作環境はWindowsでしょうか。
WindowsのExcelならDictionaryが使えます。
Dictionaryを使用すれば、かなり高速になります。
(MacではDictionaryは使用できません)
> いろんなところを参考にVBA書いてみたのですがうまくいきません。
> またデータが多くなるとこのコードではすごく重くなります。
何がどううまくいかないのでしょうか?動作が重いことが課題ですか?他にも何かありますか?
一番の課題は目的通りVBAで動かせないところです。(重複チェック→2つの法則で1つのデータにする→元のリストに戻す)。まずは目的達成のためにはどのようなVBAを構築したらいいのか、そして実際のデータが列150列以上、件数15000件前後のデータをスムーズに稼働させるためのテクニックまで解決できればと思っています。
>実際のデータが列150列以上
ということは、O列より右側に、ほかにデータがあるのですか。
あるとすれば、どのような、ルールで1つにまとめるのですか?
あと、動作環境はwindowsでしょうか。
動作環境はwindowsです。
今回最低でもVBAで行いたいのは
1)重複チェック
2)重複者をルールにのっとり1つのデータにする
3)実現できるなら元のリストに収める
です。3)は実現しなくても最悪は条件付き書式で重複者をピックアップして削除の後VBAで作成した新しいデータを加えるという方法も考えています。
重複者だけ抜き取って作り替える、そして戻すというのがどうしてもわからなかったので、試しに全部データで一括で行おうと今回のVBAを書いてみたのですが思った通りに出来なくて質問に上げさせていただいた次第です。
回答1件
あなたの回答
tips
プレビュー