ADODB và việc kết nối Excel và Access trong công tác kế toánn

Liên hệ QC

anhphuong

Thân Thương
Tham gia
12/3/07
Bài viết
514
Được thích
2,601
Mở đầu

Dear All!
Trước đây, tôi có cùng các bạn tham khảo một vấn đề liên kết giữa Excel và Access bằng DAO để làm công tác kế tóan. Thực sự với DAO, chúng ta hòan tòan có thể làm được công việc này, nhưng đòi hỏi chúng ta phải đăng ký cái dll này với Windows. Ngày trước khi cài đặt Microsof Office, bác “Bin” đã cho đăng ký DAO vào trong Windows, nhưng không hiểu sao từ Office 2003, khi cài đặt Office, bác “Bin” lại đăng ký hẳn một thư mục DAO riêng rẽ cho bộ Office mà không đăng ký với Windows. Vì thế khi sử dung DAO nhiều người đã lầm dẫn đến không thể chạy được chương trình vì tòan bị báo lỗi tuy sử dụng DAO rất đơn giản và rất dễ thao tác.
Trên diễn đàn vừa qua có bài viết của bác Phạm Thế Mỹ về việc sử dụng ADODB trong công tác kế tóan. Bài viết hòan toàn dựa vào các thuật tóan của Excel để đưa ra các số liệu trích ngang theo yêu cầu. Nhân bài viết trên, tôi xin phép được cùng với các bạn trao đổi thêm vế vấn đề này và cũng lại dựa vào mối liên kết giữa Excel và Access. Ở đây tòan bộ CSDL được lưu trữ trong một file Access (Database.mdb). Chúng ta sử dụng một file Excel làm file chạy ( KetoanvoiADODB.xls )lưu trữ tòan bộ các modul của chương trình để trích lọc ra các dữ liệu và cập nhật vào các file Excel có sẵn ( MuaVao.xls, BanRa.xls, SoQuy.xls, SoCai.xls, CanDoiPhatSinh.xls…..). Nhân tiện đây cũng xin nói thêm là kiến thức về kế tóan của tôi chỉ là ABC nên nếu có gì sai sót về số liệu, mong các bạn lượng thứ. Tôi chỉ muốn cùng các bạn trao đổi thêm về thuật tóan mà thôi và mong rằng các bạn hãy trao đổi để hòan thiện hơn. Vì thế tôi xin “mượn” cái Database và các mẫu báo cáo của bác Mỹ để làm cơ sở cho việc trao đổi này (Mong bác Mỹ lượng thứ)
 
ADODB và việc kết nối Excel và Access trong công tác kế toán

Công tác chuẩn bị

Để có thể bắt đầu, chúng ta cùng nhau chuẩn bị các số liệu ban đầu

1/ Một file Access chứa dữ liệu gồm các Table : ThangYeuCau, Danh muc Tai khoan, Danh muc khach hang, Danh muc hang hoa, Danh muc chi phi, Chung Tu (các bạn xem file đính kèm Database.mdb). Để phục vụ cho việc lấy dữ liệu nguồn, ta tạo các query sau
1a/ qryKhachPhaiThu :
PHP:
SELECT [Danh muc khach hang].MaKhach, [Danh muc khach hang].TenKhach
FROM [Danh muc khach hang]
WHERE ((([Danh muc khach hang].TaiKhoan)="131"));
1b/ qryKhachPhaiTra :
PHP:
SELECT [Danh muc khach hang].MaKhach, [Danh muc khach hang].TenKhach
FROM [Danh muc khach hang]
WHERE ((([Danh muc khach hang].TaiKhoan)="331"));
1c/ qryHang152 :
PHP:
SELECT [Danh muc hang hoa].MsVTHH, [Danh muc hang hoa].TenVTHH, [Danh muc hang hoa].Dvtinh
FROM [Danh muc hang hoa]
WHERE ((([Danh muc hang hoa].TaiKhoan)="152"));
1d/ qryHang156 :
PHP:
SELECT [Danh muc hang hoa].MsVTHH, [Danh muc hang hoa].TenVTHH, [Danh muc hang hoa].Dvtinh
FROM [Danh muc hang hoa]
WHERE ((([Danh muc hang hoa].TaiKhoan)="156"));
Lưu ý : các query này và các query viết về sau hòan tòan có thể viết trong các modull chạy của Excel, nhưng ở đây ta lợi dụng cái thế mạnh của Access để làm việc này vừa hiệu quả, vừa nhanh gọn. (các bạn để ý trong Function LayDuLieu sẽ rõ, bao gồm cả hai cách lấy dữ liệu là theo dữ liệu query có sẵn và câu lệnh SQL viết trong modull Excel)

