2016-03-28 31 views
-2

ご協力ください。複数のカンマ区切りの列を行に分割する

私は、この単一の列のために働いてきたが、トリッキーな部分は

例えば、いくつかの列にこれを適用して、顧客IDごとに複数のカンマ区切り値を分割しようとしています ソース

Cust Id | Value 1 | Value 2 
1  | 3,4  | a2,a3 
2  | 1,2,3 | a1,a3,a5 

必要なアウト

Cust Id | Value 1 | Value 2 
1  | 3  | a2 
1  | 4  | a3 
2  | 1  | a1 
2  | 2  | a3 
2  | 3  | a5 

私は1から移入つの整数列が含まれ、ルックアップテーブル使用しようとしている - 区切られた値の最大量であるべきである100を。私はその後、正常に動作した値を分割するには、以下のクエリでこれを使用するが、ただ一つの列

SELECT ID, TRIM(Mid(',' & Value1 & ',',[Entries]+1,Instr([Entries]+1,',' & Value1 & ',',',')-([Entries]+1))) AS Split 
FROM MyTable 
WHERE Entries=Instr(Entries,',' & Value1 & ',',',') And Entries<len(',' & Value1) 
+3

これまでに何を試しましたか?列全体をループし、Cust ID番号を取得し、「値1」と「値2」を配列に分割する必要があります。その後、IDごとの数を別のシートに数えて書きます。それはあなたが望むものを達成するための大まかな論理です。 –

+0

こんにちはデイビー、すばやい応答をいただきありがとうございます。私は単一の列のために働いているループを実装しようとしましたが、私はいくつかの列にこれを適用するのに苦労しています。私のVBA is not最高ですので、列をまたいだループのコードスニペットは非常に評価されます。 – Barracuda

+1

元の投稿で試したことを投稿してみませんか?これは、私たちを助ける出発点になるでしょう。 –

答えて

0

ためValue 1Value 2分野におけるカンマの数が同じであると仮定すると、ここでの考え方は次のとおりです。

'needs reference to MS ActiveX Data Objects xxx Library 
Sub SplitData() 

Dim oRst As ADODB.Recordset 
Dim sSQL As String, oVars1 As Variant, oVars2 As Variant 
Dim i As Integer 

On Error GoTo Err_SplitData 

sSQL = "SELECT * FROM Customers;" 

Set oRst = New ADODB.Recordset 
With oRst 
    'open recordset 
    .Open sSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly 
    'fill-in recordset 
    .MoveLast 
    .MoveFirst 
    'loop through the records in Customers table 
    Do While Not .EOF 
     'split data 
     oVars1 = Split(.Fields("Value1").Value, ",") 
     oVars2 = Split(.Fields("Value2").Value, ",") 
     'loop through the splited data 
     For i = 0 To UBound(oVars1) 
      'improve this piece of code 
      ' 
      'only for example - print data 
      Debug.Print .Fields("CustID"), oVars1(i), oVars2(i) 

     Next 
     .MoveNext 
    Loop 
    .Close 
End With 

Exit_SplitData: 
    On Error Resume Next 
    Set oRst = Nothing 
    Exit Sub 

Err_SplitData: 
    MsgBox Err.Number, vbExclamation, Err.Number 
    Resume Exit_SplitData 

End Sub 
+0

申し訳ありませんが、私は質問を更新しました。ありがとうMaciej、はい、各列のコンマの数は同じでなければなりません。私は上記の提案を試し、私はどのように乗り遅れているかを知らせます。これまでのご協力ありがとうございました。 – Barracuda

0

マチェイ」答えはよさそうだが、私はすでにあなたのための答えに働いていたとして、私は先に行くと、とにかくそれを投稿します。

Option Explicit 

Sub FncCreateOutput() 

    Dim rowCount As Long 
    Dim custID As Long 
    Dim value1Str As Variant 
    Dim value2Str As Variant 

    Sheets("Input").Select 

    'We start at row two as this is a header line 
    rowCount = 2 

    Do While Range("A" & rowCount).Value <> "" 

     'Reselect the Input sheet - it will have been deselected by previous calls to 'FncWriteIDValues()' 
     Sheets("Input").Select 

     custID = Range("A" & rowCount).Value 
     value1Str = Split(Range("B" & rowCount).Value, ",") 
     value2Str = Split(Range("C" & rowCount).Value, ",") 

     'You need to check that you have the same count of values in the two variant arrays 
     If UBound(value1Str) <> UBound(value2Str) Then 

      Stop 

     Else 

      'They match so we can now pass this information to a function that will write to another sheet 
      Call FncWriteIDValues(custID, value1Str, value2Str) 

     End If 
     rowCount = rowCount + 1 

    Loop 

End Sub 

Private Function FncWriteIDValues(id As Long, val1 As Variant, val2 As Variant) 

    Dim totalRows As Long 
    Dim i As Integer 

    Sheets("Output").Select 

    'Get the total rows in the 'Ouput' sheet used so far 
    totalRows = ActiveSheet.UsedRange.Rows.count 

    Do While i <= UBound(val1) 

     Range("A" & totalRows + 1).Value = id 
     Range("B" & totalRows + 1).Value = val1(i) 
     Range("c" & totalRows + 1).Value = val2(i) 
     i = i + 1 
     totalRows = totalRows + 1 
    Loop 

End Function 

Excelでは、「入力」と「出力」という2つのシートを作成します。あなたの "入力"シートでは、ヘッダーとデータを入れ、 "出力"の行1のヘッダー行だけを入力します。コードは残りの処理を行います。

+1

上記の提案に対してもう一度お礼を申し上げますが、そのような迅速な対応が期待できませんでした。私はMaciejコードとそれを完璧に実装することができました。# – Barracuda

+1

あなたの質問に答えたMaciejの答えを正しいものとしてマークすることを忘れないでください。 –

関連する問題