[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『1列のデータを規約ごとに複数列に分ける』(かず)
初めまして.質問があります.
「シート1」
A社 a1
A社 a2
A社 a3
A社 a4
B社 b1
B社 b2
B社 b3
C社 c1
D社 d1
D社 d2
D社 d3
D社 d4
↓
「シート2」
A社 B社 C社 D社
a1 b1 c1 d1
a2 b2 d2
a3 b3 d3
a4 d4
このように,シート1の2列にデータを並べた時にシート2に自動的に反映されるように関数を作りたいんですけど,どのように作ればよいでしょうか?関数は,シート2のa1などに入力できればと思っています.所々ずれていてみにくく申し訳ありません.シート2には,A社列にaのデータ,B社列にbのデータを入力したいです.
もし関数が難しければ,マクロでも構いません.できる方は,よろしくお願いします.
< 使用 Excel:unknown、使用 OS:unknown >
関数やPowerQueryでも出来ると思いますが、不得手ですのでとりあえずマクロです。 そちらの回答は他の方の回答をお待ち下さい。
Sub Macro1() Dim dic As Object Dim ts As Worksheet Dim i As Long, j As Long Dim cnt As Long Dim arr Set dic = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row On Error Resume Next dic.Add .Cells(i, 1).Value, "" On Error GoTo 0 Next i arr = Range(.Cells(1, 1), .Cells(Rows.Count, 2).End(xlUp)).Value Set ts = Worksheets.Add(after:=Worksheets(Worksheets.Count)) ts.Cells(1, 1).Resize(, UBound(dic.keys) + 1).Value = dic.keys For i = 1 To UBound(dic.keys) + 1 cnt = 1 For j = 1 To UBound(arr) If arr(j, 1) = ts.Cells(1, i).Value Then cnt = cnt + 1 ts.Cells(cnt, i).Value = arr(j, 2) End If Next j Next i End With End Sub (MixNuts) 2021/12/04(土) 21:44
シートの名前は、 With Worksheets("Sheet1") の"Sheet1" を実際のシート名に書き直して下さい。 例)シート1だとしたら、With Worksheets("シート1") の様に。 (MixNuts) 2021/12/04(土) 21:47
参考に Sub Test() Dim myDic As Object Dim v() As String, c As Range, d As Variant Dim key As String, itm As String, i As Long, rng As Range
Set myDic = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") For Each c In .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) key = Split(c.Value)(0) itm = Split(c.Value)(1) If myDic.Exists(key) Then v = myDic(key) i = UBound(v) + 1 ReDim Preserve v(i) Else i = 0 ReDim v(i) End If v(i) = itm myDic(key) = v Next End With Set rng = Worksheets("Sheet2").Range("A1") For Each d In myDic.keys rng.Value = d rng.Offset(1).Resize(UBound(myDic(d)) + 1).Value = Application.Transpose(myDic(d)) Set rng = rng.Offset(, 1) Next End Sub
(ピンク) 2021/12/04(土) 22:29
>1列のデータを規約ごとに複数列に分ける A列1列に "A社 a1" と記述しているのではなく
A列 B列 A社 a1
なら私の早とちりで間違った回答をしてしまったようです。(;^_^A 今日は絶不調なので寝ます。
(ピンク) 2021/12/04(土) 22:54
A列 B列 A社 a1 の方も回答しておきます。
Sub Test2() Dim myDic As Object Dim v() As String, c As Range, d As Variant Dim i As Long, rng As Range
Set myDic = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") For Each c In .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) If myDic.Exists(c.Value) Then v = myDic(c.Value) i = UBound(v) + 1 ReDim Preserve v(i) Else i = 0 ReDim v(i) End If v(i) = c.Offset(, 1).Value myDic(c.Value) = v Next End With Set rng = Worksheets("Sheet2").Range("A1") For Each d In myDic.keys rng.Value = d rng.Offset(1).Resize(UBound(myDic(d)) + 1).Value = Application.Transpose(myDic(d)) Set rng = rng.Offset(, 1) Next End Sub (ピンク) 2021/12/04(土) 23:00
A1: =TRANSPOSE(FILTER(UNIQUE(Sheet1!A:A),UNIQUE(Sheet1!A:A)<>"")) A2: =IF(A$1<>"",FILTER(Sheet1!$B:$B,Sheet1!$A:$A=A$1),"")
(マナ) 2021/12/04(土) 23:07
おはようございます。 365難民の私が何を思ったのか証拠にもなく思い付きで書いてみました。(^^;
A1に↓として右にフィル =IFERROR(INDEX(Sheet1!$A$1:$A$12, AGGREGATE(15,6,(MATCH(Sheet1!$A$1:$A$12,Sheet1!$A$1:$A$12,0)=ROW($A$1:$A$12))/(MATCH(Sheet1!$A$1:$A$12,Sheet1!$A$1:$A$12,0)=ROW($A$1:$A$12))*ROW($A$1:$A$12),COLUMN(A1))),"")
A2に↓として右に下にフィル =IFERROR(INDEX(Sheet1!$B$1:$B$12, AGGREGATE(15,6,(((Sheet1!$A$1:$A$12=A$1)*ROW($A$1:$A$12))/((Sheet1!$A$1:$A$12=A$1)*ROW($A$1:$A$12)))*ROW($A$1:$A$12),ROW(A1))),"") (SoulMan) 2021/12/05(日) 08:06
Sheet2の1行目に会社名が入力されているとします。
A2: =IFERROR(INDEX(Sheet1!$B$1:$B$12,AGGREGATE(15,6,ROW($A$1:$A$12)/(Sheet1!$A$1:$A$12=A$1),ROW(A1))),"")
右と下にコピーします。
(メジロ) 2021/12/05(日) 09:45
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.