2/ Một file chạy KetoanvoiADODB.xls Chưa có modul nào. Bạn nhấn Alt+F11 mở cửa sổ VBE, add một modul mới và viết các đọan code sau :
PHP:
Dim MyConnect As String
Dim MyRecordset As ADODB.Recordset
Dim MyTable As ADODB.Recordset
Dim MySQL As String
Dim ThisTab As Recordset
Dim Ex As Excel.Application
Dim Wb As Excel.Workbook
Dim Ws As Excel.Worksheet
Dim TenFile As String
Dim MyRange As Range
 
Function KetNoi()
    TenFile = ThisWorkbook.Path & "\Database.mdb"
    MyConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & TenFile
End Function
 
Function LayDuLieu()
    Call KetNoi
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open "qryKhachPhaiThu", MyConnect, adOpenStatic, adLockOptimistic
    Range("B1:C5000").ClearContents
    Range("B1").CopyFromRecordset MyRecordset
    MyRecordset.Close
    
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open "qryKhachPhaiTra", MyConnect, adOpenStatic, adLockOptimistic
    Range("D1:E5000").ClearContents
    Range("D1").CopyFromRecordset MyRecordset
    MyRecordset.Close
    
    Set MyRecordset = New ADODB.Recordset
    MySQL = "Select SoTK,Ten From [Danh muc tai khoan]"
    MyRecordset.Open MySQL, MyConnect, adOpenStatic, adLockOptimistic
    Range("J1:K5000").ClearContents
    Range("J1").CopyFromRecordset MyRecordset
    MyRecordset.Close
    
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open "qryHang152", MyConnect, adOpenStatic, adLockOptimistic
    Range("F1:H5000").ClearContents
    Range("F1").CopyFromRecordset MyRecordset
    MyRecordset.Close
    
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open "qryHang156", MyConnect, adOpenStatic, adLockOptimistic
    Range("L1:N5000").ClearContents
    Range("L1").CopyFromRecordset MyRecordset
    MyRecordset.Close
End Function
 
Function UpDuLieu(TabName As String)
    Call KetNoi
    MySQL = "Select * From " & TabName
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open MySQL, MyConnect, adOpenStatic, adLockOptimistic
    If MyRecordset.RecordCount > 0 Then MyRecordset.Delete
    MyRecordset.AddNew
    MyRecordset.Fields(0) = Range("A2").Value
    MyRecordset.Fields(1) = Range("A1").Value
    MyRecordset.Fields(2) = Range("A3").Value
    MyRecordset.Fields(3) = Range("A4").Value
    MyRecordset.Update
    MyRecordset.Close
 End Function

3/ Các file báo cáo MuaVao.xls, BanRa.xls…. theo các Sheet báo cáo của bác Mỹ
 
ADODB và việc kết nối Excel và Access trong công tác kế toán

Bài 1 : Bảng kê hóa đơn mua vào

1/ Chuẩn bị trong Access
Trong Ac chúng ta tạo query qryMuaVao như sau
PHP:
SELECT [Chung tu].hoadon AS [So HD], [Chung tu].ngaygoc AS [Ngay HD], [Chung tu].Serie, [Chung tu].TenKH, [Chung tu].Msthue, [Chung tu].Noidung, IIf([TKNo]<>"133",[Stien],0) AS SoTienTruocThue, [VATRate]/100 AS ThueSuat, Round([SoTienTruocThue]*[ThueSuat],0) AS TienThue
FROM [Chung tu], ThangYeuCau
WHERE (((IIf([TKNo]<>"133",[Stien],0))<>0) AND ((Month([ngaygoc]))=[Thang]) AND (([Chung tu].loaict)<>"BH" And ([Chung tu].loaict)<>"KT"))
ORDER BY [Chung tu].ngaygoc;
2/ Chuẩn bị trong file chạy của Excel

