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

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

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

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

解決済

VBA:配列 Keyに紐づくItemの格納がうまくいかない

doggyman10
doggyman10

総合スコア5

VBA

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

2回答

0評価

0クリップ

811閲覧

投稿2021/07/09 05:05

編集2021/07/09 07:03

表題の通り、配列に関してItemの格納がいかない点について、
ご質問させてください。

配列そのもの自体の概念の知識不足によるものから
発生していることは重々承知の上ご質問させて頂いてる次第です。

【やりたいことの一連の流れ】
1.入力シートにあるデータを配列へ

2.重複しないkeyの格納

3.keyと紐づくitemの格納

4.転記データにある転記シートを一番最後にコピー作成

5.転記シート内セルF4にKeyを転記

6.Keyと紐づくアイテムを転記

7.シート名をKeyに変更

8.keyの数だけ繰り返し処理

と上記の流れで処理を行いたいと考えております。、
"Keyの格納→シートコピー→シート名をKeyに変更"
の流れであればうまく動作するのですが、
keyに紐づくitem格納の部分で躓いてる状況にあります。

恐らくitemがうまく連動(格納)されていないことから
上手くいっていないものと思われるのですが、どうか有識者の方のお力をお借りしたく
ご質問させていただきました。

また補足点や何か不足内容があれば追記いたしますので、
ご教示の程よろしくお願いいたします。

【追記】
画像あった方が伝わりやすいかと思い画像を追加させていただきました。
▼重複について
シート名の転記時に使用する時に使用する重複しないリストを作成、
Keyに紐づくitemは重複の有無関係なくKeyが同様であれば転記を行いたいと考えています。

VBA

For I = 9 To wb2Row list = .Cells(I, "E").Value 'Key&item '未登録がある場合は登録(重複防止) If Not dc.exists(list) Then dc.Add list, "" End If

上記コード部分で重複判別している認識なのですが、誤りでしょうか..?

入力
転記

VBA

Option Explicit Sub 別ブックシート転記() '----------------------------------------------------------------------------- 'Thisworkbookを変数へ格納 '----------------------------------------------------------------------------- Dim wb1 As Workbook Set wb1 = ThisWorkbook '----------------------------------------------------------------------------- '転記データの取得・展開 '----------------------------------------------------------------------------- Dim path2 As String path2 = ThisWorkbook.Sheets("データ元").Range("D2") Dim datename2 As String datename2 = "転記Date.xlsx" Dim wb2 As Workbook Workbooks.Open (path2 & "\" & datename2), ReadOnly:=False Set wb2 = Workbooks(datename2) '----------------------------------------------------------------------------- Application.ScreenUpdating = False Dim dc As Object Dim list As String Dim I, L As Long Dim wb2Row As Long Set dc = CreateObject("Scripting.Dictionary") 'dcの作成 With wb1.Sheets("入力") wb2Row = .Cells(Rows.Count, "C").End(xlUp).Row For I = 9 To wb2Row list = .Cells(I, "E").Value 'Key&item '未登録がある場合は登録(重複防止) If Not dc.exists(list) Then dc.Add list, "" End If '------------------------------------------------------------------------------------ 'Keyに紐づくitemの格納 dc.Add list, .Cells(I, "D") 'No. dc.Add list, .Cells(I, "M") 'Code dc.Add list, .Cells(I, "H") 'Name '------------------------------------------------------------------------------------ Next I End With wb2.Activate For L = 0 To dc.Count - 1 wb2.Sheets("転記").copy after:=Worksheets(Worksheets.Count) wb2.Sheets("転記(2)").Range("F4") = dc.keys()(L) 'Keyの転記 '------------------------------------------------------------------------------------ wb2.Sheets("転記(2)").Cells(I + 10, "C") = dc.Items()(1) 'Item1の転記-No. wb2.Sheets("転記(2)").Cells(I + 10, "D") = dc.Items()(2) 'Item2の転記-Code wb2.Sheets("転記(2)").Cells(I + 10, "E") = dc.Items()(3) 'Ite3の転記-Name '------------------------------------------------------------------------------------ wb2.Sheets("転記(2)").Name = dc.keys()(L) 'Keyの転記 Next L Application.ScreenUpdating = True End Sub

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

neconekocat

2021/07/09 05:20

上手くいかない の詳細を書いてください。 例えばdc.Add list, .Cells(I, "D")のところで既にキーが割り当てられているというメッセージが出ます。 とか
doggyman10

2021/07/09 05:29 編集

neconekocatさん ありがとうございます。 確かにうまく行かないの詳細が記載されておらず申し訳ございません。 まさに指摘頂いた(dc.Add list, .Cells(I, "D"))の部分に "このキーは既にこのコレクションの要素に割り当てられています"と表示されます。 またここに質問させて頂く前までに自分なりにネット上へ確認したところ、 Dictionary自体はそもそも重複したキーの格納が仕様上出来ないと記載があったため、 Keyに紐づく転記を行いたい場合はどのように処理を行うのが適切なのか ご教示頂きたく質問させていただきました。 恐れ入りますが、ご確認のほどよろしくお願いいたします。
neconekocat

2021/07/09 05:53

正直なところ、いくつかの質問に分けた方がいいと思います。 格納処理に絞って聞きますので、質問内容に追記ください。 ・キーに重複があった場合どうするのか(例えば10行目と11行目のE列の値が同じ場合はどちらの行の値を転記するのか) ・dcにどんな値を入れたいのか(配列を格納したい?)
doggyman10

2021/07/09 07:02

再度ありがとうございます。 追記させていただきましたので、 ご確認頂けると幸いです。 また拙い説明で余計ややこしくなっている可能性は否めないので、 画像を追加させて頂きました。
neconekocat

2021/07/09 07:44

あぁなるほど・・・なるほど・・・ そういう事をやりたかったわけですか・・・

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

VBA

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