2015-09-24 20 views
1

我從SQL中提取數據,並且需要將某些行轉置到列中,同時複製該表中唯一的其他數據 需要一個讀取公式所有列和粘貼新行並複製數據。 這只是一個例子,取決於我需要在一列中移動多少行的日子。原始數據是50000行 任何建議都歡迎將行轉換爲單列,同時複製其他列中的數據

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... 

以前

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 
+0

你可以用一個類來完成此創建一個用戶定義的對象,並添加日期作爲一個集合。如果列出超過七天,會發生什麼? –

+0

嗨羅恩,謝謝你的答案,但我從來沒有使用過類,我只能寫簡單的查詢, m只是一個功能顧問:)只有7天,但數據存儲爲1-127,我必須將它轉換爲二進制,1是0000001,星期日是127,而127是每週的任何一天。他們是不同日子的組合。我正在將數據導入Netsuite,並且在當前的定製中,每天都必須成爲單獨的一行。感謝您的建議,順便說一句,我會諮詢谷歌,並試圖找出它:) – user3618691

+0

建議你開始芯片皮爾遜的[課程簡介](http://www.cpearson.com/excel/Classes.aspx)。另外,根據您的具體要求,每張工作表可能只有10^6行以上的空間。 –

回答

0

後這裏是一個快速和骯髒的方式做到這一點。這可能需要幾分鐘時間才能運行,但這是處理多行時需要的。

50,000x7 = 350,000行,因此如果您有任何最新版本的Excel,則可以將輸出放在另一個工作表上。我在2010年,行限額爲1,048,576。

這裏假設數據在Sheet1上,我們將它寫出到Sheet2。

在你的VBA IDE中,進入工具菜單並選擇參考。選擇「Microstoft的ActiveX數據對象2.8庫

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

嗨馬修,感謝代碼,但不幸的是它不工作。錯誤多步驟操作產生錯誤。檢查每個狀態值。停在Ln 31 rs.Fields(「Order」)。Value = ws.Range(「A」&lRow).Value任何想法? – user3618691

+0

這可能是一些事情。你有一個標題行嗎,第1行的columnA是否有Order?如果是這樣,則將lRow = 1更改爲lRow = 2。我將rs字段「order」聲明爲整數,這樣會導致多步錯誤。該錯誤基本上意味着你正試圖將一個字符串加載到一個int或類似的東西。如果沒有標題行,訂單號是不是ints?列A中的東西不是int嗎?字符或空白?我們可以改變.Fields.Append「Order」,adInteger to .Fields.Append「Order」,adChar,20 – MatthewD

+0

爲了擴展這一點,'With rs'中字段的定義必須符合您的數據加載到它們中。因此,如果沒有看到數據,我只能猜測要將它們定義爲什麼。多步錯誤意味着我們試圖將數據加載到不符合的字段中。 – MatthewD

0

也許你可以修改你的SQL查詢來直接返回使用UNION的結果,例如:?

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) 
+0

感謝文森特,但我已經連接了7個表以獲得此結果,然後我使用其他查詢並將excel中的數據與INDEX和MATCH中的數據結合在連接字段中。 – user3618691