a/ Trong modul
PHP:
Function HoaDonMuaVao()
    Call KetNoi
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open "qryMuaVao", MyConnect, adOpenStatic, adLockOptimistic
    Set Ex = New Excel.Application
    TenFile = ThisWorkbook.Path & "\MuaVao.xls"
    Set Wb = Ex.Workbooks.Open(TenFile)
    Set Ws = Wb.Worksheets("MuaVao")
    Ws.Range("A4:J2000").ClearContents
    n = Ws.Range("B65000").End(xlUp).Row
    Ws.Range("B" & n + 1).CopyFromRecordset MyRecordset
    MyRecordset.Close
    Ws.Range("E2") = Range("A2")
    n = Ws.Range("B65000").End(xlUp).Row
    For i = 4 To n
        Ws.Range("A" & i) = i - 3
    Next
    Ex.Visible = True
    Set Ex = Nothing
End Function

b/ Trong Sheet1, tạo môt Command Button có tên là MuaVao và sự kiện Click của nó là :
PHP:
Private Sub MuaVao_Click()
    If Range("A2") <> "" Then
        Call UpDuLieu("ThangYeuCau")
        Call HoaDonMuaVao
    Else
        MsgBox "Ban chua chon thang bao cao", , "Xin Loi"
        Exit Sub
    End If
End Sub
 
Lần chỉnh sửa cuối:
ADODB và việc kết nối Excel và Access trong công tác kế toán

Bài 2 : Bảng ke hòa đơn bán ra

1/ Chuẩn bị trong Ac
Tạo query qryBanRa như sau :
PHP:
SELECT [Chung tu].hoadon AS [So HD], [Chung tu].ngaygoc AS [Ngay HD], [Chung tu].Serie, [Chung tu].TenKH, [Chung tu].Msthue, [Chung tu].Noidung, IIf([TKCo]="511",[Stien],0) AS SoTienTruocThue, [VATRate]/100 AS ThueSuat, Round([SoTienTruocThue]*[ThueSuat],0) AS TienThue
FROM [Chung tu], ThangYeuCau
WHERE (((IIf([TKCo]="511",[Stien],0))<>0) AND (([Chung tu].HD)=True) AND ((Month([ngaygoc]))=[Thang]) AND (([Chung tu].loaict)="BH" Or ([Chung tu].loaict)="KT"))
ORDER BY [Chung tu].ngaygoc;

2/ Chuẩn bị trong file chạy của Ex
a/ Trong modul :
PHP:
Function HoaDonBanRa()
    Call KetNoi
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open "qrybanRa", MyConnect, adOpenStatic, adLockOptimistic
    Set Ex = New Excel.Application
    TenFile = ThisWorkbook.Path & "\BanRa.xls"
    Set Wb = Ex.Workbooks.Open(TenFile)
    Set Ws = Wb.Worksheets("BanRa")
    Ws.Range("A4:J2000").ClearContents
    n = Ws.Range("B65000").End(xlUp).Row
    Ws.Range("B" & n + 1).CopyFromRecordset MyRecordset
    MyRecordset.Close
    Ws.Range("E2") = Range("A2")
    n = Ws.Range("B65000").End(xlUp).Row
    For i = 4 To n
        Ws.Range("A" & i) = i - 3
    Next
    Ws.Range("H" & n + 1) = "=SUM(R4C:R" & n & "C)"
    Ws.Range("J" & n + 1) = "=SUM(R4C:R" & n & "C)"
    Ex.Visible = True
    Set Ex = Nothing
End Function
b/ Trong Sheet1 : Sự kiện Click của Command Button BanRa là :
PHP:
Private Sub BanRa_Click()
    If Range("A2") <> "" Then
        Call UpDuLieu("ThangYeuCau")
        Call HoaDonBanRa
    Else
        MsgBox "Ban chua chon thang bao cao", , "Xin Loi"
        Exit Sub
    End If
End Sub
 
ADODB và việc kết nối Excel và Access trong công tác kế toán

