Tổng cột từ Access sang Excel

Tổng cột từ Access sang Excel

Tôi có đoạn mã sau trong Excel. Nó hoạt động rất tốt nhưng tôi muốn sử dụng cùng đoạn mã này trong Access để xuất dữ liệu, đồng thời thêm một hàng tổng ở cuối, nhưng lại báo lỗi.

lastrow = ThisWorkbook.Sheets("SHEET1").Cells(Rows.Count, 2).End(xlUp).Row
ThisWorkbook.Sheets("SHEET1").Range("B" & lastrow + 1) = Application.WorksheetFunction.Sum(ThisWorkbook.Sheets("SHEET1").Range("B2:B" & lastrow))

lastrow = ThisWorkbook.Sheets("SHEET1").Cells(Rows.Count, 3).End(xlUp).Row
ThisWorkbook.Sheets("SHEET1").Range("C" & lastrow + 1) = Application.WorksheetFunction.Sum(ThisWorkbook.Sheets("SHEET1").Range("C2:C" & lastrow))

lastrow = ThisWorkbook.Sheets("SHEET1").Cells(Rows.Count, 4).End(xlUp).Row
ThisWorkbook.Sheets("SHEET1").Range("D" & lastrow + 1) = Application.WorksheetFunction.Sum(ThisWorkbook.Sheets("SHEET1").Range("D2:D" & lastrow))


lastrow = ThisWorkbook.Sheets("SHEET1").Cells(Rows.Count, 5).End(xlUp).Row
ThisWorkbook.Sheets("SHEET1").Range("E" & lastrow + 1) = Application.WorksheetFunction.Sum(ThisWorkbook.Sheets("SHEET1").Range("E2:E" & lastrow))


lastrow = ThisWorkbook.Sheets("SHEET1").Cells(Rows.Count, 6).End(xlUp).Row
ThisWorkbook.Sheets("SHEET1").Range("F" & lastrow + 1) = Application.WorksheetFunction.Sum(ThisWorkbook.Sheets("SHEET1").Range("F2:F" & lastrow))

ThisWorkbook.Sheets("SHEET1").Range("A" & lastrow + 1) = "Tổng cộng:"


ThisWorkbook.Sheets("SHEET1").Range("A" & lastrow + 1).Font.Bold = True
ThisWorkbook.Sheets("SHEET1").Range("B" & lastrow + 1).Font.Bold = True
ThisWorkbook.Sheets("SHEET1").Range("C" & lastrow + 1).Font.Bold = True
ThisWorkbook.Sheets("SHEET1").Range("d" & lastrow + 1).Font.Bold = True
ThisWorkbook.Sheets("SHEET1").Range("e" & lastrow + 1).Font.Bold = True
ThisWorkbook.Sheets("SHEET1").Range("f" & lastrow + 1).Font.Bold = True




Trả lời:
Chào bạn. Chính xác thì bạn đã sử dụng đoạn mã trên trong Access như thế nào? Bạn có sử dụng tính năng tự động hóa Excel không?

Trả lời:

Tự động hóa Excel từ Access đòi hỏi một vài điều chỉnh nhỏ. Hãy xem...

Thao tác dữ liệu Excel từ Access...

http://regina-whipp.com/blog/?p=691

Hi vọng điều này sẽ giúp bạn tìm được hướng đi đúng.



Trả lời:

Tôi đã tạo một nút lệnh trên một biểu mẫu. Đây là phần còn lại của mã. Mã này hoạt động trong Access nhưng lại báo lỗi "Không tìm thấy phương thức hoặc thành viên dữ liệu". Nó không chấp nhận hàm .worksheet. ...nhưng lại hoạt động trong Excel.

Dim objXLS As Object
Dim wks As Object
Dim rsc As Recordset
Dim idx As Long
Đặt rsc = Me.RecordsetClone
rsc.MoveLast
rsc.MoveFirst
Đặt objXLS = CreateObject("Excel.Application")
objXLS.Workbooks.Add
Đặt wks = objXLS.Worksheets(1)
Đối với idx = 0 đến rsc.Fields.Count - 1
wks.Cells(1, idx + 1).Value = rsc.Fields(idx).Name
Kế tiếp
wks.Range(wks.Cells(1, 1), wks.Cells(1, rsc.Fields.Count)).Font.Bold = True
wks.Range("A2").CopyFromRecordset rsc, rsc.RecordCount, rsc.Fields.Count

