[[20250501213731]] 『CSV出力により複数行に分かれてしまうデータを1行』(たすけて) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『CSV出力により複数行に分かれてしまうデータを1行にまとめたい』(たすけて)

CSV出力により複数行になるデータを下記のように1行にまとめる計算式を教えて下さい。

1 A1 C1 D1 E1
1 B1 F1 G1 H1
1 I1 J1 K1
2 A2
2 B2
2 C2 D2 E2
3
3
3

CSV出力で上記の様な出力を下記のようにまとめたいです。

1 A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 K1
2 A2 B2 C2 D2 E2
3

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


 データが実際にA1、B1、・・となってはいないと思うので
 まとめ方のルールが分からないです。

 どういったルールなのか説明できますか?

(半平太) 2025/05/01(木) 23:04:44


CSVかはどうかは、無視して

以下と判断すると

 A列にあるデータの各行先頭の番号(例:1, 2, 3)をキーとして、
 同じ番号の行の残りの文字列を結合して、
 シート2に「番号+結合文字列」の形で出力する。

Option Explicit

Sub test()

    Dim wsSrc As Worksheet
    Dim wsDest As Worksheet
    Dim lastRow As Long
    Dim dict As Object
    Dim i As Long
    Dim key As Variant
    Dim parts As Variant
    Dim val As Variant
    Dim outputRow As Long

    Set wsSrc = ThisWorkbook.Sheets("Sheet1") ' 元データ
    Set wsDest = ThisWorkbook.Sheets("Sheet2") ' 出力
    Set dict = CreateObject("Scripting.Dictionary")

    lastRow = wsSrc.Cells(wsSrc.Rows.Count, "A").End(xlUp).Row

    ' データを辞書にまとめる
    For i = 1 To lastRow
        If Trim(wsSrc.Cells(i, 1).Value) <> "" Then
            parts = Split(wsSrc.Cells(i, 1).Value, " ")
            key = parts(0)

            ' 残りの値を結合
            Dim merged As String
            merged = ""
            For Each val In parts
                If val <> key Then
                    merged = merged & " " & val
                End If
            Next val

            If dict.Exists(key) Then
                dict(key) = dict(key) & merged
            Else
                dict.Add key, key & merged
            End If
        End If
    Next i

    ' 出力
    wsDest.Cells.ClearContents
    outputRow = 1
    For Each key In dict.Keys
        wsDest.Cells(outputRow, 1).Value = dict(key)
        outputRow = outputRow + 1
    Next key

    MsgBox "完了 !!"
End Sub

(暇な人) 2025/05/02(金) 05:15:34


 >CSV出力により複数行になるデータ
 CSVファイルを読み込むと、複数行になるデータ と言う意味ですね?
 それの形式を変換したい、ということですね?

 Webページのソースを見ると、データは下記のようです。(誤字修正:ソート→ソース)

 既に指摘がありますように、ルールをご自分の言葉で明記してください。(あとで変更がないようにしてください。)
 また3行ごとの繰り返しがそのあとも同様に続くのですか?それとも全体で6行だけなんですか?
 そこも誤解が生じないようにコメントして下さい。

 (以下は、行番号列番号を追記した、質問文の一部の再掲です)

        A     B     C     D     E     F
 1      1     A1          C1    D1    E1                                  
 2      1           B1    F1    G1    H1                                  
 3      1                 I1    J1    K1                                  
 4      2     A2                                                          
 5      2           B2                                                    
 6      2                 C2    D2    E2                                  
 7      3                                                                 
 8      3                                                                 
 9      3                                                                 

 CSV出力で上記の様な出力を下記のようにまとめたいです。

        A     B     C     D     E     F     G     H     I     J     K     L
 1      1     A1    B1    C1    D1    E1    F1    G1    H1    I1    J1    K1
 2      2     A2    B2    C2    D2    E2 
 3      3

(xyz) 2025/05/02(金) 08:28:19


皆様ありがとうございます。
暇な人様の認識で良いと思うのですが、どのように質問すればよいか分からず・・・すみません。

・レコード番号という番号が有り(今回A列で表した1・2・3の様な物で、先頭ではなく中間にあります。)
 データ内に含まれるテーブル数?により行の数は変動します。
・出力されるデータは60列ぐらいありますが、不必要な部分もある為、必要な部分をレコード番号ごとに一つの行にまとめたいです。

宜しくお願いします。
(たすけて) 2025/05/02(金) 09:55:09


>暇な人様の認識で良いと思うのですが
では(xyz)さんのは認識が違うとでも言うのでしょうか。
>・レコード番号という番号が有り
(xyz)さんのように表形式で説明された方がいいですよ。

(?) 2025/05/02(金) 10:05:45


>先頭ではなく中間にあります

番号の位置が先頭でなく中間との事なので
先頭から何番目とか指定されないと回答は難しい

>不必要な部分もある為

どこが不要なのかの指定は無いのですか?

サンプルデーター(形式)が無い状態では、以後の回答は出来ません。
(暇な人) 2025/05/02(金) 12:35:30


 >同じ番号の行の残りの文字列を結合して、
 という説明どおりだというのであれば、
 A1 C1  D1  E1   B1  F1  G1  H1  I1  J1 K1
 とはならないのですか?
 出鱈目に並べているんじゃなくて一定のルールがあるんでしょうから、
 それをきちんと書いて下さい、と申し上げました。

 回答は期待できないので、私の揣摩臆測に基づくものを書いて、私としての区切りとします。

 (1)
 Sheet2のA1セル
 =LET(
     rng,Sheet1!A1:A100,
     UNIQUE(FILTER(rng,(rng>=1)*(rng<=3)))
 )
 Sheet1!A1:A100
 1(Indexの下限)
 3(Indexの上限) 
 は適宜修正してください。

 (2)
 Sheet2のB1セル
 =LAMBDA(n,
     LET(
         rng,Sheet1!$A$1:$F$100,
         rngA,FILTER(rng,TAKE(rng,,1)=n),
         a,TEXTJOIN("",TRUE,INDEX(rngA,,2)),
         b,TEXTJOIN("",TRUE,INDEX(rngA,,3)),
         rngB,FILTER(DROP(rng,,3),TAKE(rng,,1)=n),
         c,IFERROR(TOROW(rngB,1),""),
         HSTACK(a,b,c)
     )
 )(A1)
 Sheet1!$A$1:$F$100は適宜修正してください。
 これを下にコピー(A列の数だけ)します。

 以上。

(xyz) 2025/05/02(金) 15:13:59


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.