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

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

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

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

Q&A

解決済

2回答

1393閲覧

VBAで同じ種類を横並びにする

SatoToy

総合スコア5

VBA

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

0グッド

0クリップ

投稿2022/04/07 13:53

編集2022/04/07 20:51

VBAで、A列、B列の値を取得して、以下のC列、D列の様に出力したいと考えております。

  • A列の名前の重複を1つにして、C列に出力する
  • B列の値の重複は1つにして、D列に横に並べて出力する
ABCD
鈴木123鈴木123, 456
鈴木456加藤789
鈴木456佐藤100
加藤789
加藤789
佐藤100

ネットで調べながら重複は1つにすることはできました。
ただ、B列の値を横に並べて出力することができません。

以下が私が書いた重複を1つにまとめるまでできたコードですが、私のコードを変更していただいても、
もしくは他に良いコードの書き方などありましたら、ご教示お願い致します。

VBA

1Sub teratail() 2 3 Dim Dic, i As Integer, name As String 4 Dim order_number As Long 5 Set Dic = CreateObject("Scripting.Dictionary") 'Key(キー)とItem(データ)をセットで格納して、リストなどを作成するときに使用。Pythonでいうところのたぶん辞書型 6 7 On Error Resume Next 8 9 For i = 1 To 10 10 11 name = Cells(i, 1).Value '荷受人の列の名前を1つずつ取得 12 order_number = Cells(i, 2).Value '注文番号を1つずつ取得 13 14 Dic.Add name, order_number ' Dicに追加していく 15 16 Next i 17 18 ' 出力 19 For i = 0 To Dic.Count - 1 20 mykeys = Dic.Keys 21 myItems = Dic.Items 22 Range("C" & i + 1).Value = mykeys(i) 23 Range("D" & i + 1).Value = myItems(i) 24 25 'オブジェクトを開放する 26 Set Dic = Nothing 27 28 Next i 29 30End Sub

⇒ コードの出力結果

ABCD
鈴木123鈴木123
鈴木456加藤789
鈴木456佐藤100
加藤789
加藤789
佐藤100

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

InStr関数でアイテム内に同じ値が存在しないのを確認して、追加していけばどうでしょう。

vba

1Sub Sample() 2 3 Dim Dic, i As Integer, name As String 4 Dim order_number As Long 5 Set Dic = CreateObject("Scripting.Dictionary") 'Key(キー)とItem(データ)をセットで格納して、リストなどを作成するときに使用。Pythonでいうところのたぶん辞書型 6 7 8 For i = 1 To 10 9 10 name = Cells(i, 1).Value '荷受人の列の名前を1つずつ取得 11 order_number = Cells(i, 2).Value '注文番号を1つずつ取得 12 If Not Dic.Exists(name) Then 13 Dic(name) = order_number 14 ElseIf InStr("," & Dic(name) & ",", "," & order_number & ",") = 0 Then 15 Dic(name) = Dic(name) & "," & order_number 16 End If 17 18 Next i 19 20 ' 出力 21 Dim myKeys, myItems 22 myKeys = Dic.Keys 23 myItems = Dic.Items 24 With WorksheetFunction 25 Range("C1").Resize(Dic.Count).Value = .Transpose(myKeys) 26 Range("D1").Resize(Dic.Count).Value = .Transpose(myItems) 27 End With 28 29 'オブジェクトを開放する 30 Set Dic = Nothing 31 32End Sub

投稿2022/04/08 00:45

編集2022/04/08 00:48
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SatoToy

2022/04/08 14:34

どちらのコードも綺麗でとても悩んだのですが、回答が早い順番で選ばせてもらいました。 こういうときに、本当に2つベストアンサーが選べるとか、お礼に投げ銭できるような仕組みがあればと思います。 このような書き方もあるのですね。明日は休みなので、いただいたコードを分解して勉強しようと思います。 ありがとうございました!
guest

0

ベストアンサー

とりあえず、今のコードを修正するとすると以下のようになるかと思います。

VBA

1 Dim Dic, Dic2, i As Integer, name As String 2 Dim order_number As Long 3 Dim tmp_var As Variant 4 Dim tmp_sp() As String 5 6 7 Set Dic = CreateObject("Scripting.Dictionary") 'Key(キー)とItem(データ)をセットで格納して、リストなどを作成するときに使用。Pythonでいうところのたぶん辞書型 8 Set Dic2 = CreateObject("Scripting.Dictionary") 9 On Error Resume Next 10 11 For i = 1 To 10 12 13 name = Cells(i, 1).Value '荷受人の列の名前を1つずつ取得 14 order_number = Cells(i, 2).Value '注文番号を1つずつ取得 15 16 Dic.Add name & vbTab & order_number, "" ' Dicに追加していく 17 Next i 18 19 20 For Each tmp_var In Dic 21 tmp_sp = Split(tmp_var, vbTab) 22 If Dic2.Exists(tmp_sp(0)) Then 23 Dic2.Item(tmp_sp(0)) = Dic2.Item(tmp_sp(0)) & "," & tmp_sp(1) 24 Else 25 Dic2.Add tmp_sp(0), tmp_sp(1) 26 End If 27 Next 28 29 ' 出力 30 mykeys = Dic2.Keys 31 For i = 0 To Dic2.Count - 1 32 Range("C" & i + 1).Value = mykeys(i) 33 Range("D" & i + 1).Value = Dic2.Item(mykeys(i)) 34 Next i 35 'オブジェクトを開放する 36 Set Dic = Nothing

他のやり方は、例えば
Scripting.DictionaryのItemにScripting.Dictionaryをセットして重複を省いたりするのもいいかもしれないですね。

投稿2022/04/07 21:19

xail2222

総合スコア1497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SatoToy

2022/04/08 14:29

ありがとうございました! 私のコードの足りないところを補っていただき勉強になります。マクロは全くの初心者で、Pythonを最近少し始めたのですが、こんなに難しいマクロで人の書いたコードの足りないところを補うことができるなんて、ただすごくて尊敬します。 もっと精進しようと思います。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問