Cần đưa dữ liệu vào Access không qua cột phụ của Excel

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
934
Được thích
568
Chào các anh chị
Em có dùng VBA để đưa dữ liệu từ Excel vào file mdb (MS Access). Tuy nhiên chưa quen làm việc với nhiều bảng trong Access vì thế phải dùng 1 cột trung gian.
Nhờ các anh chị chỉnh sửa câu lệnh trong file để có thể Update dữ liệu mà không cần dùng cột trung gian của Excel.
Em xin cảm ơn
 

File đính kèm

  • Test.rar
    80.8 KB · Đọc: 19
Em có dùng VBA để đưa dữ liệu từ Excel vào file mdb (MS Access). Tuy nhiên chưa quen làm việc với nhiều bảng trong Access vì thế phải dùng 1 cột trung gian.
Nhờ các anh chị chỉnh sửa câu lệnh trong file để có thể Update dữ liệu mà không cần dùng cột trung gian của Excel.
Thay vì kiếm code để xử lý thì bạn thay đổi cách (qui trình) nhập liệu cho nó chuẩn đi, khỏi mất công đi vòng. Ý kiến của tôi là vậy.
 
Chào các anh chị
Em có dùng VBA để đưa dữ liệu từ Excel vào file mdb (MS Access). Tuy nhiên chưa quen làm việc với nhiều bảng trong Access vì thế phải dùng 1 cột trung gian.
Nhờ các anh chị chỉnh sửa câu lệnh trong file để có thể Update dữ liệu mà không cần dùng cột trung gian của Excel.
Em xin cảm ơn
Cột phụ đó được tính từ hàm Vlookup thì trong code VBA bạn cũng làm như thế bằng WorksheetFunction.Vlookup gán cho biến F.

Cách khác là dùng vòng lặp dò trong bảng phòng ban để lấy ra

Cách nữa là dùng phương thức Find tìm trong bảng phòng ban.
 
Cột phụ đó được tính từ hàm Vlookup thì trong code VBA bạn cũng làm như thế bằng WorksheetFunction.Vlookup gán cho biến F.

Cách khác là dùng vòng lặp dò trong bảng phòng ban để lấy ra

Cách nữa là dùng phương thức Find tìm trong bảng phòng ban.
Có thể xây dựng 1 câu lệnh lồng nhau để giải quyết được vấn đề trên cho gọn không hả bác ?
Bài đã được tự động gộp:

Thay vì kiếm code để xử lý thì bạn thay đổi cách (qui trình) nhập liệu cho nó chuẩn đi, khỏi mất công đi vòng. Ý kiến của tôi là vậy.
Bên mình đang dùng phần mềm ZKTeco Attendance Management, PM này dùng file .mdb như gửi trên làm database. Bên mình dùng Excel để đưa danh sách NV mới vào, (edit NV đang có) cho nhanh. vì vậy không thể có thay đổi nào khác. Với lại mình đang vừa làm quen, vừa tìm hiểu nên cũng chưa có ý tưởng gì cho việc đổi mới. Cảm ơn bạn.
 
Lần chỉnh sửa cuối:
Có thể xây dựng 1 câu lệnh lồng nhau để giải quyết được vấn đề trên cho gọn không hả bác ?
Bạn chỉ cần update cho 1 nhân viên, tôi thấy code làm thế. Bây giờ bạn tìm giá trị cho biến F bằng 1 câu lệnh khác chứ tôi không hiểu bạn muốn lồng cái gì vào đây nữa.
 
Thay vì kiếm code để xử lý thì bạn thay đổi cách (qui trình) nhập liệu cho nó chuẩn đi, khỏi mất công đi vòng. Ý kiến của tôi là vậy.
Ở đây người ta dùng Excel như công cụ thay kết bảng đen và Access như cong cụ thay thế sổ tay.
Muốn thay đổi quy trình cần hiểu biết ít nhiều về kỹ năng tạo Mô Hình Dữ liệu - Data Modelling.
Nói chung là cần một tư duy khác mà ở GPE này tôi đã thử nhiều lần như nước đổ lá môn. Người ta đã có định kiến "vấn đề của tôi là thế, và tôi muốn nó được giải quyết như thế". Những đề nghị thay đổi gặp người tử tế thì "cảm ơn, em sẽ nghiên cứu về việc anh đề nghị [hiện tại thìn cứ làm vầy cho xong vấn đề trước mắt đã]", gặp người khác thì "vấn đề của tôi nó [vân vân và vân vân], không thể thay đổi hướng giải quyết"
 
Có thể xây dựng 1 câu lệnh lồng nhau để giải quyết được vấn đề trên cho gọn không hả bác ?
Câu trả lời là có thể được. Tuy nhiên bạn phải hiểu cách nối các mã từ file Excel với file Access với nhau để linh hoạt lấy ra cái mình cần cập nhật nhé.
 
bỏ phần I3:J9 thì dễ xừ, trong code có đoạn SQL sẵn đây
Mã:
cnn.Execute ("Update UserInfo set Name = '" & C & "', DefaultDeptID = (Select DeptID from Departments where Deptname = '" & D & "') where Badgenumber = '" & B & "'")

Còn thích xử lý thuần bằng vba thì chơi kiểu nữa mùa này
Mã:
Private Sub ManualUpdateC1()

