Wyodrębniam dane z SQL i niektórych wierszymuszą być transponowane do kolumny podczas kopiowania innych danych, które są unikalne dla tej tabeli Potrzebujesz formuły, aby przeczytać wszystkie kolumny i wkleić nowe wiersze i skopiować dane. To tylko przykład, w zależności od tego, ile razy będę musiał przetransponować tyle wierszy w jednej kolumnie. Dane oryginalne to 50 000 wierszy Wszelkie sugestie są mile widziane
Przed
Order Line Item Day Day2 Day3 Day4 Day5 Day6 Day7
2000 1 Apple Mon Tue Wed Fri Sat Sun
2000 2 Orange Mon Thu Sun
etc...
Po
Order Line Item Day
2000 1 Apple Mon
2000 1 Apple Tue
2000 1 Apple Wed
2000 1 Apple Fri
2000 1 Apple Sat
2000 1 Apple Sun
2000 2 Orange Mon
2000 2 Orange Thu
2000 2 Orange Sun
Odpowiedzi:
0 dla odpowiedzi № 1Oto szybki i brudny sposób na zrobienie tego. Może to potrwać kilka minut, ale to właśnie zajmuje, gdy mamy do czynienia z wieloma wierszami.
50 000 x 7 = 350 000 wierszy, więc możesz umieścić dane wyjściowe w innym arkuszu, jeśli masz najnowszą wersję programu Excel. Jestem w 2010 roku, a limit rzędu wynosi 1 048 576.
Zakłada to, że dane znajdują się na Arkuszu 1, a my zapiszemy je do Arkusza2.
W tobie VBA IDE przejdź do menu narzędzi i wybierz referencje. Wybierz "Obiekty danych Microstoft ActiveX 2.8 Library.
Private Sub CommandButton1_Click()
Dim ws As Excel.Worksheet
Dim rs As New ADODB.Recordset
Dim lRow As Long
"Add fields to your recordset for storing data. This is how we will store the original data so we can process it after we read it.
With rs
.Fields.Append "Order", adInteger
.Fields.Append "Line", adInteger
.Fields.Append "Item", adChar, 25
.Fields.Append "Day", adChar, 10
.Fields.Append "Day2", adChar, 10
.Fields.Append "Day3", adChar, 10
.Fields.Append "Day4", adChar, 10
.Fields.Append "Day5", adChar, 10
.Fields.Append "Day6", adChar, 10
.Fields.Append "Day7", adChar, 10
.Open
End With
lRow = 2 "Start at two if there is a header row...
Set ws = ActiveWorkbook.Sheets("Sheet1")
ws.Activate
"Loop through the rows and record the data
Do While lRow <= ws.UsedRange.Rows.count
If ws.Range("A" & lRow).Value <> "" Then
rs.AddNew
rs.Fields("Order").Value = ws.Range("A" & lRow).Value
rs.Fields("Line").Value = ws.Range("B" & lRow).Value
rs.Fields("Item").Value = ws.Range("C" & lRow).Value
rs.Fields("Day").Value = ws.Range("D" & lRow).Value
rs.Fields("Day2").Value = ws.Range("E" & lRow).Value
rs.Fields("Day3").Value = ws.Range("F" & lRow).Value
rs.Fields("Day4").Value = ws.Range("G" & lRow).Value
rs.Fields("Day5").Value = ws.Range("H" & lRow).Value
rs.Fields("Day6").Value = ws.Range("I" & lRow).Value
rs.Fields("Day7").Value = ws.Range("J" & lRow).Value
rs.Update
End If
lRow = lRow + 1
ws.Range("A" & lRow).Activate
Loop
"Switch to the second worksheet
Set ws = Nothing
Set ws = ActiveWorkbook.Sheets("Sheet2")
ws.Activate
lRow = 1
If rs.RecordCount > 0 Then
rs.MoveFirst
End If
Do While rs.EOF = False
If Trim(rs.Fields("Day").Value) <> "" Then
ws.Range("A" & lRow).Value = rs.Fields("Order").Value
ws.Range("B" & lRow).Value = rs.Fields("Line").Value
ws.Range("C" & lRow).Value = rs.Fields("Item").Value
ws.Range("D" & lRow).Value = rs.Fields("Day").Value
lRow = lRow + 1
End If
If Trim(rs.Fields("Day2").Value) <> "" Then
ws.Range("A" & lRow).Value = rs.Fields("Order").Value
ws.Range("B" & lRow).Value = rs.Fields("Line").Value
ws.Range("C" & lRow).Value = rs.Fields("Item").Value
ws.Range("D" & lRow).Value = rs.Fields("Day2").Value
lRow = lRow + 1
End If
If Trim(rs.Fields("Day3").Value) <> "" Then
ws.Range("A" & lRow).Value = rs.Fields("Order").Value
ws.Range("B" & lRow).Value = rs.Fields("Line").Value
ws.Range("C" & lRow).Value = rs.Fields("Item").Value
ws.Range("D" & lRow).Value = rs.Fields("Day3").Value
lRow = lRow + 1
End If
If Trim(rs.Fields("Day4").Value) <> "" Then
ws.Range("A" & lRow).Value = rs.Fields("Order").Value
ws.Range("B" & lRow).Value = rs.Fields("Line").Value
ws.Range("C" & lRow).Value = rs.Fields("Item").Value
ws.Range("D" & lRow).Value = rs.Fields("Day4").Value
lRow = lRow + 1
End If
If Trim(rs.Fields("Day5").Value) <> "" Then
ws.Range("A" & lRow).Value = rs.Fields("Order").Value
ws.Range("B" & lRow).Value = rs.Fields("Line").Value
ws.Range("C" & lRow).Value = rs.Fields("Item").Value
ws.Range("D" & lRow).Value = rs.Fields("Day5").Value
lRow = lRow + 1
End If
If Trim(rs.Fields("Day6").Value) <> "" Then
ws.Range("A" & lRow).Value = rs.Fields("Order").Value
ws.Range("B" & lRow).Value = rs.Fields("Line").Value
ws.Range("C" & lRow).Value = rs.Fields("Item").Value
ws.Range("D" & lRow).Value = rs.Fields("Day6").Value
lRow = lRow + 1
End If
If Trim(rs.Fields("Day7").Value) <> "" Then
ws.Range("A" & lRow).Value = rs.Fields("Order").Value
ws.Range("B" & lRow).Value = rs.Fields("Line").Value
ws.Range("C" & lRow).Value = rs.Fields("Item").Value
ws.Range("D" & lRow).Value = rs.Fields("Day7").Value
lRow = lRow + 1
End If
ws.Range("A" & lRow).Activate
rs.MoveNext
Loop
End Sub
0 dla odpowiedzi nr 2
Może możesz zmodyfikować zapytanie SQL, aby bezpośrednio zwrócić wyniki używając UNION, na przykład? :
SELECT "Order", Line, Item, Day1 AS Day
FROM Table1 as T1
WHERE NOT IsNull(Day1)
UNION
SELECT "Order", Line, Item, Day2 AS Day
FROM Table1
WHERE NOT IsNull(Day2)
UNION
SELECT "Order", Line, Item, Day3 AS Day
FROM Table1
WHERE NOT IsNull(Day3)
UNION
SELECT "Order", Line, Item, Day4 AS Day
FROM Table1
WHERE NOT IsNull(Day4)
UNION
SELECT "Order", Line, Item, Day5 AS Day
FROM Table1
WHERE NOT IsNull(Day5)
UNION
SELECT "Order", Line, Item, Day6 AS Day
FROM Table1
WHERE NOT IsNull(Day6)
UNION
SELECT "Order", Line, Item, Day7 AS Day
FROM Table1
WHERE NOT IsNull(Day7)