-
Link tất các table trong một file.mdb bằng VBA
MinhnHang > 29-11-16, 10:18 AM
Gửi Anh/Chị.
Chuyện link lẻ từng table trong file QL.mdb đến table cùng tên trong file Data.mdb thì em đã rành khi áp dụng VBA.
Nhưng khổ cái lỗi là, trong Data.mdb kia của em có đến 30 cái table, nhưng giờ em ngồi gõ thêm vào đoạn code kết nối cho file QL.mdb thì rất là mất thời gian.
Anh/Chị cho em gợi ý hoặc có bản demo là tốt nhất để xử: Chỉ 1 đoạn code mà có thể tự link tất cả các table có trong Data.mdb; được thêm tính năng "tự động" link khi em tạo table mới trong data.mdb thì file QL.mdb kia cũng tự động tìm đến mà link thì tốt nhất ạ.
Em cảm ơn rất nhiều ạ. -
RE: Link tất các table trong một file.mdb bằng VBA
lehongduc > 29-11-16, 10:56 AM
Chào Bạn,
Thay vì gửi cho Bạn 1 đoạn code ngắn để link tất cả các bảng từ 1 database nằm ngoài, tôi sẽ gợi ý cho Bạn thực hiện thông qua kịch bản như sau:
1. Khai báo Database nguồn mà Bạn định link tất cả bảng trong nó vào.
2. Duyệt từng đối tượng tables trong Database nguồn để link vào.
Đơn giản vậy thôi Bạn à.
Như vậy, Bạn sẽ phải tự tìm hiểu để biết cách:
1. Khai báo Database nguồn như thế nào
2. Và bằng cách nào để duyệt từng đối tượng trong Database nguồn.
Tự tìm hiểu và xác định được cách làm sẽ giúp Bạn ghi nhớ rất lâu. Tôi khuyên Bạn nên làm thế, đừng "cầu viện" một đoạn code sẵn có, sẽ là hại nhiều hơn lợi.
Với Internet trong tay thì nhanh nhất là Bạn hỏi Ông Thầy Gu-Gồ. Thí dụ: tôi hỏi ổng ngắn gọn thế này "how to link tables with access vba", và tìm tìm được bài chỉ dẫn tận tường của Bác Bill ở link sau: https://msdn.microsoft.com/en-us/library/cc722917.aspx
Chúc Bạn thành công. -
RE: Link tất các table trong một file.mdb bằng VBA
MinhnHang > 29-11-16, 11:13 AM
Cảm ơn anh lehongduc rất nhiều ạ.
Em đã google nhiều câu từ rồi nhưng chưa tìm ra kết quả, giờ em học thêm câu từ nữa từ gợi ý của anh.
Em cũng đã từng viếng thăm đường link giống như anh gửi nhưng em chưa hiểu hết ạ.
Em nghiên cứu thêm, không hiểu thì em hỏi tiếp nhé. -
RE: Link tất các table trong một file.mdb bằng VBA
maidinhdan > 29-11-16, 11:54 AM
(29-11-16, 11:13 AM)MinhnHang Đã viết: Cảm ơn anh lehongduc rất nhiều ạ.
Em đã google nhiều câu từ rồi nhưng chưa tìm ra kết quả, giờ em học thêm câu từ nữa từ gợi ý của anh.
Em cũng đã từng viếng thăm đường link giống như anh gửi nhưng em chưa hiểu hết ạ.
Em nghiên cứu thêm, không hiểu thì em hỏi tiếp nhé.
Trước tiên xin gửi lời cảm ơn anh lehongduc, kịch bản hướng dẫn đó rất hay và thích hợp với bạn minhhang, nhưng bạn vẫn chưa hiểu mình xin bổ sung vài ý để bạn tìm hiểu, nếu không được nửa mình sẽ viết cho bạn 1 bài hướng dẫn kèm theo đoan code.
Tìm hiểu tuần tự các bước như sau
1. Tạo 1 phiên làm việc để kết nối đến data backend của bạn
Mã PHP:Dim Ws As DAO.Workspaces
Dim db As DAO.Database
Set Ws = DBEngine.Workspaces(0)
'Mo ket noi Data co Pass
Set db = Ws.OpenDatabase("Duongdandenfilecuaban", False, False, "Pass data neu co")
2. Tạo 1 đoạn hàm để liệt kê tất cả tên các table ( trên diễn đàn mình có đoạn code này)
.... đã viết xong nhưng không gửi code sợ bạn tìm hiểu lâu nên mình post cho bạn tìm hiểu: Đây là hàm tôi làm để liệt kê tên tất cả table ngoại trừ tên table của hệ thống.
Mã PHP:Public Function LKTenBang() As String
Dim DB As DAO.Database, i As Integer
Set DB = CurrentDb
Dim s As String
For i = 0 To DB.TableDefs.Count - 1
If Left(DB.TableDefs(i).Name, 4) <> "MSys" Then
Debug.Print DB.TableDefs(i).Name
End If
Next i
End Function
Bạn tạo Modules chạy thử hàm này nhiều lần rồi quan sát nó áp dụng cho file đang mở, nếu là data backend thì bạn thay 2 dòng đầu tiên vào là chạy
* Chú ý: Debug.Print là câu lệnh dùng để in ra màn hình ở giao diện chạy code Immedite, ở dòng này bạn sẽ chèn bước 3 ( link table vào)
3. Dựa trên code link table từng cái của bạn, bạn sẽ dùng vòng lặp nạp tên tất cả table tại bước 2 vào đây.
Thân ái! -
RE: Link tất các table trong một file.mdb bằng VBA
MinhnHang > 29-11-16, 01:49 PM
Và đây là đoạn code em đang dùng để link table ạ.
Option Compare Database
'create connections to SQL tables with DAO
Public Sub daoCreateSQLTables()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strConnect As String
On Error GoTo errblock
'SQL Server connection string
strConnect = ";DATABASE=E:\HRM\Data.accdb" & ";" & "PWD=123;"
'set the database and the local name of the SQL Table
Set db = CurrentDb
Set tdf = db.CreateTableDef("tblHR")
'set the SQL Source Table name
tdf.SourceTableName = "tblHR"
tdf.Connect = strConnect
db.TableDefs.Append tdf
'Refresh the database and the Access application to make the new table show up
db.TableDefs.Refresh
Application.RefreshDatabaseWindow
Set tdf = Nothing
Set db = Nothing
Exit Sub
errblock:
MsgBox Err.Description
Exit Sub
End Sub
Và giờ thì em "biên dịch" đoạn code anh maidinhdan hướng dẫn cho ứng dụng của em, nhưng chưa chạy được (tính từ ngay sau lúc anh hướng dẫn).
Phiền anh xem xem đoạn code của em có ổn không ạ? Và có dùng để "biến hóa link tất cả" được không ạ?
Em cảm ơn nhiều! -
RE: Link tất các table trong một file.mdb bằng VBA
MinhnHang > 29-11-16, 04:11 PM
Em đã thay đoạn code trên bằng các dòng sau:
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
MyPass = ""
MyPath = "E:\HRM\"
' Delete links so there won't be any duplicates
For Each tdf In CurrentDb.TableDefs
If Left(tdf.Name, 4) <> "MSys" And Left(tdf.Name, 15) <> "*" And (tdf.Attributes And dbAttachedTable) = dbAttachedTable Then
CurrentDb.TableDefs.Delete tdf.Name
End If
Next tdf
Set tdf = Nothing
' Setup Links
Set dbs = OpenDatabase(MyPath & "table.accdb", False, False, "MS Access;PWD=" & MyPass)
For Each tdf In dbs.TableDefs
If Left(tdf.Name, 4) <> "msys" Then
TableName = tdf.Name
Set tdf = CurrentDb.CreateTableDef(TableName)
tdf.Connect = ";PWD=" & MyPass & ";Database=" + MyPath + "table.accdb"
tdf.SourceTableName = TableName
CurrentDb.TableDefs.Append tdf
End If
Next
Và thấy là If Left(tdf.Name, 4) <> "MSys" And Left(tdf.Name, 15) <> "*" And (tdf.Attributes And dbAttachedTable) = dbAttachedTable Then đã giúp em link tất cả cái gì có trong file table.accdb.
Tuy nhiên, em cần thêm lời góp ý từ các anh để hoàn thiện hợn ạ.
Em cảm ơn! -
RE: Link tất các table trong một file.mdb bằng VBA
MinhnHang > 29-11-16, 05:18 PM
Đoạn trên đúng với database không có password. Nhưng khi em đặt password cho table.accdb là 123 thì nó báo lỗi ở dòng
Set dbs = OpenDatabase(MyPath & "table.accdb", False, False, "MS Access;PWD=" & MyPass)
(Dĩ nhiên là em đã cho MyPass = "123")
Em xin sự trợ giúp vấn đề này ạ.
Thanks All! -
RE: Link tất các table trong một file.mdb bằng VBA
maidinhdan > 08-12-16, 11:59 AM
(29-11-16, 05:18 PM)MinhnHang Đã viết: Đoạn trên đúng với database không có password. Nhưng khi em đặt password cho table.accdb là 123 thì nó báo lỗi ở dòng
Set dbs = OpenDatabase(MyPath & "table.accdb", False, False, "MS Access;PWD=" & MyPass)
(Dĩ nhiên là em đã cho MyPass = "123")
Em xin sự trợ giúp vấn đề này ạ.
Thanks All!
Bạn làm đến đâu rồi, vài hôm nay minh bận không xem kịp để trả lời cho bạn được.
Mình xin đề nghị bạn hỏi lại tất cả 1 lần những gì còn vướn để mình trao đổi với bạn luôn.
Riêng ý này mình đề nghị bạn đặt MyPass="MS Access;PWD=123"
và MyPath & "table.accdb" cũng thế,
* Thông thường tôi Public/Private Đườngdẫn, và Pass cho nên khi tôi gọi hàm nó sẽ thế này
Thân mến!Mã PHP:Set DB = Ws.OpenDatabase(PathData, False, False, PassData)
-
RE: Link tất các table trong một file.mdb bằng VBA
MinhnHang > 09-12-16, 09:38 AM
Đây là đoạn code em đang dùng.
Public Sub LinkDatabase1() 'Current database
Dim dbsDatabase1 As DAO.Database
Dim tdfDatabase1 As DAO.TableDef
MyPassDatabase1 = "MS Access;PWD=123"
MyPathDatabase1 = "D:\HRM\Database\"
' Delete links so there won't be any duplicates
For Each tdfDatabase1 In CurrentDb.TableDefs
If Left(tdfDatabase1.Name, 4) <> "MSys" And Left(tdfDatabase1.Name, 15) <> "*" And (tdfDatabase1.Attributes And dbAttachedTable) = dbAttachedTable Then
CurrentDb.TableDefs.Delete tdfDatabase1.Name
End If
Next tdfDatabase1
Set tdfDatabase1 = Nothing
' Setup Links
Set dbsDatabase1 = OpenDatabase(MyPathDatabase1 & "Database1.accdb", False, False, MyPassDatabase1)
For Each tdfDatabase1 In dbsDatabase1.TableDefs
If Left(tdfDatabase1.Name, 4) <> "msys" Then
TableName = tdfDatabase1.Name
Set tdfDatabase1 = CurrentDb.CreateTableDef(TableName)
tdfDatabase1.Connect = ";PWD=" & MyPassDatabase1 & ";Database=" + MyPathDatabase1 + "Database1.accdb"
tdfDatabase1.SourceTableName = TableName
CurrentDb.TableDefs.Append tdfDatabase1
End If
Next
End Sub
1. Và em chưa thể link khi đặt password.
2. Đoạn code trên chỉ link được tất cả các table trong 1 file Database, nhưng khi em thử thêm 1 file database khác (2 file database độc lập nhau và ở trong cùng 1 thư mục) thì khi em gọi cái nào trước thì nó chỉ chạy cái đó, còn cái thư hai ko chạy.
VD: Ở đoạn code link table em đặt là LinkDatabase1 và LinkDatabase2; thì khi em gọi nó ở nút nhấn là
LinkDatabase1
LinkDatabase2
Thì nó chỉ chạy LinkDatabase1 (hoặc ngược lại).
Em xin sự trợ giúp từ các anh ạ.
-
RE: Link tất các table trong một file.mdb bằng VBA
maidinhdan > 09-12-16, 06:11 PM
(09-12-16, 09:38 AM)MinhnHang Đã viết: Đây là đoạn code em đang dùng.......................................
1. Và em chưa thể link khi đặt password.
2. Đoạn code trên chỉ link được tất cả các table trong 1 file Database, nhưng khi em thử thêm 1 file database khác (2 file database độc lập nhau và ở trong cùng 1 thư mục) thì khi em gọi cái nào trước thì nó chỉ chạy cái đó, còn cái thư hai ko chạy.
Em xin sự trợ giúp từ các anh ạ.
Hàm bạn sai đoạn này ( Phần tô đỏ): tdfDatabase1.Connect = ";PWD=" & MyPassDatabase1 & ";Database=" + MyPathDatabase1 + "Database1.accdb"
Xin phân tích như sau: Cái mình hướng dẫn bạn hôm trước MyPassDatabase1 = "MS Access;PWD=123" đây là ConectString dùng cho kết nối DAO còn link table bạn chỉ cần để MyPassDatabase1 = ";PWD=123"
=> Câu kết nối đúng của bạn là: tdfDatabase1.Connect = MyPassDatabase1 & ";Database=" + MyPathDatabase1 + "Database1.accdb" ( Tôi cũng chưa test đoạn này có thể chạy không, nên mình đề nghị bạn sử dụng code theo hướng dẫn sau đây:
Để link được 2 Data khác nhau có cùng 1 mật khẩu thì bị làm những bước như sau
Bước 1: Tạo Public PassData, bạn để trong Modules nào cũng được, dòng trên cùng, nó sẽ tiện lợi sau này bạn thay pass chỉ cần đến 1 nơi này thay thôi.
Mã PHP:Public Const PassData As String = "123"
Bước 2: Tạo hàm lấy đường dẫn Data
Mã PHP:Public Function LayData(ChonData As Byte) As String
Dim s As String
Select Case ChonData
Case 1
s = CurrentProject.path & "\DataHethong\Data1.mdb"
Case 2
s = CurrentProject.path & "\DataHethong\Data2.mdb"
Case 3
s = CurrentProject.path & "\DataHethong\Data3.mdb"
End Select
LayData = s
End Function
Bước 3. Tạo hàm linkDataco pass
Mã PHP:'---------------------------------------------------------------------------------------
' Procedure/ Ten thu tuc : LinkTablecoPass
' Author/ Nguoi khoi tao : maidinhdan@gmail.com
' Tao tren may tinh User : DANAspireV5
' Date/ Ngay tao : 10/14/2016
' Purpose/Mo ta : Link table co mat khau
'---------------------------------------------------------------------------------------
Public Function LinkTablecoPass(TenTablecanLink As String, DataCanLay as String)
On Error GoTo Loiketnoi
Dim tdf As TableDef
Dim DB As Database
Set DB = CurrentDb
' Tao Link Table
Set tdf = DB.CreateTableDef(TenTablecanLink)
With tdf
.Connect = "Ms Access;UID=Admin;PWD=" & PassData & ";DATABASE=" & DataCanLay
.SourceTableName = TenTablecanLink
End With
DB.TableDefs.Append tdf
Ketthuc:
Exit Function
Loiketnoi:
If Err = 3110 Then
Resume Ketthuc
Else
If Err = 3011 Then
Resume Next
End If
End If
End Function
Bước 4: Gọi ra mà dùng nhé ( Chú ý ở bước 3 tôi làm là link từng cái table của Data đó, chứng không phải tất cả table trong 1 data)
LinkTablecoPass "tblA", LayData(1) ---> Nó sẽ link table A trong Data1
LinkTablecoPass "tblB", LayData(2) ---> Nó sẽ link table B trong Data2
LinkTablecoPass "tblC", LayData(3) ---> Nó sẽ link table C trong Data3
* Chú ý 1 điều là tên của Table trong Data 1,2,3 không được trùng nhau nhé. Bởi khi bạn link nó này trong 1 Data rồi, nếu không thì nó sẽ không link
* Dựa trên hàm của bạn, bạn có thể tùy biến để link 1 lần tất cả table của Data1 or 2 or 3 theo hướng dẫn duyệt lấy tên tất cả table ở bài #4 phía trên và lồng nó vào bước 3 này.
Thân Mến!