Dim B As String, C As String, D As String, F As String
Dim rs As DAO.Recordset
Dim arr()
arr = Array("a", "PhongNS", "PhongKHTH", "PhongTCKT", "PhongDH", "PhongKD", "PhongKTCN")
Dim Path As String
Path = ThisWorkbook.Path & "\Test.mdb"

    Dim sqlcn As String
    sqlcn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & Path & ";" & _
            "Jet OLEDB:Engine Type=5;" & _
            "Persist Security Info=False;"
    cnn.Open sqlcn

    B = Sheet5.cmdUpdate.TopLeftCell.Value                          'Ma NV
    C = Sheet5.cmdUpdate.TopLeftCell.Offset(0, 1).Value             'Tên NV
    D = Sheet5.cmdUpdate.TopLeftCell.Offset(0, 2).Value             'Tên phòng ban
    F = CStr(WorksheetFunction.Match(D, arr, 0))            'Ma phòng ban
    
'Update Ma phòng ban thông qua cot phu
    cnn.Execute ("Update UserInfo set Name = '" & C & "', DefaultDeptID = '" & F & "' WHERE Badgenumber = '" & B & "'")
    
    
'Update Ma phòng ban KHÔNG thông qua cot phu
    'cnn.Execute ("Update UserInfo set Name = '" & C & "', DefaultDeptID = (Select DeptID from Departments where Deptname = '" & D & "') where Badgenumber = '" & B & "'")
    'cnn.Execute ("Update U SET U.DefaultDeptID = D.DeptID FROM UserInfo U INNER JOIN Departments D On U.DefaultDeptID = D.DeptID AND D.DEPTNAME = '" & D & "'")

cnn.Close
Set cnn = Nothing

MsgBox "Da update cho MSNV: " & B & " !", vbInformation, "Thông báo"

End Sub
 
bỏ phần I3:J9 thì dễ xừ, trong code có đoạn SQL sẵn đây
Mã:
cnn.Execute ("Update UserInfo set Name = '" & C & "', DefaultDeptID = (Select DeptID from Departments where Deptname = '" & D & "') where Badgenumber = '" & B & "'")

Còn thích xử lý thuần bằng vba thì chơi kiểu nữa mùa này
Mã:
Private Sub ManualUpdateC1()

Dim B As String, C As String, D As String, F As String
Dim rs As DAO.Recordset
Dim arr()
arr = Array("a", "PhongNS", "PhongKHTH", "PhongTCKT", "PhongDH", "PhongKD", "PhongKTCN")
Dim Path As String
Path = ThisWorkbook.Path & "\Test.mdb"

    Dim sqlcn As String
    sqlcn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & Path & ";" & _
            "Jet OLEDB:Engine Type=5;" & _
            "Persist Security Info=False;"
    cnn.Open sqlcn

    B = Sheet5.cmdUpdate.TopLeftCell.Value                          'Ma NV
    C = Sheet5.cmdUpdate.TopLeftCell.Offset(0, 1).Value             'Tên NV
    D = Sheet5.cmdUpdate.TopLeftCell.Offset(0, 2).Value             'Tên phòng ban
    F = CStr(WorksheetFunction.Match(D, arr, 0))            'Ma phòng ban
   
'Update Ma phòng ban thông qua cot phu
    cnn.Execute ("Update UserInfo set Name = '" & C & "', DefaultDeptID = '" & F & "' WHERE Badgenumber = '" & B & "'")
   
   
'Update Ma phòng ban KHÔNG thông qua cot phu
    'cnn.Execute ("Update UserInfo set Name = '" & C & "', DefaultDeptID = (Select DeptID from Departments where Deptname = '" & D & "') where Badgenumber = '" & B & "'")
    'cnn.Execute ("Update U SET U.DefaultDeptID = D.DeptID FROM UserInfo U INNER JOIN Departments D On U.DefaultDeptID = D.DeptID AND D.DEPTNAME = '" & D & "'")

cnn.Close
Set cnn = Nothing

MsgBox "Da update cho MSNV: " & B & " !", vbInformation, "Thông báo"

End Sub
Mã phòng ban phải lấy từ file Access đó bạn, liệt kê như bạn vẫn được nhưng không ổn và không linh hoạt.
 
Chào các anh chị
Em có dùng VBA để đưa dữ liệu từ Excel vào file mdb (MS Access). Tuy nhiên chưa quen làm việc với nhiều bảng trong Access vì thế phải dùng 1 cột trung gian.
Nhờ các anh chị chỉnh sửa câu lệnh trong file để có thể Update dữ liệu mà không cần dùng cột trung gian của Excel.
Em xin cảm ơn
Lâu quá không thấy bạn phản hồi gì. Thôi thì tôi gửi bài lên cho các bạn khác khi cần.

Mã:
Update USERINFO c
       Inner join (Select F1,
                          F2,
                          DEPTID
                   From
([EXCEL 12.0;HDR=No;IMEX=1;Database=" & ThisWorkbook.FullName & "].[Data$B3:D] a
 inner join DEPARTMENTS b
         On a.F3 = b.DEPTNAME)) d
        On c.Badgenumber = d.F1
Set    c.DEFAULTDEPTID = d.DEPTID
 
Web KT
Back
Top Bottom