chuway wrote:
每個月一個檔嗎?
他要的大概是像這樣,一個檔案佔一個access資料表(table)





'簡易範例,請參考
'測試用access資料庫,請自行照上面圖片的格式建立(名稱暫訂test.accdb),存放位置同excel檔
'程式碼打完後,需先存檔關閉後再開
Sub List_All_Table()
Dim DB As Object, RS As Object, All_Table As Object, Table, Skip_Table, Sql As String, lastrow As Double, ttt As Double
Set DB = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")
Set All_Table = CreateObject("ADOX.catalog")
DB.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & ThisWorkbook.Path & "\test.accdb" & ";"
All_Table.ActiveConnection = DB
Cells.Clear
Application.ScreenUpdating = False
Skip_Table = Array("資料表1", "資料表2") '跳過格式不同的表格,(,逗點隔開)
查詢 = "aaa" '暫訂查收件人
lastrow = 1
Sql = ""
Range("a1:c1") = Array(查詢, "日期", "單號")
ttt = Timer
If All_Table.tables.Count < 50 Then
'少量資料表 UNION ALL,只需使用sql查詢1次
For i = 0 To All_Table.tables.Count - 1
If All_Table.tables.Item(i).Type = "TABLE" And Join(Filter(Skip_Table, All_Table.tables.Item(i).Name)) = "" Then
Sql = Sql & "SELECT 日期,單號 from " & All_Table.tables.Item(i).Name & " WHERE 收件人='" & 查詢 & "'" & " UNION ALL "
End If
Next i
Sql = Left(Sql, Len(Sql) - 11)
RS.Open Sql, DB, 3, 3
Cells(lastrow + 1, 2).CopyFromRecordset RS
RS.Close
Else
'大量資料表,N次sql查詢
For i = 0 To All_Table.tables.Count - 1
If All_Table.tables.Item(i).Type = "TABLE" And Join(Filter(Skip_Table, All_Table.tables.Item(i).Name)) = "" Then
Sql = "SELECT 日期,單號 from " & All_Table.tables.Item(i).Name & " WHERE 收件人='" & 查詢 & "'"
RS.Open Sql, DB, 3, 3
Cells(lastrow + 1, 2).CopyFromRecordset RS
lastrow = lastrow + RS.RecordCount
RS.Close
End If
Next i
End If
Debug.Print Timer - ttt & "s"
Application.ScreenUpdating = True
DB.Close
Set All_Table = Nothing
Set DB = Nothing
Set RS = Nothing
End Sub
但這種會根據日期、時間,累加性質的資料
且資料表名稱跟似乎內容沒什麼關係,是多餘的分類
單純是資料內容搜尋,無法用關聯性查詢
分類太多,反而會對查詢速度造成影響
少量資料表,還可以用 UNION ALL 來合併查詢
但如果是大量資料表+查詢條件多,那查詢速度會變的很慘
建議一個比較簡單又不影響速度的方法
=>全部資料放在同一個資料表,一直新增下去(理由同5樓)
之後要做什麼分類、月、年、時間、寄件人... 之類的報表,再用sql查詢產生就好