'Tự động điều chỉnh kích thước cột để hiển thị toàn bộ dữ liệu'
wks.Range("A:M").Columns.AutoFit

'Định dạng phạm vi ô'
wks.Range("E2:E5000").NUMBERFORMAT = "General"
wks.Range("F2:F5000").NUMBERFORMAT = "0.00"
wks.Range("G2:G5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("H2:H5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("I2:I5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("J2:J5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("K2:K5000").NUMBERFORMAT = "0%"

'Chèn một cột vào cột A'
wks.Range("A1").EntireColumn.Insert



Trả lời:

Access không hề biết ThisWorkbook là gì, chỉ có Excel mới biết.

Bạn đã thử cách nào đó tương tự như (aircode):

lastrow = wks.Cells(wks.Rows.Count, 2).End(xlUp).Row

...

Nơi bạn thay thế

ThisWorkbook.Sheets("SHEET1")

bằng biến mà bạn đã thiết lập để đại diện cho trang tính đang xét.

tuần

Ngoài ra, đừng quên nếu bạn đang sử dụng liên kết muộn (như bạn đang làm) thì bạn cần phải định nghĩa tất cả các hằng số Excel mà bạn sử dụng trong mã của mình, chẳng hạn như: xlUp

Hằng số công khai xlUp = -4162

Rồi đại loại như thế này

ThisWorkbook.Sheets("SHEET1").Range("B" & lastrow + 1) = Application.WorksheetFunction.Sum(ThisWorkbook.Sheets("SHEET1").Range("B2:B" & lastrow))

sẽ trở thành

wks.Range("B" & lastrow + 1) = objXLS.WorksheetFunction.Sum(wks.Range("B2:B" & lastrow))

Ngoài ra, trừ khi bạn đang thêm các hàng mới... thì không cần thiết phải tính toán lại giá trị của lastrow một cách lặp đi lặp lại vì nó sẽ không thay đổi so với dòng trước đó. Bạn chỉ cần tính toán lại nếu bạn thực sự thêm hoặc xóa một hàng, điều mà bạn dường như không làm trong đoạn mã được cung cấp.

Bạn có thể xem http://www.devhut.net/2012/04/19/ms-access-vba-export-records-to-excel/ để tham khảo một số mã ví dụ, điều này có thể giúp bạn hiểu cách lập trình một số phần này đúng cách.



Trả lời:

Tôi đã thay đổi cả hai dòng và giờ lại gặp lỗi "runtime error 1004" - Lỗi do ứng dụng hoặc đối tượng định nghĩa.


Hàng cuối = wks.Cells(wks.Rows.Count, 2).End(xlUp).Row

wks.range("B" & LastRow + 1) = objXLS.WorksheetFunction.Sum(wks.range("B2:B" & LastRow))



Trả lời:
Bạn có thể đăng toàn bộ quy trình của mình để chúng tôi có thể xem xét kỹ hơn được không?

Trả lời:

Mã của tôi hoạt động nếu tôi bỏ đi dòng lệnh "objXLS.worksheetfunction.sum". Tôi không thể làm cho nó tính tổng ở cuối bảng.

Đây là những gì tôi đang làm.

.Range("G" & lngLastRow + 2) = objXLS.worksheetfunction.sum= [EE Recognition]

Dim objXLS As Object
Dim wks As Object
Dim rsc As Recordset
Dim idx As Long
Đặt rsc = Me.RecordsetClone
rsc.MoveLast
rsc.MoveFirst
Đặt objXLS = CreateObject("Excel.Application")
objXLS.Workbooks.Add
Đặt wks = objXLS.Worksheets(1)
Đối với idx = 0 đến rsc.Fields.Count - 1
wks.Cells(1, idx + 1).Value = rsc.Fields(idx).Name
Kế tiếp
wks.Range(wks.Cells(1, 1), wks.Cells(1, rsc.Fields.Count)).Font.Bold = True
wks.Range("A2").CopyFromRecordset rsc, rsc.RecordCount, rsc.Fields.Count

Const xlUp As Long = -4162
Dim lngLastRow As Long

'Tự động điều chỉnh kích thước cột để hiển thị toàn bộ dữ liệu'
wks.Range("A:M").Columns.AutoFit

'Định dạng phạm vi ô'
wks.Range("E2:E5000").NUMBERFORMAT = "General"
wks.Range("F2:F5000").NUMBERFORMAT = "0.00"
wks.Range("G2:G5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("H2:H5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("I2:I5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("J2:J5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("K2:K5000").NUMBERFORMAT = "0%"

'Chèn một cột vào cột A'
wks.Range("A1").EntireColumn.Insert

Với wks.Cells.Worksheet

lngLastRow = wks.Cells(wks.Rows.Count, 7).End(xlUp).Row
.Range("G" & lngLastRow + 2) = [EE Recognition]
.Range("G" & lngLastRow + 2).Font.Bold = True

lngLastRow = wks.Cells(wks.Rows.Count, 8).End(xlUp).Row
.Range("H" & lngLastRow + 2) = [Chi phí đi lại từ đầu năm đến nay]
.Range("H" & lngLastRow + 2).Font.Bold = True

lngLastRow = wks.Cells(wks.Rows.Count, 9).End(xlUp).Row
.Range("I" & lngLastRow + 2) = [Chi phí ăn uống từ đầu năm đến nay]
.Range("I" & lngLastRow + 2).Font.Bold = True

lngLastRow = wks.Cells(wks.Rows.Count, 10).End(xlUp).Row
.Range("J" & lngLastRow + 2) = [Tổng chi phí đi lại và ăn uống]
.Range("J" & lngLastRow + 2).Font.Bold = True

lngLastRow = wks.Cells(wks.Rows.Count, 11).End(xlUp).Row
.Range("K" & lngLastRow + 2) = [Ngân sách chi tiêu cho du lịch và ăn uống năm 2016]
.Range("K" & lngLastRow + 2).Font.Bold = True

Kết thúc bằng


wks.Range("A" & LastRow + 1) = "Tổng cộng:"

objXLS.Visible = True



Trả lời:

Bạn muốn chèn dòng này vào vị trí nào?

Tuy nhiên, bản thân câu nói đó không có ý nghĩa gì đối với tôi.

.Range("G" & lngLastRow + 2) = objXLS.worksheetfunction.sum= [EE Recognition]

[EE Recognition] là gì? Chính xác thì bạn đang cố gắng làm gì?

Nhân tiện nói thêm...

Tại sao bạn lại như vậy?

rsc.MoveLast
rsc.MoveFirst

Tại sao lại phải đi đến tận cùng chỉ để rồi quay trở lại điểm khởi đầu?

Tôi nghĩ bạn có thể đơn giản hóa, từ đó tăng tốc độ mã của mình bằng cách thay thế

wks.Range("G2:G5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("H2:H5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("I2:I5000").NUMBERFORMAT = "$#,##0.00"
wks.Range("J2:J5000").NUMBERFORMAT = "$#,##0.00"

với nội dung tương tự như sau:

wks.Range("G2:J5000").NUMBERFORMAT = "$#,##0.00"



Trả lời:

[EE Recognition] là tiêu đề cột trong Excel. Tôi đang cố gắng tính tổng các cột từ E đến K và đặt tổng đó vào các cột cuối cùng có dữ liệu đã điền trong một phạm vi.

Tôi đã thay đổi đoạn mã khác wks.Range("G2:J5000").NUMBERFORMAT = "$#,##0.00" theo gợi ý của bạn. Cảm ơn!



Trả lời:

Chào Daniel - Mình hiểu rồi. Cảm ơn nhé!

lngLastRow = wks.Cells(wks.Rows.Count, 7).End(xlUp).row
.Range("G" & lngLastRow + 2).Formula = "=SUM(G2:G" & lngLastRow & ")"
.Range("G" & lngLastRow + 2).Font.Bold = True

Comments

Popular posts from this blog

Excel 2016 - mở tất cả các tệp trong MỘT phiên bản

Điều tôi muốn làm trong Excel 2010 là tạo một nút tùy chỉnh và gắn nó vào thanh công cụ Truy nhập nhanh và chạy một macro cụ thể.

Mở tài liệu Excel và Word từ Outlook Lỗi - Không đủ bộ nhớ