• Link tất các table trong một file.mdb bằng VBA
  • 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.DatabaseAs Integer
        Set DB 
    CurrentDb         


        Dim s 
    As String
        
    For 0 To DB.TableDefs.Count 1
            
    If Left(DB.TableDefs(i).Name4) <> "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"
    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
    Mã PHP:
    Set DB Ws.OpenDatabase(PathDataFalseFalsePassData
    Thân mến!
  • 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à LinkDatabase1LinkDatabase2; 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
    CurrentProject.path "\DataHethong\Data1.mdb"
    Case 2
    CurrentProject.path "\DataHethong\Data2.mdb"
    Case 3
    CurrentProject.path "\DataHethong\Data3.mdb"

    End Select
    LayData 
    s
    End 
    Function 


    Bước 3. Tạo hàm linkDataco pass
    Mã PHP:
    '---------------------------------------------------------------------------------------
    ProcedureTen 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!