Gởi giáo viên: Trong phần bài tập chương; mục tổng hợp dữ liệu tiền lương từ các file tiền lương hàng tháng - sao đến đoạn code tìm dòng cuối của file nguồn thì VBA báo lỗi "run tiem '9' - subcript out of range nhờ GV giải thích và chỉnh dùm:
Sub chep_DL_tongquat()
'mo thu muc chon fiel
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = True
.Show
' xac dinh file
Dim i As Long
For i = 1 To .SelectedItems.Count
'gan bien cho workbook
Dim wb_KQ As Workbook
Dim wb_select As Workbook
Set wb_KQ = ThisWorkbook
Set wb_select = Workbooks.Open(.SelectedItems(i))
Dim dongcuoi As Long
dongcuoi = wb_select.Sheets("sheet1").Range("D" & Rows.Count).End(xlUp).Row
Dim dongdau As Long
dongdau = 6
Dim khoangcach
khoangcach = dongcuoi - dongdau + 1
'ghep du lieu wb vao
Dim dongcuoi_wbkq As Long
dongcuoi_wbkq = wb_KQ.Sheets("data").Range("D" & Rows.Count).End(xlUp).Row ' vị trí báo lỗi
wb_KQ.Sheets("data_tienluong").Range("A" & dongcuoi_wbkq + 1 & ":BM" & dongcuoi_wbkq + khoangcach).Value = _
wb_select.Sheets("sheet1").Range("A" & dongdau & ":BM" & dongcuoi).Value
wb_select.Close Savechanges:=False
Next i
End With
End Sub
vị trí code dòng cuối này lỗi thì bạn kiểm tra bạn cần xem tại workbook này (thisworkbook) có sheet tên là data hay không. Vì bạn đang viết theo tên sheet nên nếu tên này không tồn tại thì code sẽ lỗi.
sorry thầy ơi - nó báo lỗi ở dòng trên
Dim dongcuoi As Long
dongcuoi = wb_select.Sheets("sheet1").Range("D" & Rows.Count).End(xlUp).Row
Mỗi workbook mở lên thì sheet bảng lương hàng tháng đều là sheet1 mà.
Sheets("sheet1") là cách viết tên sheet theo tên, tức là phải đúng tên là chữ sheet1 thì mới đúng.
Cách viết này dễ sai khi viết code với đối tượng dạng này, bạn nên dùng phương pháp viết theo code name:
dongcuoi = wb_select.Sheet1.Range("D" & Rows.Count).End(xlUp).Row
hoặc viết theo số thứ tự của sheet
dongcuoi = wb_select.Sheets(1).Range("D" & Rows.Count).End(xlUp).Row
2 cách viết này hạn chế sai sót hơn, vì viết đích danh theo tên chỉ nên áp dụng khi bạn chắc chắn tất cả các sheet đó đều có cùng 1 tên. Mà VBA đã báo lỗi ở đó thì chắc chắn là có 1 workbook bị sai tên sheet.
Cám ơn thầy