4

アイテムのリストを含むテーブルがあります。基本的に、これは問題追跡ツールからのエクスポートです。そのテーブルの列の 1 つに、カンマ区切りの値が含まれています。複数値エントリの個々の値に対して個別のエントリを作成する方法を探しています。

例: (これは単純化された例であり、実際のケースには約 12 の列が含まれています)

ソースデータ:

ID | Title          |  Areas Affected  |  
1  | Issue title A  |  Area X, Area Y  |  
2  | Issue title B  |  Area Y, Area Z  |  
3  | Issue title C  |  Area X, Area Z  |  

私が到達しようとしているもの:

ID | Title          |  Areas Affected  |   
1  | Issue title A  |  Area X          |  
1  | Issue title A  |  Area Y          |  
2  | Issue title B  |  Area Y          |  
2  | Issue title B  |  Area Z          |  
3  | Issue title C  |  Area X          |  
3  | Issue title C  |  Area Z          |  

IDとタイトルが重複していても大丈夫ですか?

これを実現する数式、マクロ、または VBA スクリプトはありますか?

4

2 に答える 2

2

コンマを区切り記号として使用して、その列の行を分割する必要があります。VBA には、配列を返すために使用できる Split() 関数があります。最初の要素については、リストがあったセルに戻します。他のものについては、配列内の要素ごとに新しい行を挿入し (コンマ区切りのリストに n 個の要素を含めることができることを意味します)、その新しい行に行全体をコピーし、そこに i 番目の値を入れます。

于 2012-11-28T15:25:58.887 に答える
1

サンプルコードを読んだり調べたりした後、誰かが必要な場合の答えは次のとおりです。これは実際の作業コードであり、質問に投稿した例に 1:1 では適合しません。

Sub DataLobs()
    Application.ScreenUpdating = False 'Nice to have to increase the script speed. 

    Dim wsSrc As Worksheet
    Dim wsDst As Worksheet
    Dim curRowSrc As Integer
    Dim curRowDst As Integer
    Dim ttlRows As Integer
    Dim splitLob() As String

    ' Setting initial values to start rows in source and destination
    ' tables, as well as the total number of rows
    curRowSrc = 5
    curRowDst = 5
    ttlRows = 10000

    Set wsSrc = Worksheets("Source") 'whatever you worksheet is
    Set wsDst = Worksheets("Destination") 'or whatever your worksheet is called

    wsDst.Range("A5:F" & ttlRows).Clear

    ' Goes through column D in the source table
    ' and copies rows where the D cell is not blank
    ' into the destination table
    For curRowSrc = 5 To ttlRows
        If wsSrc.Range("D" & curRowSrc).Value <> "" Then ' There are some blank cells in the source table, so we are eliminating them.

            ' Split the cell value against the comma
            splitLob = Split(wsSrc.Range("D" & curRowSrc).Value, ", ") 'THIS IS WHERE @AlexandreP.Levasseur's HINT COMES INTO PLAY!

            For i = LBound(splitLob) To UBound(splitLob)
                wsDst.Range("A" & curRowDst).Value = splitLob(i)
                wsDst.Range("B" & curRowDst).Value = wsSrc.Range("A" & curRowSrc)
                wsDst.Range("C" & curRowDst).Value = wsSrc.Range("C" & curRowSrc)
                wsDst.Range("D" & curRowDst).Value = wsSrc.Range("AC" & curRowSrc)
                wsDst.Range("E" & curRowDst).Value = wsSrc.Range("AE" & curRowSrc)
                wsDst.Range("F" & curRowDst).Value = wsSrc.Range("AD" & curRowSrc)
                curRowDst = curRowDst + 1
            Next
        End If
    Next curRowSrc
End Sub
于 2012-11-29T21:12:20.370 に答える