vuthaiha90 > 24-05-18, 05:45 PM
ongke0711 > 24-05-18, 08:42 PM
vuthaiha90 > 25-05-18, 09:01 AM
(24-05-18, 08:42 PM)ongke0711 Đã viết: 1. Vấn đề Import: chuyện import sẽ rất đơn giản nếu bạn không thêm câu lệnh "DeleteObject acTable", nó xoá mất cái table nguồn luôn rồi xong tạo lại table nguồn mới và khi đó Access sẽ tự suy từ các cột trong sheet Excel ra kiểu định dạng và thiết lập tương tự cho table nguồn Access.
- Bạn tạo table nguồn có field STT là AutoNumber và Primary Key.
- Chạy lệnh import excel của bạn là table nguồn sẽ tự động tạo STT thôi. Chú ý file Excel cũng phải có cột STT.
- Sau này muốn import tiếp file excel khác thì bạn chỉ chạy code xoá nội dung table thôi chứ không xoá luôn cái table. Thay thế lênh DeleteObject bằng Currentdb.Execute "DELETE * FROM TableNguon", dbFailOnError. Chú ý dấu nháy kép trong câu lệnh này. Bạn đặt sai dấu nháy kép nên báo lỗi "Error FROM..."
2. Chú ý: đừng đặt tên Table, Form, Report có dùng dấu gạch nối "-". Nếu bạn dùng dấu này thì trong câu lệnh SQL bạn phải bỏ tên table vào giữa 2 dấu ngoặc vuông [...] Access mới hiểu đúng và xử lý đúng. VD: "DELETE * FROM [T_PAKD-Nguon]". Trong code của bạn, nếu không đổi tên table hoặc dùng dấu [ ] nó sẽ chạy làm treo máy đó.
ongke0711 > 25-05-18, 10:27 AM
vuthaiha90 > 25-05-18, 10:53 AM
(25-05-18, 10:27 AM)ongke0711 Đã viết: - Tôi chưa đọc hết code xuất Word của bạn nhưng để không xuất cột STT thì bạn thêm điều kiện: Nếu Field.Name ="STT" thì bỏ qua, nhảy qua field kế tiếp xử lý.1. Của em là dạng tới ô cuối cùng, đếm số ô, rồi quay ngược về đầu đếm số cột, vậy giờ em lấy số cột trừ đi 1 ạ, hay em thêm câu lệnh if nếu tên cột là STT thì bỏ đi vào đâu ạ?
- Còn việc xoá dòng, tôi nghĩ bạn xuất 1 table hoàn toàn mới thì làm sao có dư dòng nhỉ.
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("T_PAKD-dich", dbOpenSnapshot)
With rst
If .RecordCount <> 0 Then
.MoveLast 'Ensure proper count
iRecCount = .RecordCount 'Number of records returned by the table/query'
.MoveFirst
iFldCount = .Fields.Count 'Number of fields/columns returned by the table/query'
tblNoInDoc = 1 'So thu tu cua table trong file Doc'
Set oWordTbl = Doc.Tables(tblNoInDoc)
'Them cot'
With Doc.Tables(tblNoInDoc)
.Select
Do Until .Columns.Count = iFldCount
.Columns.Add
.Columns.AutoFit
Loop
End With
For i = 1 To iRecCount
Doc.Tables(tblNoInDoc).Rows.Add
oWordTbl.Cell(i + 1, 1) = Nz(rst.Fields(0).Value, "")
oWordTbl.Cell(i + 1, 1).Range.ParagraphFormat.Alignment = 0 '0 la can trai
oWordTbl.Cell(i + 1, 1).Range.Cells.VerticalAlignment = 1
...............................................
.MoveNext
Next i
End If
i = i + 1
Doc.Tables(tblNoInDoc).Rows.Add
Doc.Tables(tblNoInDoc).Cell(i, 1).Range.Text = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
Doc.Tables(tblNoInDoc).Cell(i, 5).Range.Text = Format(DSum("Thanhtienmua", "T_PAKD-nguon"), "#,##0")
Doc.Tables(tblNoInDoc).Cell(i, 7).Range.Text = Format(DSum("Thanhtienban", "T_PAKD-nguon"), "#,##0")
End With
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim y As Long
Dim oApp As Object
Dim Doc As Object
Dim strDocName As String
Set oApp = CreateObject("Word.Application")
oApp.Visible = True
strDocName = """" & CurrentProject.Path & "\Word\CC" & "\Mau so 01_Phuong an su dung von.doc" & """"
Set Doc = oApp.Documents.Add(strDocName)
Set db = CurrentDb
Set rs = db.OpenRecordset("Q_STKDH", dbOpenSnapshot)
If rs.EOF Then
Exit Sub
Else
rs.MoveFirst
End If
y = 3
Do
Doc.Tables(2).Cell(y, 1).Range.Text = rs.Fields![STT].Value
Doc.Tables(2).Cell(y, 2).Range.Text = rs.Fields![TenTS].Value
Doc.Tables(2).Cell(y, 3).Range.Text = rs.Fields![SosoTK].Value
Doc.Tables(2).Cell(y, 4).Range.Text = Format(rs.Fields![Trigiaso].Value, "##,##0") & ChrW$(273)
Doc.Tables(2).Cell(y, 5).Range.Text = IIf(rs.Fields![Kyhan].Value < 10, "0" & rs.Fields![Kyhan].Value, rs.Fields![Kyhan].Value) & " Tháng"
Doc.Tables(2).Cell(y, 6).Range.Text = rs.Fields![Laisuatgui].Value & "%/n" & ChrW$(259) & "m"
Doc.Tables(2).Cell(y, 7).Range.Text = rs.Fields![Noiphathanh].Value
If DLookup("NgayphongtoaSTKnay", "T_CamcoSTK") <> "" Then
Doc.Tables(2).Cell(y, 8).Range.Text = rs.Fields![NgayTraLai].Value
Else
Doc.Tables(2).Cell(y, 8).Range.Text = rs.Fields![Ngaydenhan].Value
End If
rs.MoveNext
y = y + 1
Doc.Tables(2).Rows.Add
Loop Until rs.EOF
rs.Close
If DLookup("NgayphongtoaSTKnay", "T_CamcoSTK") <> "" Then
Doc.Tables(2).Cell(y, 1).Merge Doc.Tables(2).Cell(y, 8)
Doc.Tables(2).Cell(y, 1).Range.Text = "(Tài s" & ChrW(7843) & "n " & ChrW(273) & "ang nh" & ChrW(7853) & "p kho t" & ChrW(7841) & "i NHHT-CNTB)"
End If
y = y + 1
Doc.Tables(2).Cell(y, 2).Range.Text = "T" & ChrW(7893) & "ng:"
Doc.Tables(2).Cell(y, 4).Range.Text = Format(DSum("trigiaso", "Q_STKDH"), "##,##0") & ChrW$(273)
'Format bold last row'
Doc.Tables(2).Cell(y, 2).Range.Font.Bold = True
Doc.Tables(2).Cell(y, 4).Range.Font.Bold = True
ongke0711 > 25-05-18, 02:28 PM
vuthaiha90 > 25-05-18, 02:42 PM
(25-05-18, 02:28 PM)ongke0711 Đã viết: 1. Để bỏ bớt 1 côt thừa (cột STT) thì bạn chỉ cần giảm 1 khi khai báo số lượng Field:
iFldCount = .Fields.Count - 1
Cũng vô tình code của bạn chạy đúng khi add thêm dòng cho table này. Code tuần tự thêm dòng của bạn là: oWordTbl.cell(i + 1, 1) = Nz(rst.Fields(1).Value, "") ==> Field(1) tức là bạn chỉ thêm dữ liệu của field "Tên hàng hoá" - cột thứ 2 chứ không phải cột "STT" là Field (0). Index của cột tính từ số 0.