Bài 3 : Sổ Quỹ Tiền mặt và Ngân hàng

1/ Chuẩn bị trong Ac : tạo 3 query như sau
1a/ qrySoQuy
PHP:
SELECT [Chung tu].sct, [Chung tu].date, [Chung tu].TenKH, [Chung tu].Noidung, IIf([TKNo]=[TK],[TKCo],[TKNo]) AS TKDU, IIf([TKno]=[TK],[Stien],0) AS Thu, IIf([TKCo]=[TK],[Stien],0) AS Chi
FROM [Chung tu], ThangYeuCau
WHERE ((([Chung tu].TkNo)=[TK])) OR ((([Chung tu].TKCo)=[TK]))
ORDER BY [Chung tu].date;
1b/ qryTonDau
PHP:
SELECT Sum(IIf([TKNo]=[TK],[Stien])) AS TongNo, Sum(IIf([TKCo]=[TK],[Stien])) AS TongCo, [Danh muc tai khoan].DuNo, [Duno]+[TongNo]-[TongCo] AS TonDau
FROM [Chung tu], [Danh muc tai khoan] INNER JOIN ThangYeuCau ON [Danh muc tai khoan].SoTK = ThangYeuCau.TK
WHERE (((Month([date]))<[Thang]))
GROUP BY [Danh muc tai khoan].DuNo;
1c/ qrySoQuyTrong
PHP:
SELECT qrySoQuy.*
FROM ThangYeuCau, qrySoQuy
WHERE (((Month([date]))=[Thang]))
ORDER BY qrySoQuy.date, qrySoQuy.sct;

2/ Chuẩn bị trong file chạy của Ecxel
a/ Trong modul :
PHP:
Function TinhSoQuy()
    Call KetNoi
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open "qrySoQuyTrong", MyConnect, adOpenStatic, adLockOptimistic
    Set MyTable = New ADODB.Recordset
    MyTable.Open "qryTonDau", MyConnect, adOpenStatic, adLockOptimistic
    Set Ex = New Excel.Application
    TenFile = ThisWorkbook.Path & "\SoQuy.xls"
    Set Wb = Ex.Workbooks.Open(TenFile)
    Set Ws = Wb.Worksheets("SoQuy")
    Ws.Range("A5:H2000").ClearContents
    n = Ws.Range("B65000").End(xlUp).Row + 1
    Ws.Range("G4") = MyTable.Fields(3)
    MyTable.Close
    Ws.Range("B" & n + 1).CopyFromRecordset MyRecordset
    MyRecordset.Close
    Ws.Range("D2") = Range("A2")
    Ws.Range("E1") = Range("A1")
    If Range("A1") = "111" Then
        Ws.Range("D1") = "S" & ChrW(7892) & " Q" & ChrW(360) & "Y TI" & ChrW(7872) & "N M" & ChrW(7862) & "T"
    Else
        Ws.Range("D1") = "S" & ChrW(7892) & " Q" & ChrW(360) & "Y NG" & ChrW(194) & "N H" & ChrW(192) & "NG"
    End If
    n = Ws.Range("B65000").End(xlUp).Row
    For i = 5 To n
        Ws.Range("A" & i) = i - 4
    Next
    Ws.Range("E" & n + 1) = "T" & ChrW(7893) & "ng ph" & ChrW(225) & "t sinh"
    Ws.Range("E" & n + 2) = "S" & ChrW(7889) & " d" & ChrW(432) & " cu" & ChrW(7889) & "i k" & ChrW(7923)
    Ws.Range("H" & n + 1) = "=SUM(R5C:R" & n & "C)"
    Ws.Range("G" & n + 1) = "=SUM(R5C:R" & n & "C)"
    Ws.Range("G" & n + 2) = "=R4C7+R" & n + 1 & "C7-R" & n + 1 & "C8"
    Ex.Visible = True
    Set Wb = Nothing: Set Ex = Nothing
End Function

