質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

解決済

重複データ集約と照合

jabe
jabe

総合スコア35

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

2回答

0評価

0クリップ

235閲覧

投稿2022/05/10 02:44

編集2022/05/13 11:22

実現したいこと

やりたい事:4パターン、8パターンシートの内容を照合し、照合結果シートのボタンで照合結果を出力したいです。

前提環境①:照合結果シートのA3~E3項目は、フォーマットとして用意されている。
条件①:4パターン、8パターンシートの行数は300行数を想定
条件②:4パターン、8パターンシートの照合キーは、部品コード
条件③:4パターン、8パターンシート毎で、以下データ集約を行った後、4パターン、8パターンシートの照合を行いたい。
●第一データ集約条件
①重複部品コードがあった場合、1つに集約する。その際、数量は加算、部品名は上書き集約
②重複しない部品コードは、数量、部品名そのまま
●第二データ集約条件
①部品コードに対して、4パターン、8パターンシートの数量を表示
②部品名は、上書き
※8パターンシート11行名の部品_Fと4パターンシート11行目の部品Fとなっているが、部品コードは同一の為、どちらかに上書きされる形にしたい。
③照合結果は以下条件のように表示させたい
イメージ説明

完成イメージ
イメージ説明

詳細①
イメージ説明
詳細②
イメージ説明
詳細③
イメージ説明

発生している問題・エラーメッセージ

イメージ説明

実行時エラー450 引数の数が一致していません。または不正なプロパティを指定しています。

該当のソースコード

VBA

Sub 重複データ集約し照合() Dim myDic As Object 'Dictionaryオブジェクト使用 Dim myPc As Variant '部品コード変数 Dim myQu As Variant '数量変数 Dim myPn As Variant '部品名変数 Dim myList As Variant '部品コード、数量、部品名配列 Dim i As Long '配列カウント数 Dim cWs As Worksheet '4パターンシート Set cWs = Worksheets("4パターン") '4パターン変数 Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "4パターン_仮" '4パターン_仮シート作成 Dim cWs1 As Worksheet '4パターンシートコピー Set cWs1 = Worksheets("4パターン_仮") '4パターン_仮変数 Set myDic = CreateObject("Scripting.Dictionary") '数量,部品コード,部品名のデータを配列に格納※社内外列は照合に不要だが、列分割での格納方法が分からない cWs.Activate myList = Range("A4", Range("A" & Rows.Count). _ End(xlUp)).Resize(, 4).Value '連想配列にデータを格納 1次元 For i = 1 To UBound(myList, 1) '部品コードが空欄かチェック If Not myList(i, 3) = Empty Then If Not myDic.exists(myList(i, 3)) Then '配列重複チェック '重複しない部品コードを取得※数量,部品コード,部品名を取得したいが、複数Itemの場合エラー発生 myDic.Add Key:=myList(i, 3), Item:=myList(i, 1), Item:=myList(i, 4) Else '数量を加算 myDic(myList(i, 3)) = myDic(myList(i, 3)) + Val(myList(i, 1)) End If End If Next '[部品コード] 重複していないリストを格納 myPc = myDic.keys '[部品名] 品目を格納 myPn = myDic.items '[数量] 品目コードの合計を格納 myItem = myDic.items 'リストを出力 For i = 0 To UBound(myPc) cWs1.Cells(i + 2, 1).Value = myPc(i) cWs1.Cells(i + 2, 2).Value = myPn(i) cWs1.Cells(i + 2, 3).Value = myQu(i) Next '開放※setで使用したものを閉じる(DBへのアクセス、変数) Set myDic = Nothing End Sub

試したこと

やりたい事から、以下方針でプログラムを考えたのですが、初期段階でつまづきました。
また、やりたい事が複雑であるため、道筋も見えず、お力添えをお願いします。

第一データ集約条件を目指して、4パターン、8パターンシート毎で集約処理を実施しようとしたら、
部品コード、数量、部品名の2つ以上の変数処理を行うとことでエラーが発生しました。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。