2016-03-28 29 views
-2

Lütfen Yardım. Müşteri kimliği başına birkaç virgülle ayrılmış değerler bölmek çalışıyorumBirden Çok Virgülle ayrılmış sütun Satırlara Satır

, ben bu tek bir sütun için çalışan ama zor kısmı birkaç sütun

mesela bu uyguluyor Kaynak

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

Gerekli dışarı

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

1 arasındadır doldurulan tek bir tam sayı sütun içeren bir arama tablosu kullanılarak çalışılmıştır - ayrılmış değerler maksimum miktar olmalıdır 100. Sonra çalışıyor değerlerini bölmek için aşağıdaki sorguda bu kullanılan ancak tek bir sütunla

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

Şimdiye kadar neler denediniz? Sütunlar arasında geçiş yapmanız, Cust ID numaralarını almanız ve "Değer 1" ile "Değer 2" yi dizilere ayırmanız gerekir. Daha sonra, ayrı bir sayfaya kaç tane kimlik verildiğine göre yazınız. İstediğin şeyi elde etmenin kaba mantığı bu olurdu. –

+0

Merhaba Davy, hızlı yanıt için teşekkürler. Tek bir sütun için çalıştığım bir döngü uygulamayı denedim, ancak bunu birkaç sütun üzerinde uygulamak için uğraşıyorum. benim vba en iyisi değil, bu yüzden sütunlar arasında döngü yapmak için herhangi bir kod parçacığı çok apreciated olurdu. – Barracuda

+1

Neden asıl gönderide denediklerinizi yayınlamıyorsunuz? Bu bize yardım edecek bir başlangıç ​​noktası verecektir. –

cevap

0

için Value 1 ve Value 2 alanlarda virgül sayımı aynı olduğunu varsayarsak, burada bir fikirdir:

'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

Soruyu önerilen şekilde güncelledim özür dilerim. Teşekkürler Maciej, evet her sütundaki virgüllerin sayısı aynı olmalıdır. Yukarıdaki öneriyi deneyeceğim ve nasıl devam ettiğimi anlatayım. Şimdiye kadar yardım için hepinize teşekkür ederim. – Barracuda

0

Maciej' cevabı iyi görünüyor, ama ben zaten sizin için bir cevap üzerinde çalışmış olarak, devam edecek ve yine de göndermek:

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'de, "Giriş" olarak adlandırılan ve "Çıkış" olarak adlandırılan iki sayfa oluşturursunuz. "Giriş" sayfanızda, üstbilgiyi ve verileri ve "Çıkış" da, satır 1'deki başlık satırını koyun. Kod geri kalanını yapacaktır.

+1

Söz konusu öneriler için tekrar teşekkürler, böyle hızlı bir cevap beklemiyordum. Maciej kodunu ve çalışmasını mükemmel bir şekilde gerçekleştirmeyi başardım. # – Barracuda

+1

Sorunuzu cevapladıysa Maciej'in cevabını doğru olarak işaretlemeyi unutmayın. –

İlgili konular