b/ Trong Sheet1, sự kiện Click của nút bấm :
PHP:
Private Sub SoQuy_Click()
    If Range("A1") = "" Then
        MsgBox "Ban chua chon tai khoan quy", , "Thong Bao"
        Exit Sub
    ElseIf Range("A1") <> "111" And Range("A1") <> "112" Then
        MsgBox "Tai khoan quy phai la 111 or 112", , "Thong Bao"
        Exit Sub
    ElseIf Range("A2") = "" Then
        MsgBox "Ban chua chon thang bao cao", , "Thong Bao"
        Exit Sub
    Else
        Call UpDuLieu("ThangYeuCau")
        Call TinhSoQuy
    End If
End Sub
 
ADODB và việc kết nối Excel và Access trong công tác kế toán

Bải 4 : Sổ cái

1/ Chuẩn bị trong Acces :
1a/ qryTonDauTK :
PHP:
SELECT Sum(IIf([TKNo]=[TK],[Stien])) AS TongNo, Sum(IIf([TKCo]=[TK],[Stien])) AS TongCo, [Danh muc tai khoan].DuNo, [Danh muc tai khoan].DuCo, IIf([Duno]-[DuCo]+[TongNo]-[TongCo]>0,[Duno]-[DuCo]+[TongNo]-[TongCo],0) AS NoDau, IIf([Duno]-[DuCo]+[TongNo]-[TongCo]<0,Abs([Duno]-[DuCo]+[TongNo]-[TongCo]),0) AS CoDau, [Danh muc tai khoan].Ten
FROM [Chung tu], [Danh muc tai khoan] INNER JOIN ThangYeuCau ON [Danh muc tai khoan].SoTK = ThangYeuCau.TK
WHERE ((([Chung tu].date)<[NgayDau]))
GROUP BY [Danh muc tai khoan].DuNo, [Danh muc tai khoan].DuCo, [Danh muc tai khoan].Ten;
1b/ qryTKTrong :
PHP:
SELECT qrySoQuy.sct, qrySoQuy.date, qrySoQuy.Noidung, qrySoQuy.TKDU, qrySoQuy.Thu, qrySoQuy.Chi
FROM ThangYeuCau, qrySoQuy
WHERE (((qrySoQuy.date) Between [Ngaydau] And [NgayCuoi]))
ORDER BY qrySoQuy.date, qrySoQuy.sct;

2/ Chuẩn bị trong file chạy Ecxel :
a/ Trong modul :
PHP:
Function TinhSoTaiKhoan()
    Call KetNoi
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open "qrySoTKTrong", MyConnect, adOpenStatic, adLockOptimistic
    Set MyTable = New ADODB.Recordset
    MyTable.Open "qryTonDauTK", MyConnect, adOpenStatic, adLockOptimistic
    Set Ex = New Excel.Application
    TenFile = ThisWorkbook.Path & "\SoCai.xls"
    Set Wb = Ex.Workbooks.Open(TenFile)
    Set Ws = Wb.Worksheets("SoCai")
    Ws.Range("A5:G2000").ClearContents
    Ws.Range("F4:G4").ClearContents
    n = Ws.Range("B65000").End(xlUp).Row + 1
    If MyTable.RecordCount > 0 Then
        If MyTable.Fields(4) > 0 Then
            Ws.Range("F4") = MyTable.Fields(4)
            Ws.Range("G4") = 0
        Else
            Ws.Range("F4") = 0
            Ws.Range("G4") = MyTable.Fields(5)
        End If
    Else
        Ws.Range("F4") = 0
        Ws.Range("G4") = 0
    End If
    MyTable.Close
    If MyRecordset.RecordCount > 0 Then Ws.Range("B" & n + 1).CopyFromRecordset MyRecordset
    MyRecordset.Close
    Ws.Range("E1") = Range("A1")
    Ws.Range("E2") = Range("A3")
    Ws.Range("G2") = Range("A4")
    Ws.Range("F1") = Application.WorksheetFunction.VLookup(Range("A1"), Range("J1:K" & Range("K65000").End(xlUp).Row), 2, 0)
    n = Ws.Range("D65000").End(xlUp).Row
    For i = 5 To n
        Ws.Range("A" & i) = i - 4
    Next
    Ws.Range("D" & n + 1) = "T" & ChrW(7893) & "ng ph" & ChrW(225) & "t sinh"
    Ws.Range("D" & n + 2) = "S" & ChrW(7889) & " d" & ChrW(432) & " cu" & ChrW(7889) & "i k" & ChrW(7923)
    If n > 4 Then
        Ws.Range("F" & n + 1) = "=SUM(R5C:R" & n & "C)"
        Ws.Range("G" & n + 1) = "=SUM(R5C:R" & n & "C)"
    Else
        Ws.Range("F" & n + 1) = 0
        Ws.Range("G" & n + 1) = 0
    End If
    Ws.Range("E" & n + 1) = "=R4C6-R4C7+R" & n + 1 & "C6-R" & n + 1 & "C7"
    Ws.Range("E" & n + 1).Font.ColorIndex = 2
    If Ws.Range("E" & n + 1) > 0 Then
        Ws.Range("F" & n + 2) = Ws.Range("E" & n + 1)
    Else
        Ws.Range("G" & n + 2) = Abs(Ws.Range("E" & n + 1))
    End If
    Ex.Visible = True
    Set Wb = Nothing: Set Ex = Nothing
