2013-06-27 33 views
0

我在Excel表中有一些數據,我試圖讓這些數據訪問。但數據真的很糟糕。這就是excel所具有的。在訪問或宏中排列數據

國家,產品ID,1qtr 2010閃光燈,2qtr 2010閃光燈,3qtr 2010閃光燈,4qtr 2010閃光燈, 1qtr 2011年財政預算等....

現在你可以看到這是一個非常不好的數據存儲方式。我想在這個表上運行一些查詢,但是對於當前的模式來說這很困難,因爲每年都會添加新的列。

我想一些辦法(可能是一些SQL查詢),這將更好地結構創建這些數據的新表,如下面

國家,產品ID,價值,年份,QTR,類型

希望你明白我的觀點。任何人都可以給我建議無論是在Access或Excel中

+0

請解釋你的數據是如何拆分成行和列的。也許你所顯示的所有數據都在一個單元中,但是我們無法從你的描述中看出來。 –

+0

確定一行可能是...美國,筆記本電腦,o-123,100 $,200 $,300 $ ....等 – SAM244776

+0

因爲你可以看到它的國家,產品,身份證,那麼基於季度的價值的年份和類型的價值,如預算或閃存.. – SAM244776

回答

0

你所尋求的解決方案的一般形式的一些方法是使用UNION查詢,像這樣:

SELECT [country], [product], [id], 
    [1qtr 2010 flash] AS [Value], 
    2010 AS [Year], 
    1 AS [Qtr], 
    "flash" AS [Type] 
FROM ImportedTable 
UNION ALL 
SELECT [country], [product], [id], 
    [2qtr 2010 flash] AS [Value], 
    2010 AS [Year], 
    2 AS [Qtr], 
    "flash" AS [Type] 
FROM ImportedTable 
UNION ALL 
SELECT [country], [product], [id], 
    [3qtr 2010 flash] AS [Value], 
    2010 AS [Year], 
    3 AS [Qtr], 
    "flash" AS [Type] 
FROM ImportedTable 
... 

你可以保存這樣的查詢與像[ReformatDataFromExcel]這樣的名稱,那麼當您導入具有新列的更新Excel饋送時,您可以根據需要通過複製和粘貼新的UNION ALL子句來更新查詢。

- 編輯 -

或者,如果你想建立通過代碼然後一些VBA這樣的SQL查詢字符串...

Sub BuildQueries() 
Dim cdb As DAO.Database, fld As DAO.Field, sSQL As String 
Dim sYear As String, sQtr As String, sType As String, a() As String 
Set cdb = CurrentDb 
For Each fld In cdb.TableDefs("ImportedTable").Fields 
    Select Case fld.Name 
     Case "country", "product", "id" 
      ' do nothing 
     Case Else 
      a = Split(fld.Name, " ", -1, vbBinaryCompare) 
      sQtr = Left(a(0), 1) 
      sYear = a(1) 
      sType = a(2) 
      sSQL = _ 
        "SELECT [country], [product], [id], " & _ 
        "[" & fld.Name & "] AS [Value], " & _ 
        sYear & " AS [Year], " & _ 
        sQtr & " AS [Qtr], " & _ 
        """" & sType & """ AS [Type] " & _ 
        "FROM ImportedTable" 
      Debug.Print sSQL ' or whatever you want to do with the query 
    End Select 
Next 
Set fld = Nothing 
Set cdb = Nothing 
End Sub 

...可以建立SQL字符串像這個:

SELECT [country], [product], [id], [1qtr 2010 flash] AS [Value], 2010 AS [Year], 1 AS [Qtr], "flash" AS [Type] FROM ImportedTable 
SELECT [country], [product], [id], [2qtr 2010 flash] AS [Value], 2010 AS [Year], 2 AS [Qtr], "flash" AS [Type] FROM ImportedTable 
SELECT [country], [product], [id], [3qtr 2010 flash] AS [Value], 2010 AS [Year], 3 AS [Qtr], "flash" AS [Type] FROM ImportedTable 
SELECT [country], [product], [id], [4qtr 2010 flash] AS [Value], 2010 AS [Year], 4 AS [Qtr], "flash" AS [Type] FROM ImportedTable 
SELECT [country], [product], [id], [1qtr 2011 budget] AS [Value], 2011 AS [Year], 1 AS [Qtr], "budget" AS [Type] FROM ImportedTable 
SELECT [country], [product], [id], [2qtr 2011 budget] AS [Value], 2011 AS [Year], 2 AS [Qtr], "budget" AS [Type] FROM ImportedTable 
SELECT [country], [product], [id], [3qtr 2011 budget] AS [Value], 2011 AS [Year], 3 AS [Qtr], "budget" AS [Type] FROM ImportedTable 
SELECT [country], [product], [id], [4qtr 2011 budget] AS [Value], 2011 AS [Year], 4 AS [Qtr], "budget" AS [Type] FROM ImportedTable 
+0

是的,我喜歡這個想法......唯一的問題是創建的表格,因爲聯合不能作爲數據透視表導出回excel ......但我可以編寫4-5個小查詢,這些查詢可以完成上述操作,另一個在宏... – SAM244776

+0

有沒有一種方法讓我循環通過數據並根據一些字符串操作動態設置qtr,年等等? – SAM244776

+0

@ user2472382是的,你可以做那樣的事情。查看此答案的更新。 –