ledangvan > 05-10-19, 10:44 PM
Xuân Thanh > 06-10-19, 07:32 AM
ledangvan > 12-10-19, 11:45 PM
(06-10-19, 07:32 AM)Xuân Thanh Đã viết: 1/ Tạo thêm một table Danh Mục Tài Khoản chứa dữ liệu của các tài khoản
2/ Tạo một file Excel mẫu chứa các sheet có name là Mã TK
3/ Tạo một query lọc các tài khoản trong kho dữ liệu
4/ Tạo hàm xuất query ra Excel lần lượt theo các Mã TK có trong Danh mục tài khoản đổ vào các sheet tương ứng
5/ Tham khảo bài dưới đây để biết cách xuất query ra Excel, nhớ chọn thêm thư viện Microsof Excel Libary, nếu không chọn thì sửa lại hàm
https://thuthuataccess.com/forum/thread-...age-2.html
Thân
DooHoaangPhuuc > 13-10-19, 03:46 PM
ledangvan > 13-10-19, 04:26 PM
Minh Tiên > 13-10-19, 06:50 PM
tranthanhan1962 > 13-10-19, 06:54 PM
ongke0711 > 14-10-19, 02:27 AM
(13-10-19, 04:26 PM)ledangvan Đã viết: Đúng như bạn DooHoaangPhuuc nói : Việc xuất 1 tài khoản ra một Sheet Excel thì tôi làm được rồi tuy nhiên gặp phải 2 khó khăn :
1- Với người dùng dữ liệu không phải lúc nào cũng theo đúng tên tài khoản như ví dụ dữ liệu của tôi : Ví dụ người thì dùng TK 1111, người thì dùng TK 1111A hoặc 11111 hoặc ... tương tự 11211 cũng thế người thì dùng 112, người thì dùng 1121, người dùng 11211, 11212 ... nên không cố định và với việc không cố định cho nên tạo Sheet mang tên TK sẽ không khả thi.
2- Việc xuất nhiều tài khoản qua các sheet theo vòng lặp tôi chưa biết làm.
Rất mong Xuân Thanh và các bạn khác biết chỉ giùm, Trân trọng cảm ơn
Private Sub cmdXuatExcel_Click()
Dim sFileExcelName As String
sFileExcelName = "C:\BangDuLieu.xls"
Call ExportExcelBySheet(sFileExcelName) '--> Xuat du lieu ra file Excel co san.'
'Call ExportExcelBySheet '--> Tu tao workbook moi.'
End Sub
Sub ExportExcelBySheet(Optional ByVal sFile As String, _
Optional ByVal lStartCol As Long = 1, _
Optional ByVal lStartRow As Long = 1, _
Optional bFitCols As Boolean = True, _
Optional bFreezePanes As Boolean = True, _
Optional bAutoFilter As Boolean = True)
#Const EarlyBind = True 'Early Binding, phai khai bao thu vien: Microsoft Excel xx.x Object Library.
'#Const EarlyBind = False 'Late Binding'
#If EarlyBind = True Then
'Early Binding Declarations
Dim oExcel As Excel.Application
Dim oExcelWrkBk As Excel.WorkBook
Dim oExcelWrkSht As Excel.WorkSheet
#Else
'Late Binding Declaration/Constants'
Dim oExcel As Object
Dim oExcelWrkBk As Object
Dim oExcelWrkSht As Object
Const xlCenter = -4108
#End If
Dim bExcelOpened As Boolean
Dim iCols As Integer
Dim lWrkBk As Long
Dim sWrkSht As String
'Xu lý Recordset'
Dim db As DAO.Database
Dim rsMTK As DAO.Recordset, rsDuLieu As DAO.Recordset
Dim sSQL As String
Set db = DBEngine(0)(0)
Set rsMTK = db.OpenRecordset("SELECT DISTINCT Bangdulieu.MSTK FROM Bangdulieu ORDER BY MSTK DESC", dbOpenDynaset)
If rsMTK.EOF And rsMTK.BOF Then
MsgBox "Khong co du lieu."
Exit Sub
End If
'Excel'
On Error Resume Next
Set oExcel = GetObject(, "Excel.Application") 'Ket noi voi ung dung Excel dang mo san'
If Err.Number <> 0 Then 'Neu không ket noi duoc thì mo moi Excel'
Err.Clear
On Error GoTo Error_Handler
Set oExcel = CreateObject("Excel.Application")
bExcelOpened = False
Else 'Excel dang chay roi'
bExcelOpened = True
End If
oExcel.ScreenUpdating = False
oExcel.Visible = False 'An bang tinh Excel'
If sFile <> "" Then
Set oExcelWrkBk = oExcel.Workbooks.Open(sFile) 'Mo file có san'
Else
Set oExcelWrkBk = oExcel.Workbooks.Add() 'Mo file mói'
End If
rsMTK.MoveFirst
Do Until rsMTK.EOF
sWrkSht = rsMTK!MSTK
oExcelWrkBk.Worksheets.Add.Name = sWrkSht
Set oExcelWrkSht = oExcelWrkBk.Sheets(sWrkSht)
oExcelWrkSht.Activate
sSQL = "SELECT * FROM Bangdulieu WHERE MSTK='" & rsMTK!MSTK & "'"
Set rsDuLieu = db.OpenRecordset(sSQL)
With rsDuLieu
.MoveFirst
'Tao dòng tiêu de'
For iCols = 0 To rsDuLieu.Fields.Count - 1
oExcelWrkSht.Cells(lStartRow, lStartCol + iCols).Value = rsDuLieu.Fields(iCols).Name
Next
'Dinh dang dòng tiêu de'
With oExcelWrkSht.Range(oExcelWrkSht.Cells(lStartRow, lStartCol), _
oExcelWrkSht.Cells(lStartRow, lStartCol + iCols - 1))
.Font.Bold = True
.Font.ColorIndex = 2
.Interior.ColorIndex = 1
.HorizontalAlignment = xlCenter
End With
'Copy du lieu'
oExcelWrkSht.Cells(lStartRow + 1, lStartCol).CopyFromRecordset rsDuLieu
'Dinh dang bang tinh: Auto Filter, Freeze panel:'
'************************************************'
'Freeze pane'
If bFreezePanes = True Then
oExcelWrkSht.Cells(lStartRow + 1, 1).Select
oExcel.ActiveWindow.FreezePanes = True
End If
'AutoFilter'
If bAutoFilter = True Then
oExcelWrkSht.Rows(lStartRow & ":" & lStartRow).AutoFilter
End If
'Co gian côt cho chua het du lieu'
If bFitCols = True Then
oExcelWrkSht.Range(oExcelWrkSht.Cells(lStartRow, lStartCol), _
oExcelWrkSht.Cells(lStartRow, lStartCol + iCols)).EntireColumn.AutoFit
End If
'Di chuyen con tro ve dau dòng'
oExcelWrkSht.Cells(lStartRow, lStartCol).Select
End With
rsMTK.MoveNext
Loop
Error_Handler_Exit:
On Error Resume Next
oExcel.Visible = True 'Hien thi bang tính Excel'
Set rsDuLieu = Nothing
Set oExcelWrkSht = Nothing
Set oExcelWrkBk = Nothing
oExcel.ScreenUpdating = True
Set oExcel = Nothing
Exit Sub
Error_Handler:
MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
"Error Number: " & Err.Number & vbCrLf & _
"Error Source: ExportExcellBySheet" & vbCrLf & _
"Error Description: " & Err.Description & _
Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
, vbOKOnly + vbCritical, "An Error has Occurred!"
Resume Error_Handler_Exit
End Sub
Xuân Thanh > 14-10-19, 08:55 AM
(13-10-19, 04:26 PM)ledangvan Đã viết: Đúng như bạn DooHoaangPhuuc nói : Việc xuất 1 tài khoản ra một Sheet Excel thì tôi làm được rồi tuy nhiên gặp phải 2 khó khăn :
1- Với người dùng dữ liệu không phải lúc nào cũng theo đúng tên tài khoản như ví dụ dữ liệu của tôi : Ví dụ người thì dùng TK 1111, người thì dùng TK 1111A hoặc 11111 hoặc ... tương tự 11211 cũng thế người thì dùng 112, người thì dùng 1121, người dùng 11211, 11212 ... nên không cố định và với việc không cố định cho nên tạo Sheet mang tên TK sẽ không khả thi.
2- Việc xuất nhiều tài khoản qua các sheet theo vòng lặp tôi chưa biết làm.
Rất mong Xuân Thanh và các bạn khác biết chỉ giùm, Trân trọng cảm ơn
ledangvan > 14-10-19, 10:13 AM
(13-10-19, 06:54 PM)tranthanhan1962 Đã viết: Tôi không biết bạn ledangvan xử lý tài khoản thế nào, hê thống số hiệu tài khoản cấp 1, cấp 2 do bộ tài chính ban hành, từ cấp 3 trở đi bộ tài chính cho phép kế toán đơn vị có quyền đặt thêm để dễ quản lý sổ sách kế toán. Vì vậy thời chưa có máy tính còn kẻ sổ, viết bút bi các ngài kế toán trưởng hay đặt TK cấp 3 cho các đơn vị hoặc người dùng. Ví dụ 11111 là TK111 của cty A, 11112 là TK111 của Cty B... hoặc 11111 là TK 111 của chi nhánh 1, 11112 là TK111 của chinha1nh 2... Nhưng từ khi xử dụng excel, tôi đã bỏ thói quen này, lúc đầu nối 2 cột để tạo mã cho tài khoảng riêng của từng đối tượng. Ví dụ: 111 & CN1 =111CN1, 111 & CN2 =111CN2...khi gom lại thì tạo từng nhóm 111CN1, 111CN2 sẽ biết tài khoản riêng của từng đối tượng, đến khi gia nhập access với hệ thống query xử lý nhóm cực tốt tôi cũng bỏ luôn cái vụ kết hợp TK và đối tượng luôn, giờ thì trong phần mềm chỉ còn tài khoản cấp 1, trường hợp có những thài khoản sử dụng đến tài khoản cấp 2 tôi củng đôn cấp cho nó tương đương TK cấp 1 luôn. Cuối cùng danh sách TK như vầy:
001, 002, 003, 004, 007, 111, 112, 131, 133, 138, 141, 142, 152, 153, 154, 155, 156, 1563, 211, 214, 241, 242, 311, 331, 3331, 3334, 3338, 3339, 334, 3383, 3384, 3388, 341, 411, 418, 4211, 4212, 5111, 515, 521, 611, 632, 635, 642, 711, 811, 8211, 911,
trong đó những TK cấp 2 được xem như là 1 TK tương đương TK cấp 1: 3331, 3334, 3338, 3339,4211, 4212 Khi xử lý tốt các tài khoản một các rõ ràng, đơn vị thuế cũng không bắt lỗi cấp 2, cấp 1 gì cả, miễn là TK nào chính xác TK đó, Lúc kiểm tra đòi số nào có số đó cũng nhanh. Đâu có cán bộ thuế nào quan tâm đến TK 11111, 11112 đâu, chỉ cần hỏi 111 của Chi nhánh 1, 111 Chi nhánh 2, trong 30 s mình cung cấp hết danh sách TK 111 của toàn bộ chi nhánh công ty thì cán bộ thuế nào không khoái