End Function

b/ Trong Sheet1, sự kiện Click của nút bấm :
PHP:
Private Sub Socai_Click()
    If Range("A1") = "" Then
        MsgBox "Ban chua chon tai khoan quy", , "Thong Bao"
        Exit Sub
    ElseIf Range("A3") = "" Or Range("A4") = "" Then
        MsgBox "Ban chua chon thoi gian bao cao", , "Thong Bao"
        Exit Sub
    ElseIf Range("A3") > Range("A4") Then
        MsgBox "NgayDau khong duoc lon hon NgayCuoi", , "Thong Bao"
        Exit Sub
    Else
        Call UpDuLieu("ThangYeuCau")
        Call TinhSoTaiKhoan
    End If
End Sub


Các bạn down về, giải nén và copy toàn bộ thư mục Ke toan vào ổ đĩa cứng rồi chạy file Excel KetoanvoiADODB.xls

Tất cả các code và query đều mở
Thân
 

File đính kèm

  • Ke toan.rar
    204.6 KB · Đọc: 671
ADODB và việc kết nối Excel và Access trong công tác kế toán

Bài 5 : Sổ cân đối phát sinh

1/ Chuẩn bị trong Access :
1a/ qryTonDauTH
PHP:
SELECT [Danh muc tai khoan].SoTK, Sum(IIf([TKNo]=[SoTK],[Stien],0)) AS TongNo, Sum(IIf([TKCo]=[SoTK],[Stien],0)) AS TongCo, [Danh muc tai khoan].DuNo, [Danh muc tai khoan].DuCo, IIf([Duno]-[DuCo]+[TongNo]-[TongCo]>0,[Duno]-[DuCo]+[TongNo]-[TongCo],0) AS NoDau, IIf([Duno]-[DuCo]+[TongNo]-[TongCo]<0,Abs([Duno]-[DuCo]+[TongNo]-[TongCo]),0) AS CoDau
FROM [Chung tu], ThangYeuCau, [Danh muc tai khoan]
WHERE ((([Chung tu].date)<[NgayDau]))
GROUP BY [Danh muc tai khoan].SoTK, [Danh muc tai khoan].DuNo, [Danh muc tai khoan].DuCo;
1b/ qryTongHopTrong :
PHP:
SELECT [Danh muc tai khoan].SoTK, Sum(IIf([TkNo]=[SoTK],[Stien],0)) AS PSNo, Sum(IIf([TkCo]=[SoTK],[Stien],0)) AS PSCo
FROM [Chung tu], [Danh muc tai khoan], ThangYeuCau
WHERE ((([Chung tu].date) Between [NgayDau] And [NgayCuoi]))
GROUP BY [Danh muc tai khoan].SoTK;
1c/ qryCanDoiPhatSinh
PHP:
SELECT [Danh muc tai khoan].SoTK, [Danh muc tai khoan].Ten, qryTonDauTH.NoDau, qryTonDauTH.CoDau, qryTongHopTrong.PSNo, qryTongHopTrong.PSCo, IIf([NoDau]-[CoDau]+[PSNo]-[PSCo]>0,[NoDau]-[CoDau]+[PSNo]-[PSCo],0) AS NoCuoi, IIf([NoDau]-[CoDau]+[PSNo]-[PSCo]<0,Abs([NoDau]-[CoDau]+[PSNo]-[PSCo]),0) AS CoCuoi
FROM ([Danh muc tai khoan] LEFT JOIN qryTonDauTH ON [Danh muc tai khoan].SoTK = qryTonDauTH.SoTK) INNER JOIN qryTongHopTrong ON [Danh muc tai khoan].SoTK = qryTongHopTrong.SoTK
WHERE ((([NoDau]+[CoDau]+[PSNo]+[PSCo])>0));

2/ Trong File chạy Excel :
2a/ Trong modul
PHP:
Function CanDoi()
    Call KetNoi
    Set MyRecordset = New ADODB.Recordset
    MyRecordset.Open "qryCanDoiPhatSinh", MyConnect, adOpenStatic, adLockOptimistic
    Set Ex = New Excel.Application
    Ten = ThisWorkbook.Path & "\CanDoiPhatSinh.xls"
    Set Wb = Ex.Workbooks.Open(Ten)
    Set Ws = Wb.Worksheets("CDPS")
    Ws.Range("A5:I2000").ClearContents
    n = Ws.Range("B65000").End(xlUp).Row
    Ws.Range("B" & n + 2).CopyFromRecordset MyRecordset
    MyRecordset.Close
    Ws.Range("D2") = Range("A3")
    Ws.Range("F2") = Range("A4")
    n = Ws.Range("B65000").End(xlUp).Row
    For i = 5 To n
        Ws.Range("A" & i) = i - 4
    Next
    Ws.Range("D" & n + 1 & ":I" & n + 1) = "=SUM(R5C:R" & n & "C)"
    Ws.Range("C" & n + 1) = "T" & ChrW(7893) & "ng C" & ChrW(7897) & "ng"
    Ws.Range("A1").Select
    Ex.Visible = True
    Set Ex = Nothing
End Function

2b/ Trong Sheet :
PHP:
Private Sub CanDoiPhatSinh_Click()
    If Range("A3") = "" Or Range("A4") = "" Then
        MsgBox "Ban chua chon thoi gian bao cao", , "Thong Bao"
        Exit Sub
    ElseIf Range("A3") > Range("A4") Then
        MsgBox "NgayDau khong duoc lon hon NgayCuoi", , "Thong Bao"
        Exit Sub
    Else
        Call UpDuLieu("ThangYeuCau")
        Call CanDoi
    End If
End Sub


Phần Công nợ, Hàng hóa, xin hẹn các bác hôm sau.
Mong nhận được những đóng góp chân thành
 
Mình xin có 1 ý kiến nhỏ thôi.
-Trước hết, là dân kế toán mình xin cám ơn sự trăn trở và công sức đầu tư của bạn.
-Dữ liệu nó càng nhiều nên theo năm tháng, nếu để 1 file e lúc nào đó nó quá lớn.
-Hiện nay, dân kế toán chân trong, chân ngoài 2-3 cty là thường. Thậm chí, 1 cty lại có phần quản trị, phần báo cáo.

Vậy nên Anh Phuong nên tổ chức thành Folder riêng
Tại thư mục gốc có file Exc và Folder data--Trong data là donvi--trong donvi là các file access theo năm có cấu trúc giống nhau.
Anh Phuong sua lại phần lựa chọn dơn vị, năm và UDF kết nối là được rồi.
Bây giờ quy mô chương trình sẽ khác phải không. Tạo khả năng mở rộng cho chương trình, dễ dàng phát triển theo yêu cầu mà không cần nhiều file Exc tương tự. Có thể quản lý rất nhiều đơn vị và không khống chế thời gian.

Thân Sealand.
 
Lần chỉnh sửa cuối:
Mình cũng làm kế toán, làm cho nhiều Cty, Mỗi công ty chỉ làm một File Excel
Nhưng mình không làm sao tải lên ạn một File mẫu được
Ai biết hướng dẫn cho mình
 
Anh ơi nhập liệu thì mình nhập từ Acess ạh?
 
Nhập từ Access chứ. Cái lý do ban đầu ST-Lu dùng Access là dữ liệu nhiều hơn số dòng của Excel mà?
 
Cái lý của duyên nợ Exc và Acc ở đây là sử dụng Exc nhập liệu và trích rút báo cáo và Acc là nơi lưu giữ dữ liệu mà thôi. Chứ đã nhập liệu trên Acc thì còn gì mà nói nữa.
Ở đây muốn nói đến 1 bộ nhập lệu và báo cáo dùng chung và các tệp dữ liệu Acc riêng. Khi làm việc với đơn vị nào thì ta kết nối với file ấy.
 
Câu trên tôi trả lời riêng cho ST-Lu vì tôi có theo dõi và biết nỗi trăn trở, nguyện vọng, và nỗ lực xoay sở của ST-Lu.

Cái duyên nợ Excel và Access là mối duyên nợ 2 chiều: Import và Export qua lại. Topic này lợi dụng thế mạnh của Access để tạo sẵn các Query trích, lọc, từ dữ liệu trên Access và Excel hưởng thành quả. Thế nên nếu nhập liệu vào Access thì cũng là tự nhiên thôi.
Việc này không ảnh hưởng đến việc dùng 1 file Excel chạy và nhiều file Access lưu trữ dữ liệu. Huống chi, Excel 2003 đang bị giới hạn số dòng, mà chính vì vậy ST-Lu mới phải cầu viện Access.

Tất nhiên, mỗi người có ý kiến riêng của mình, và thích nhập liệu trong Excel hơn. Giả sử thiếu dòng thì xài 2007 chẳng hạn. Cá nhân tôi thích nhập liệu bằng Access vì tạo form nhập liệu với 2 table có quan hệ Master-Child hoàn toàn dễ dàng. Xin nói thêm, cái dữ liệu mẫu mà tôi đã dùng trong topic kia, và Anh Anhphuong đang dùng trong topic này là lấy từ Access ra, không phải lấy 1 table, mà là 1 query 2 table Master - Child, bỏ bớt vài fields Autonumber IDs. Nếu anh Anh Phương cho tôi biết sớm, thì tôi đã có thể hỗ trợ anh bằng toàn bộ các table dữ liệu từ Access, việc của anh sẽ nhẹ đi nhiều. Tiếc là anh làm xong hết rồi mới post lên 1 lượt, tôi bị chậm 1 bước.
 
Lần chỉnh sửa cuối:
Rất vui vì nhận được sự quan tâm của các bác. Tôi cũng định trở lại vấn đề này nhưng ngặt nỗi thời gian không cho phép,vì thế đành lỗi hẹn với mọi người vậy

Việc nhập liệu có thể nhập trên Ac hoặc trên Ex nhưng dữ liệu lại được lưu vào Ac. Việc này dù trong Ac hay Ex ta đều dùng form để nhập liệu. Dữ liệu lưu trong Ac và dùng thế mạnh của query trong Ac để trích lọc rồi đưa ra Ex.

Nếu anh Anh Phương cho tôi biết sớm, thì tôi đã có thể hỗ trợ anh bằng toàn bộ các table dữ liệu từ Access, việc của anh sẽ nhẹ đi nhiều.
Thực tình khi làm cái này cũng không biết bác có file dữ liệu này nên đành lấy cái database của bác để chế biến, xào nấu lại trong Ac để làm. Cám ơn bác vì những điều đó, và mong sẽ được hợp tác nhiều hơn

Nhân đây gửi bạn ST-Lu một cách nhập liệu trong Ex mà dữ liệu lại được đưa vào trong Ac trên 2 Table Master - Child để bạn tham khảo, nhẹ đầu chừng nào tốt chừng đó. Bạn chép cái thư mục ST-Lu vào một chỗ bất kỳ rồi mở hai file Ac.mdb và Ex.xls để tham khảo .Bạn tuỳ nghi chế biến lại cho phù hợp. Có thể tham khảo thêm bài viết của tôi về Mai và Sub trên diễn đàn(Lâu quá rồi không nhớ nó ở đâu nữa, bạn chịu khó tim nhé)
Thân mến
 

File đính kèm

  • ST-Lu.rar
    22.4 KB · Đọc: 218
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom