Tổng hợp dữ liệu từ nhiều file excel vào 1 file (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

huynhphuong thcspt

Thành viên mới
Tham gia
31/8/18
Bài viết
45
Được thích
10
Nhờ các bạn trên diễn đàn chỉnh lại (xem) dùm code sau. Mình không biết lỗi ở đâu mà cứ mỗi lần copy (dữ liệu) nhiều file vào 1 file thì 2 file đầu dữ liệu copy đúng, bất đầu từ file thứ 3 trở đi thì bị bỏ trống khoảng 4 dòng trở lên rồi mới copy dữ liệu vào. Chân thành cảm ơn.
CODE NHƯ SAU (sưu tầm trên điễn đàn):
Sub GopFileExcel()
'XOA DU LIEU TRUOC KHI TH

Sheets("DATA").Select
Range("A1:AZ1").EntireColumn.Delete
'KHAI BAO TH
Dim FilesToOpen
Dim x As Integer
Dim wb As Workbook
'LENH TH
On Error GoTo ErrHandler
Application.DisplayAlerts = False 'tat canh bao
Application.ScreenUpdating = False 'tat nhay man hinh
FilesToOpen = Application.GetOpenFilename _
(FileFilter:="Microsoft Excel Files (*.xls), *.xls", MultiSelect:=True, Title:="Files to Merge")

If MsgBox("Ban co muon chac tong hop du lieu dia ban khong?", vbYesNo) = vbYes Then 'canh bao tong hop dia ban

If TypeName(FilesToOpen) = "Boolean" Then
MsgBox "No Files were selected"
GoTo ExitHandler
End If

x = 1
While x <= UBound(FilesToOpen)
Set wb = Workbooks.Open(Filename:=FilesToOpen(x))

If x = 1 Then
wb.Sheets(1).UsedRange.Copy ThisWorkbook.Sheets(1).Range("A1")
Else
lr = ThisWorkbook.Sheets(1).UsedRange.Rows.Count
wb.Sheets(1).UsedRange.Offset(4).Copy ThisWorkbook.Sheets(1).Range("A" & lr + 1)
End If

wb.Close False
x = x + 1
Wend

ExitHandler:
Application.ScreenUpdating = True 'tat nhay man hinh
Application.DisplayAlerts = True 'tat canh bao
Set wb = Nothing
Exit Sub
ErrHandler:
MsgBox Err.Description
Resume ExitHandler

End If 'ket thuc canh bao tong hop dia ban
End Sub
 

File đính kèm

Thử thay lr = ThisWorkbook.Sheets(1).UsedRange.Rows.Count
bằng lr = ThisWorkbook.Sheets(1).Range("C" & Rows.Count).End(xlUp).Row
Cảm ơn bạn đã hướng dẫn nhưng vẫn không được bạn ơi. Chỉ được 3 file đầu tiên sau đó nó bỏ 22 dòng trống rồi mới copy 3 file còn lại. Mong bạn chỉ dẫn thêm.
 

File đính kèm

Upvote 0
Cảm ơn bạn đã hướng dẫn nhưng vẫn không được bạn ơi. Chỉ được 3 file đầu tiên sau đó nó bỏ 22 dòng trống rồi mới copy 3 file còn lại. Mong bạn chỉ dẫn thêm.
Thay wb.Sheets(1).UsedRange.Offset(4).Copy ThisWorkbook.Sheets(1).Range("A" & lr + 1)
Bằng wb.Sheets(1).Range("B5:AY" & wb.Sheets(1).Range("C" & Rows.Count).End(xlUp).Row).Copy ThisWorkbook.Sheets(1).Range("A" & lr + 1)
 
Upvote 0
Bạn thử xem lại dữ liệu file gốc xem thế nào.
Cảm ơn! Đúng rồi bạn ơi do dữ liệu gốc. Gửi lời xin lỗi bạn Maika8008.
Cứ mỗi lần chạy file thì hiện bảng thông báo Micosoft excel: Updata Don't updata Help làm sao để không hiện bảng thông báo này mỗi khi mở file ?
 
Upvote 0
Upvote 0
Thay wb.Sheets(1).UsedRange.Offset(4).Copy ThisWorkbook.Sheets(1).Range("A" & lr + 1)
Bằng wb.Sheets(1).Range("B5:AY" & wb.Sheets(1).Range("C" & Rows.Count).End(xlUp).Row).Copy ThisWorkbook.Sheets(1).Range("A" & lr + 1)
Cảm ơn bạn đã hướng dẫn, mình xin sửa lại .range ("B5:AY" ..... bằng .range ("A5:AY" ...... thì dữ liệu khớp hơn.
Nhân đây nhờ bạn giúp mình xuất ngược từ file tổng hợp thành từng file tương ứng như ban đầu đã tổng hợp ( khi xuất cấu trúc file không thay đổi). Căn cứ vào cột địa chỉ ( cột N ) dựa vào 2 ký tự cuối. Ví dụ: 1A xuất ra địa bàn nhập liệu xóm 1A, 1B xuất ra địa bàn nhập liệu xóm 1B, ... như file mẫu mình đã úp lên. ( xuất từng file theo ý mình thì càng tốt, ví dụ muốn xuất địa bàn nhập liệu xóm 1E thì chỉ cho ra file thuộc xóm 1E, ...... ) Xin chân thành cảm ơn.
 

File đính kèm

Upvote 0
Cảm ơn bạn đã hướng dẫn, mình xin sửa lại .range ("B5:AY" ..... bằng .range ("A5:AY" ...... thì dữ liệu khớp hơn.
Nhân đây nhờ bạn giúp mình xuất ngược từ file tổng hợp thành từng file tương ứng như ban đầu đã tổng hợp ( khi xuất cấu trúc file không thay đổi). Căn cứ vào cột địa chỉ ( cột N ) dựa vào 2 ký tự cuối. Ví dụ: 1A xuất ra địa bàn nhập liệu xóm 1A, 1B xuất ra địa bàn nhập liệu xóm 1B, ... như file mẫu mình đã úp lên. ( xuất từng file theo ý mình thì càng tốt, ví dụ muốn xuất địa bàn nhập liệu xóm 1E thì chỉ cho ra file thuộc xóm 1E, ...... ) Xin chân thành cảm ơn.
Điền thông tin ở A6, bấm nút ở sheet MENU để chạy.
 

File đính kèm

Upvote 0
Điền thông tin ở A6, bấm nút ở sheet MENU để chạy.
Chào bạn Maika8008! khi nào bạn rảnh xem dùm mình code XLOP (nhập tên lớp cần xuất vào A12) có trong file đính kèm:
1. Khả năng mình có hạn nên tạo ra code XLOP hơi lòng vòng dẫn đến chương trình chạy chậm. Nhờ bạn xem chỉnh dùm.
2. Làm sao ở dòng cuối của danh sách vừa xuất hiện : ..............., ngày tháng năm
3. Tạo Sheet lớp vừa xuất thành 1 file excel riêng.
xin cảm ơn !
 

File đính kèm

Upvote 0
Chào bạn Maika8008! khi nào bạn rảnh xem dùm mình code XLOP (nhập tên lớp cần xuất vào A12) có trong file đính kèm:
1. Khả năng mình có hạn nên tạo ra code XLOP hơi lòng vòng dẫn đến chương trình chạy chậm. Nhờ bạn xem chỉnh dùm.
2. Làm sao ở dòng cuối của danh sách vừa xuất hiện : ..............., ngày tháng năm
3. Tạo Sheet lớp vừa xuất thành 1 file excel riêng.
xin cảm ơn !
Ngó vậy chứ hết hơi à! Tôi làm từ đầu chứ không sửa sang chi.
 

File đính kèm

Upvote 0
Ngó vậy chứ hết hơi à! Tôi làm từ đầu chứ không sửa sang chi.
Quá hay bạn ơi, chương trình chạy nhanh hơn mình tưởng tượng đúng là chuyên gia về Vba Excel có khác. Chân thành cảm ơn.
khi chạy chương trình thì gặp lỗi như thế này mà mình chỉnh hoài không xong, nhờ bạn xem lại dùm nhé. Ví dụ cột(s) tên lớp mà tên lớp có dấu * hoặc có dấu / (những ký tự đặc biệt ( 1A*, 4B*, 7/1, 7/4,.... ) thì chương trình báo lỗi ở mã code sau " Sheets("DATA").Range("B1:AY4").Copy nws.Range("A1") ". Rất mong bạn gỡ rối ở chỗ này.
 
Upvote 0
Quá hay bạn ơi, chương trình chạy nhanh hơn mình tưởng tượng đúng là chuyên gia về Vba Excel có khác. Chân thành cảm ơn.
khi chạy chương trình thì gặp lỗi như thế này mà mình chỉnh hoài không xong, nhờ bạn xem lại dùm nhé. Ví dụ cột(s) tên lớp mà tên lớp có dấu * hoặc có dấu / (những ký tự đặc biệt ( 1A*, 4B*, 7/1, 7/4,.... ) thì chương trình báo lỗi ở mã code sau " Sheets("DATA").Range("B1:AY4").Copy nws.Range("A1") ". Rất mong bạn gỡ rối ở chỗ này.
Lỗi nằm ở câu lệnh đặt tên cho sheet có ký tự đặc biệt nhưng bị bỏ qua bởi On Error Resume Next, đến sau câu lệnh On Error GoTo 0 thì mắc lỗi không có sheet đích nào để copy sang.

Do đó buộc bạn phải đặt tên khác đi hoặc viết code loại trừ ký tự đó đi (Loại kiểu nào thì tạm thời tôi chưa biết)
 
Upvote 0
Lỗi nằm ở câu lệnh đặt tên cho sheet có ký tự đặc biệt nhưng bị bỏ qua bởi On Error Resume Next, đến sau câu lệnh On Error GoTo 0 thì mắc lỗi không có sheet đích nào để copy sang.

Do đó buộc bạn phải đặt tên khác đi hoặc viết code loại trừ ký tự đó đi (Loại kiểu nào thì tạm thời tôi chưa biết)
Bạn thay bằng file này, trong đó tôi đã thêm đoạn code thay bất kỳ ký tự đặc biệt nào thành dấu _ (gạch thấp)
 

File đính kèm

Upvote 0
Bạn thay bằng file này, trong đó tôi đã thêm đoạn code thay bất kỳ ký tự đặc biệt nào thành dấu _ (gạch thấp)
Cảm ơn bạn nhiều. Chương trình chạy rất tốt chỉ có lưu ý nhỏ nhờ bạn giúp mình cho hoàn thiện hơn. Dữ liệu xuất ra ở cột tên lớp dữ liệu đổi thành ngày tháng năm (khó nhìn) bạn ơi, mong bạn hướng dẫn thêm.
 
Upvote 0
Cảm ơn bạn nhiều. Chương trình chạy rất tốt chỉ có lưu ý nhỏ nhờ bạn giúp mình cho hoàn thiện hơn. Dữ liệu xuất ra ở cột tên lớp dữ liệu đổi thành ngày tháng năm (khó nhìn) bạn ơi, mong bạn hướng dẫn thêm.
Tìm đoạn này thêm dòng đậm vào nhé:
Worksheets.Add after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) 'tao va dem worksheet moi o phia sau sheet hien tai
Set nws = ActiveSheet
nws.Range("R5:R" & 4 + k).NumberFormat = "@"
On Error Resume Next

Tiện thể sửa lại cột M thay cho cột N ở dòng (để ở N có làm giãn rộng cột N -> xấu):
nws.Range("N" & k + 6) = "..............., Ngày ..... Tháng ..... " & Left(Sheets("DATA").Range("A1"), 3) & " 20...."
 
Upvote 0
Tìm đoạn này thêm dòng đậm vào nhé:
Worksheets.Add after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) 'tao va dem worksheet moi o phia sau sheet hien tai
Set nws = ActiveSheet
nws.Range("R5:R" & 4 + k).NumberFormat = "@"
On Error Resume Next

Tiện thể sửa lại cột M thay cho cột N ở dòng (để ở N có làm giãn rộng cột N -> xấu):
nws.Range("N" & k + 6) = "..............., Ngày ..... Tháng ..... " & Left(Sheets("DATA").Range("A1"), 3) & " 20...."
Rất cảm ơn bạn, sau khi thêm dòng tô đậm chương trình chạy rất Ok. Mình thêm 1 vài dòng lệnh cho dòng ngày tháng năm nhìn ok hơn (code hơi lòng vòng 1 tí ) mong bạn hướng dẫn thêm:
nws.Range("M" & k + 6) = "..............., Ngày ..... Tháng ..... " & Left(Sheets("DATA").Range("A1"), 3) & " 20...."
nws.Range("M" & k + 6).Font.Italic = True
nws.Range("M" & k + 6).HorizontalAlignment = xlCenter
nws.Range("M" & k + 7) = "NG" & ChrW(431) & ChrW(7900) & "I L" & ChrW(7852) & "P B" & ChrW(7842) & "NG"
nws.Range("M" & k + 7).Font.Bold = True
nws.Range("M" & k + 7).HorizontalAlignment = xlCenter
nws.Range("M" & k + 11) = "Nguy" & ChrW(7877) & "n Hoàng Ph" & ChrW(432) & ChrW(417) & "ng"
nws.Range("M" & k + 11).Font.Bold = True
nws.Range("M" & k + 11).HorizontalAlignment = xlCenter
 

File đính kèm

  • Screenshot (3).png
    Screenshot (3).png
    221.2 KB · Đọc: 9
Upvote 0
Vậy thôi chứ chi đâu lòng vòng. Có chăng là dùng With để gọn chút thôi. Ví dụ:
nws.Range("M" & k + 7) = "NG" & ChrW(431) & ChrW(7900) & "I L" & ChrW(7852) & "P B" & ChrW(7842) & "NG"
nws.Range("M" & k + 7).Font.Bold = True
nws.Range("M" & k + 7).HorizontalAlignment = xlCenter

thì viết lại thành:
With nws.Range("M" & k + 7)
.Value = "NG" & ChrW(431) & ChrW(7900) & "I L" & ChrW(7852) & "P B" & ChrW(7842) & "NG"
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With
 
Upvote 0
Vậy thôi chứ chi đâu lòng vòng. Có chăng là dùng With để gọn chút thôi. Ví dụ:
nws.Range("M" & k + 7) = "NG" & ChrW(431) & ChrW(7900) & "I L" & ChrW(7852) & "P B" & ChrW(7842) & "NG"
nws.Range("M" & k + 7).Font.Bold = True
nws.Range("M" & k + 7).HorizontalAlignment = xlCenter

thì viết lại thành:
With nws.Range("M" & k + 7)
.Value = "NG" & ChrW(431) & ChrW(7900) & "I L" & ChrW(7852) & "P B" & ChrW(7842) & "NG"
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With
Chào bạn MaiKa8008, cuối tuần chúc bạn sức khỏe và hạnh phúc. Mong bạn giúp mình thêm 1 vấn đề nữa là xuất danh sách với nhiều điều kiện. Nội dung diễn giải ở file đính kèm. chân thành cảm ơn bạn.
 

File đính kèm

Upvote 0
Chào bạn MaiKa8008, cuối tuần chúc bạn sức khỏe và hạnh phúc. Mong bạn giúp mình thêm 1 vấn đề nữa là xuất danh sách với nhiều điều kiện. Nội dung diễn giải ở file đính kèm. chân thành cảm ơn bạn.
Chúc cuối tuần vui vẻ, đề phòng covid --=0
 
Upvote 0
Mới chỉ lấy số liệu chép ra sheet. Một trong 2 năm sinh có số liệu thì lấy số liệu cho năm đó. Cả 2 năm đều có thì lấy từ năm #1 đến năm #2
Nếu thấy kiểu này được thì làm tiếp
 

File đính kèm

Upvote 0
Mới chỉ lấy số liệu chép ra sheet. Một trong 2 năm sinh có số liệu thì lấy số liệu cho năm đó. Cả 2 năm đều có thì lấy từ năm #1 đến năm #2
Nếu thấy kiểu này được thì làm tiếp
Cảm ơn nhiều nhé, làm phiền bạn nhiều quá ngại ghê. Theo phương án của bạn cũng được, bạn tiếp tục giúp dùm mình nha. Bạn nhớ xuất ra dùm mình cứ mỗi danh sách thành file riêng nhé (như xuất danh sách lớp vậy). Thân chào bạn.
 
Upvote 0
Cảm ơn nhiều nhé, làm phiền bạn nhiều quá ngại ghê. Theo phương án của bạn cũng được, bạn tiếp tục giúp dùm mình nha. Bạn nhớ xuất ra dùm mình cứ mỗi danh sách thành file riêng nhé (như xuất danh sách lớp vậy). Thân chào bạn.
Chẳng thấy like yếu like mạnh gì cả à?

P/S: Post xong thấy cái like yếu
 
Upvote 0
Chẳng thấy like yếu like mạnh gì cả à?

P/S: Post xong thấy cái like yếu
Xong!
Làm gì thì làm chứ 3 sheet đầu không được xóa nhé!

Chỗ 2 ô năm sinh không nhất thiết ô nào có năm lớn hơn, hễ cứ có dữ liệu cho 2 ô là chạy. Tuy nhiên chưa có bẫy lỗi, nếu nhập chênh lệch 2 năm xa quá (VD: 04 và 2005) là code chạy mệt nghỉ luôn á.
Bài đã được tự động gộp:

Like mạnh là cái này nè 1621079543607.png = 2 x 1621079772551.png
 

File đính kèm

Upvote 0
Xong!
Làm gì thì làm chứ 3 sheet đầu không được xóa nhé!

Chỗ 2 ô năm sinh không nhất thiết ô nào có năm lớn hơn, hễ cứ có dữ liệu cho 2 ô là chạy. Tuy nhiên chưa có bẫy lỗi, nếu nhập chênh lệch 2 năm xa quá (VD: 04 và 2005) là code chạy mệt nghỉ luôn á.
Bài đã được tự động gộp:

Like mạnh là cái này nè View attachment 258700 = 2 x View attachment 258701

Buổi tối vui vẻ nhé! Cảm ơn bạn nhiều. Điều quan trọng là làm sao like mạnh nè thật tình mình không biết luôn.
Bài đã được tự động gộp:

Like mạnh nè View attachment 258700 = 2 x View attachment 258701
 
Upvote 0
Buổi tối vui vẻ nhé! Cảm ơn bạn nhiều. Điều quan trọng là làm sao like mạnh nè thật tình mình không biết luôn.
Bài đã được tự động gộp:

Like mạnh nè View attachment 258700 = 2 x View attachment 258701
Bạn có dùng FB không? Nếu có thì tôi khỏi nói thêm vì nó đâu khác gì lựa chọn giữa like và haha, hoặc love.

Mà làm chi có chuyện bạn không biết FB!
 
Upvote 0
Bạn có dùng FB không? Nếu có thì tôi khỏi nói thêm vì nó đâu khác gì lựa chọn giữa like và haha, hoặc love.

Mà làm chi có chuyện bạn không biết FB!
Mình có dùng FB nhưng chì mở FB xem tin tức ít khi để ý like và haha hoặc love.
Còn trên diễn đàn này mình thấy 3 lựa chọn: Thích +trích dẫn trả lời , mình cứ nghĩ là chọn thích có nghĩa là like ( thật tình không biết like yếu lai mạnh ở đâu luôn).
Cho mình xin lỗi nhé, hứa sẽ cố gắng tìm hiểu chuyện này.
Mình đã chạy thử chương trình nó bị lỗi ở dòng tiêu đề " DANH SÁCH ĐỐI TƯỢNG PHỔ CẬP THCS SINH NĂM...." bị nhằm ở "THCS " danh sách nào cũng hiện " THCS" hết. Mình có chèn thêm code trong sub Chon() như sau để cho tiêu đề phù hợp danh sách. Mong bạn chỉ dẫn thêm.

Sub Chon()
Application.ScreenUpdating = False
If (Sheet2.Range("D12") = "MN") Then
Sheet3.Range("A3") = Sheet3.Range("A3")
End If
If (Sheet2.Range("D12") = "TH") Then
Sheet3.Range("A3") = Sheet3.Range("K3")
End If
If (Sheet2.Range("D12") = "THCS") Then
Sheet3.Range("A3") = Sheet3.Range("K4")
End If
If (Sheet2.Range("D12") = "THPT") Then
Sheet3.Range("A3") = Sheet3.Range("K5")
End If
............
 

File đính kèm

Upvote 0
Sửa mù trên điện thoại vì không thấy code.
Chỗ .Range("A3") = Left(...)
Sửa thành Left(.Range("A3"), số cũ trừ đi 5) & BacTN & " " & NamS
Không phải do code đâu. Thớt bị lỗi thiết kế dữ liệu. Tự dưng chứa dữ liệu trong cái ô cần thay đổi.
If (Sheet2.Range("D12") = "MN") Then
Sheet3.Range("A3") = Sheet3.Range("A3")
End If
...
If (Sheet2.Range("D12") = "THCS") Then
Sheet3.Range("A3") = Sheet3.Range("K4")
End If

Khi THCS thì nó chép cái câu THCS qua A3.
Khi MN thì cái câu MN đã bị chép đè mất đất rồi.

Chú: file gì nhìn vào màu mè còn hơn gánh hát cải lương, rối cả mắt.
Sheet dùng lấy và ghi dữ liệu mà còn merge cells nữa. Giỡn mặt với tử thần.
 
Upvote 0
Câu tôi viết là để sửa cho code của tôi trong bài #26. Hy vọng là thớt biết để tự đưa được vào đúng chỗ.

Đa số người bây giờ lạm dụng định dạng cell, nhưng theo thời gian nếu biết quản lý dữ liệu thì sẽ dần dần thay đổi cho phù hợp.
 
Upvote 0
Sửa mù trên điện thoại vì không thấy code.
Chỗ .Range("A3") = Left(...)
Sửa thành Left(.Range("A3"), số cũ trừ đi 5) & BacTN & " " & NamS
Cảm ơn bạn đã hướng dẫn!
Mình sửa lại phần tiêu đề ở sheet (Mauln) thành DANH SÁCH ĐỐI TƯỢNG PHỔ CẬP TN.
Thay code như sau cho gọn: nws.Range("A3") = Sheet3.Range("A3") & " " & BacTN & " " & "SINH" & " " & NamS. Chương trình chạy rất tốt khớp với tiêu đề.
Đây là file dữ liệu quản lý đối tượng phổ cập giáo dục, xóa mù chữ, mình chỉ đơn cử lấy 1 thôn với số liệu nhỏ nhất, thực tế trong 1 địa phương có rất nhiều thôn, xóm (địa bàn).
Như vậy file dữ liệu đầy đủ của 1 địa phương lên tới mấy chục ngàn dòng, trích xuất rất nhiều danh sách, thống kê rất nhiều biểu mẫu. Sau này cần sự giúp đỡ của bạn nhiều. Cuối tuần chúc bạn vui vẻ, hạnh phúc. Thân chào.
 
Upvote 0
Chào bạn Maika8008 ! Do khả năng mình có hạn nên hôm nay lại làm phiền bạn 1 lần nữa nè. Vấn đề cần giúp đã diễn giải trong file đính kèm. Xin chân thành cảm ơn.
 

File đính kèm

Upvote 0
Upvote 0
Không có chi. Chúc bạn vui vẻ!
Hi! Maika8008. Gần 1 tháng nay mình học hỏi từ kiến thức vba của bạn mới được 10% à, chưa đủ công lực để giải quyết công việc của mình. Rất mong bạn chỉ dẫn thêm ( nội dung mô tả có trong file đính kèm á). Xin chân thành cảm ơn.
 

File đính kèm

Upvote 0
Ngó vậy chứ hết hơi à! Tôi làm từ đầu chứ không sửa sang chi.
Ké anh Thớt tý.
Bác @Maika8008 em có code lấy dữ liệu từ file đang đóng sang file đang mở(em xin của bác @buiquangthuan). Mỗi khi chạy code thì yêu cầu phải pick chọn file. Có các nào đổi lệnh pick chọn file thành đường dẫn cố định được không ạ! (file mở và file đang đóng cùng một Folder). Em cảm ơn bác!
PHP:
Sub lay_data_file_dong_sang_file_mo()
  Dim cn As Object, rs As Object
  Dim eRow&, includeList$, excludeList$, Sql$
  With Sheet1
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 2 Then .Range("A2:C" & eRow).Clear
  End With
 With Application.FileDialog(msoFileDialogFilePicker) '<--------- chỗ này chỉnh thành đường dẫn cố định được không ạ?
    .Filters.Add "All Excel", "*.xls*"
    .AllowMultiSelect = False
    .Show
    If .SelectedItems.Count < 1 Then MsgBox ("Ban khong chon file nao"): Exit Sub
    If .SelectedItems.Count Then
 
      On Error Resume Next
      Set cn = CreateObject("adodb.connection")
      cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & .SelectedItems(1) & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
      Sql = "SELECT * FROM [$A2:C] WHERE f1 is not Null"
      Set rs = cn.Execute(Sql)
      If Not rs.EOF Then Sheet1.Range("A2").CopyFromRecordset rs
      rs.Close:      cn.Close
      Set rs = Nothing: Set cn = Nothing
      On Error GoTo 0
    End If
  End With
End Sub
Ví dụ cho 2 file đính kèm vào ổ D trong Folder tên là GPE: D/GPE
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
1. kiến thức học theo cấp số cộng sao?
2. bộ vốn bác ta nằm ì đó không tăng à?
Nhưng quan trọng hơn cả: câu ấy chỉ là câu nịnh thôi, ai mà biết thực sự người ta có học hay không.
Tỉ lệ tăng không ăn thua anh ạ, vốn tích lũy của bác Maika 30 năm nay giờ cộng thêm 1 năm nữa có lẽ không đáng kể. Tính trung bình thì 10% tương đương với 3 năm, vậy mà bây giờ chỉ 1 tháng đã học được, phần thêm 1 năm kia chắc chỉ vài hôm là xong nốt thôi anh.
 
Upvote 0
Buổi tối vui vẻ nhé! Cảm ơn bạn nhiều. Điều quan trọng là làm sao like mạnh nè thật tình mình không biết luôn.
Bài đã được tự động gộp:

Like mạnh nè View attachment 258700 = 2 x View attachment 258701
Giữ ngon tay vào chữ "Thích" dưới bài của người khác, nó hiện nhiều lựa chọn. Lúc chọn thả tim là like mạnh đấy.
Bác Mai cũng cháu nội cháu ngoại cả rồi bạn Thớt ạ.
Bài đã được tự động gộp:

@Thư Sinh Áo Trắng
Được chứ! Nhưng trước khi tôi trả lời, bạn chạy từng bước từng dòng code để tự trả lời đi đã.
Em có đánh dấu vào code, biết đó là phần code mở lên sự kiện pick file. Có đọc tài nguyên trên diễn đàn. Đa số code toàn pick chọn file nên em không học mót được. Thật lòng mong bác giúp cho đoạn code là đường dẫn cố định.
 
Lần chỉnh sửa cuối:
Upvote 0
Giữ ngon tay vào chữ "Thích" dưới bài của người khác, nó hiện nhiều lựa chọn. Lúc chọn thả tim là like mạnh đấy.
Bác Mai cũng cháu nội cháu ngoại cả rồi bạn Thớt ạ.
Bài đã được tự động gộp:


Em có đánh dấu vào code, biết đó là phần code mở lên sự kiện pick file. Có đọc tài nguyên trên diễn đàn. Đa số code toàn pick chọn file nên em không học mót được. Thật lòng mong bác giúp cho đoạn code là đường dẫn cố định.
Tôi không ở trên máy tính nên không trả lời bạn ngay được. Mai nhé!
 
Upvote 0
Em có đánh dấu vào code, biết đó là phần code mở lên sự kiện pick file. Có đọc tài nguyên trên diễn đàn. Đa số code toàn pick chọn file nên em không học mót được. Thật lòng mong bác giúp cho đoạn code là đường dẫn cố định.
Đường dẫn cố định
Sub lay_data_file_dong_sang_file_mo()
Dim cn As Object, rs As Object, strPath As String
Dim eRow&, includeList$, excludeList$, Sql$
With Sheet1
eRow = .Range("A" & Rows.Count).End(xlUp).Row
If eRow > 2 Then .Range("A2:C" & eRow).Clear
End With
' With Application.FileDialog(msoFileDialogFilePicker) '<--------- ch? này ch?nh thành du?ng d?n c? d?nh du?c không ??
' .Filters.Add "All Excel", "*.xls*"
' .AllowMultiSelect = False
' .Show
' If .SelectedItems.Count < 1 Then MsgBox ("Ban khong chon file nao"): Exit Sub
' If .SelectedItems.Count Then
strPath = ThisWorkbook.Path & "\" & "dang_dong.xlsm" 'Duong dan co dinh
On Error Resume Next
Set cn = CreateObject("adodb.connection")
cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & strPath & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
Sql = "SELECT * FROM [$A2:C] WHERE f1 is not Null"
Set rs = cn.Execute(Sql)
If Not rs.EOF Then Sheet1.Range("A2").CopyFromRecordset rs
rs.Close: cn.Close
Set rs = Nothing: Set cn = Nothing
On Error GoTo 0
' End If
'End With
End Sub
 
Upvote 0
Hi! Maika8008. Gần 1 tháng nay mình học hỏi từ kiến thức vba của bạn mới được 10% à, chưa đủ công lực để giải quyết công việc của mình. Rất mong bạn chỉ dẫn thêm ( nội dung mô tả có trong file đính kèm á). Xin chân thành cảm ơn.
Chỗ: If NamS = arr(i, 6) Then 'tim nam sinh

Sửa thành: If NamS = arr(i, 6) And arr(i, 30) <> "" And arr(i, 31) <> "" Then

Lý do: Bạn chưa đặt điều kiện cho cột 30 và 31 phải có dữ liệu. Như câu của bạn, dù có bỏ học hay không, cứ sinh đúng năm arr(i, 6) thì lấy tuốt.

Ngoài ra chỗ này: NamS = IIf(Sheet2.Range("A7") <> "", Sheet2.Range("A7"), Sheet2.Range("B7"))
phải sửa thành:
If Sheet2.Range("A7") <> "" Then
NamS = Sheet2.Range("A7")
Else
MsgBox "Chua nhap nam sinh."
End If
 
Upvote 0
Đường dẫn cố định
Sub lay_data_file_dong_sang_file_mo()
Dim cn As Object, rs As Object, strPath As String
Dim eRow&, includeList$, excludeList$, Sql$
With Sheet1
eRow = .Range("A" & Rows.Count).End(xlUp).Row
If eRow > 2 Then .Range("A2:C" & eRow).Clear
End With
' With Application.FileDialog(msoFileDialogFilePicker) '<--------- ch? này ch?nh thành du?ng d?n c? d?nh du?c không ??
' .Filters.Add "All Excel", "*.xls*"
' .AllowMultiSelect = False
' .Show
' If .SelectedItems.Count < 1 Then MsgBox ("Ban khong chon file nao"): Exit Sub
' If .SelectedItems.Count Then
strPath = ThisWorkbook.Path & "\" & "dang_dong.xlsm" 'Duong dan co dinh
On Error Resume Next
Set cn = CreateObject("adodb.connection")
cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & strPath & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
Sql = "SELECT * FROM [$A2:C] WHERE f1 is not Null"
Set rs = cn.Execute(Sql)
If Not rs.EOF Then Sheet1.Range("A2").CopyFromRecordset rs
rs.Close: cn.Close
Set rs = Nothing: Set cn = Nothing
On Error GoTo 0
' End If
'End With
End Sub
Cảm ơn bác. Vậy là tất cả các dòng code đổi thành comment bỏ đi hết.
 
Upvote 0
Chỗ: If NamS = arr(i, 6) Then 'tim nam sinh

Sửa thành: If NamS = arr(i, 6) And arr(i, 30) <> "" And arr(i, 31) <> "" Then

Lý do: Bạn chưa đặt điều kiện cho cột 30 và 31 phải có dữ liệu. Như câu của bạn, dù có bỏ học hay không, cứ sinh đúng năm arr(i, 6) thì lấy tuốt.

Ngoài ra chỗ này: NamS = IIf(Sheet2.Range("A7") <> "", Sheet2.Range("A7"), Sheet2.Range("B7"))
phải sửa thành:
If Sheet2.Range("A7") <> "" Then
NamS = Sheet2.Range("A7")
Else
MsgBox "Chua nhap nam sinh."
End If
Báo cáo bạn Maika8008 chương trình chạy rất tốt. Nút gỡ vấn đề này nằm ở câu Code If NamS = arr(i, 6) And arr(i, 31) <> "" Then ...... Vậy mà mình suy nghĩ hoài không ra. Chân thành cảm ơn. Chúc bạn sức khỏe và hạnh phúc, chào bạn.
 
Upvote 0
Chào bạn Maika8008 ! Cuối tuần làm phiền bạn tí nha. Mình dùng Record Macro thu lại code như sau: (Mục đích là Insert Shapes hiện vào ô trống ngoài dữ liệu phía bên phải của dòng 1)
Sub InsertShape()
Range("A1").Select
Selection.End(xlToRight).Select
ActiveCell.Offset(0, 1).Activate
ActiveSheet.Shapes.AddShape(msoShapeLeftArrow, ActivateCell, 14.25, 40.5, 17.25).Select
Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "X"
End Sub
Khi thực hiện Macro thì chương trình chạy không đúng theo ý mình, Shape cứ hiện ở bên trái của dòng không hà. Mong bạn chỉ dẫn thêm. Cảm ơn.
 

File đính kèm

Upvote 0
Chào bạn Maika8008 ! Cuối tuần làm phiền bạn tí nha. Mình dùng Record Macro thu lại code như sau: (Mục đích là Insert Shapes hiện vào ô trống ngoài dữ liệu phía bên phải của dòng 1)
Sub InsertShape()
Range("A1").Select
Selection.End(xlToRight).Select
ActiveCell.Offset(0, 1).Activate
ActiveSheet.Shapes.AddShape(msoShapeLeftArrow, ActivateCell, 14.25, 40.5, 17.25).Select
Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "X"
End Sub
Khi thực hiện Macro thì chương trình chạy không đúng theo ý mình, Shape cứ hiện ở bên trái của dòng không hà. Mong bạn chỉ dẫn thêm. Cảm ơn.
Bạn đặt lại thuộc tính left của shape bằng với left của cell bạn muốn
 
Upvote 0
Chào bạn Maika8008 ! Cuối tuần làm phiền bạn tí nha. Mình dùng Record Macro thu lại code như sau: (Mục đích là Insert Shapes hiện vào ô trống ngoài dữ liệu phía bên phải của dòng 1)
Sub InsertShape()
Range("A1").Select
Selection.End(xlToRight).Select
ActiveCell.Offset(0, 1).Activate
ActiveSheet.Shapes.AddShape(msoShapeLeftArrow, ActivateCell, 14.25, 40.5, 17.25).Select
Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "X"
End Sub
Khi thực hiện Macro thì chương trình chạy không đúng theo ý mình, Shape cứ hiện ở bên trái của dòng không hà. Mong bạn chỉ dẫn thêm. Cảm ơn.
Vấn đề mới thì nên mở bài mới để bạn nào quan tâm đến còn tìm được chứ cứ chui hết vào một bài thế này thì tìm sao thấy được nhỉ.
 
Upvote 0
Upvote 0
Nhiều lúc tôi mất 2 giờ chỉ để thử để biết các shape chấp nhận thuộc tính, phương thức gì, cách thức nó chấp nhận.
Báo cáo bạn MaiKa8008, Vẫn theo hướng chỉ dẫn của bạn là " đặt lại thuộc tính left của shape bằng với left của cell bạn muốn" cuối cùng mình đã làm được rồi, Cảm ơn bạn nhiều ! Đây là đoạn code vừa chỉnh xong:
Sub InsertShape1()

Range("A1").Select
Selection.End(xlToRight).Select
ActiveSheet.Shapes.AddShape(msoShapeLeftArrow, ActiveCell.Offset(0, 1).Left, 14.25, 40.5, 25.25).Select
Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "X"

End Sub
 
Upvote 0
Báo cáo bạn MaiKa8008, Vẫn theo hướng chỉ dẫn của bạn là " đặt lại thuộc tính left của shape bằng với left của cell bạn muốn" cuối cùng mình đã làm được rồi, Cảm ơn bạn nhiều ! Đây là đoạn code vừa chỉnh xong:
Sub InsertShape1()

Range("A1").Select
Selection.End(xlToRight).Select
ActiveSheet.Shapes.AddShape(msoShapeLeftArrow, ActiveCell.Offset(0, 1).Left, 14.25, 40.5, 25.25).Select
Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "X"

End Sub
Rất mừng là bạn đã có nhiều cố gắng. Đúng rồi, bạn đã tạo ra được hình mũi tên chỉ sang trái và nằm ở cạnh trái của ô B1 (Vì ban đầu là Range("A1").Select, sau đó ActiveCell.Offset(0, 1).Left là sang bên trái 1 ô -> B1).
Tuy nhiên thừa 1 dòng: Selection.End(xlToRight).Select chỉ để dời ô hiện hành sang phải 1 khoảng xlToRight chứ không dính gì đến cái dấu mũi tên kia.

Bây giờ tôi gửi cho bạn 1 đoạn code có trong 1 ứng dụng của tôi (chỉ có dòng đầu là tôi lấy của bạn, sửa lại 1 chút chỗ LEFT).
Sub TaoNutIn()
ActiveSheet.Shapes.AddShape(msoShapeRightArrow, 105, 14.25, 40.5, 25.25).Select
Selection.ShapeRange.Left = Range("F1").Left 'hoac Right cua cell
Selection.ShapeRange.Top = Range("F5").Top 'hoac Bottom cua 1 cell
Selection.ShapeRange.Height = 41 'Hoac Range("XX").RowHeight
Selection.ShapeRange.Width = 89 'Hoac Range("XX").ColumnWidth
Selection.ShapeRange.TextFrame2.TextRange.Characters.Text = "IN PHIEU"
End Sub


Đấy bạn xem, sau khi đã tao ra 1 shape (dù nó được tạo ra ở vị trí nào) thì muốn dời nó đi đâu mình chỉ ra rõ ràng.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào bạn Maika8008! Khi nào bạn rảnh giúp mình 1 vấn đền này nha. Đối với mình thì vượt quá khả năng.
Xem thông tin số phiếu từ sheet(DATA) (sheet(DATA) là file tổng hợp từ nhiều file thành 1 file).
Mọi chi tiết mô tả ở file đính kèm. Cảm ơn ! Chúc Maika8008 sức khỏe và hạnh phục.
 

File đính kèm

Upvote 0
Chào bạn Maika8008! Khi nào bạn rảnh giúp mình 1 vấn đền này nha. Đối với mình thì vượt quá khả năng.
Xem thông tin số phiếu từ sheet(DATA) (sheet(DATA) là file tổng hợp từ nhiều file thành 1 file).
Mọi chi tiết mô tả ở file đính kèm. Cảm ơn ! Chúc Maika8008 sức khỏe và hạnh phục.
Thử file. Bấm nút để chạy code.
 

File đính kèm

Upvote 0
Thử file. Bấm nút để chạy code.
Cảm ơn bạn Maika8008 nhé!
Sau 1 thời gian mình đã chạy thử chương trình báo cáo bạn như sau:
- Phải nói quá tuyệt vời ( nhanh gọn ), khớp với dữ liệu.
- Trong quá trình mô tả yêu cầu còn thiếu thông tin cột ghi chú của sheet(PHIEU), mình cũng bổ sung được rồi ( ...F44, F49 From... ).
- Trong Code còn thiếu 3 thông tin: Điện thoại: Cell( Z3 ), Thường trú: Cell( AA2 ), Tạm Trú: Cell( AC2 ). 3 thông tin này lấy từ dòng trường dữ liệu của chủ hộ của Sheet(DATA). Tại Sheet(DATA) cột Q tại dòng dữ liệu chủ hộ nếu có dữ liệu " Vắng " thì ghi vào sheet(PHIEU) tại Cell( AA2 ) Nếu có dữ liệu " Lưu trú " thì ghi vào Cell( AC2 ), Cột ( AY ) nếu có dữ liệu số điện thoại thì ghi vào Cell( Z3 ). Mong bạn hướng dẫn thêm. Chào bạn.
 
Upvote 0
Cảm ơn bạn Maika8008 nhé!
Sau 1 thời gian mình đã chạy thử chương trình báo cáo bạn như sau:
- Phải nói quá tuyệt vời ( nhanh gọn ), khớp với dữ liệu.
- Trong quá trình mô tả yêu cầu còn thiếu thông tin cột ghi chú của sheet(PHIEU), mình cũng bổ sung được rồi ( ...F44, F49 From... ).
- Trong Code còn thiếu 3 thông tin: Điện thoại: Cell( Z3 ), Thường trú: Cell( AA2 ), Tạm Trú: Cell( AC2 ). 3 thông tin này lấy từ dòng trường dữ liệu của chủ hộ của Sheet(DATA). Tại Sheet(DATA) cột Q tại dòng dữ liệu chủ hộ nếu có dữ liệu " Vắng " thì ghi vào sheet(PHIEU) tại Cell( AA2 ) Nếu có dữ liệu " Lưu trú " thì ghi vào Cell( AC2 ), Cột ( AY ) nếu có dữ liệu số điện thoại thì ghi vào Cell( Z3 ). Mong bạn hướng dẫn thêm. Chào bạn.
bác cho em hỏi với file của bác lúc xuất ra file 1C và 1D thì có cả xóm 1D,1E,1CS trong đó thì có đúng không bác? cảm ơn bác!
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn Maika8008 nhé!
Sau 1 thời gian mình đã chạy thử chương trình báo cáo bạn như sau:
- Phải nói quá tuyệt vời ( nhanh gọn ), khớp với dữ liệu.
- Trong quá trình mô tả yêu cầu còn thiếu thông tin cột ghi chú của sheet(PHIEU), mình cũng bổ sung được rồi ( ...F44, F49 From... ).
- Trong Code còn thiếu 3 thông tin: Điện thoại: Cell( Z3 ), Thường trú: Cell( AA2 ), Tạm Trú: Cell( AC2 ). 3 thông tin này lấy từ dòng trường dữ liệu của chủ hộ của Sheet(DATA). Tại Sheet(DATA) cột Q tại dòng dữ liệu chủ hộ nếu có dữ liệu " Vắng " thì ghi vào sheet(PHIEU) tại Cell( AA2 ) Nếu có dữ liệu " Lưu trú " thì ghi vào Cell( AC2 ), Cột ( AY ) nếu có dữ liệu số điện thoại thì ghi vào Cell( Z3 ). Mong bạn hướng dẫn thêm. Chào bạn.
Hướng dẫn cho bạn làm thử nghe:
1/ Thêm 2 trường F15 và F48 vào đoạn SQL thứ hai (đoạn lấy kết quả trung gian) để lấy thêm 2 cột Q và cột AY của DATA.
Tại sheet4:
2/ Trích chữ "chủ hộ" từ ô J2 (vì không gõ trên VBA được).
3/ Dùng phương thức Find VBA để tìm lấy số dòng của chữ "chủ hộ" trong cột D từ "D9: D" & dongcuoi (dòng cuối cùng của dữ liệu kết quả). Tạm dùng biến DongCH để lưu dòng đó
4/ lấy "AO" & DongCH gán vào ô Z3
5/ Nếu AN & DongCH có ký từ đầu là V (tức ô chứa chữ Vắng) thì lấy nó gán vào AA2. Nếu AN & DongCH có ký từ đầu là L (tức ô chứa chữ Lưu trú) thì lấy nó gán vào AC2
Xong./.
 
Upvote 0
Hướng dẫn cho bạn làm thử nghe:
1/ Thêm 2 trường F15 và F48 vào đoạn SQL thứ hai (đoạn lấy kết quả trung gian) để lấy thêm 2 cột Q và cột AY của DATA.
Tại sheet4:
2/ Trích chữ "chủ hộ" từ ô J2 (vì không gõ trên VBA được).
3/ Dùng phương thức Find VBA để tìm lấy số dòng của chữ "chủ hộ" trong cột D từ "D9: D" & dongcuoi (dòng cuối cùng của dữ liệu kết quả). Tạm dùng biến DongCH để lưu dòng đó
4/ lấy "AO" & DongCH gán vào ô Z3
5/ Nếu AN & DongCH có ký từ đầu là V (tức ô chứa chữ Vắng) thì lấy nó gán vào AA2. Nếu AN & DongCH có ký từ đầu là L (tức ô chứa chữ Lưu trú) thì lấy nó gán vào AC2
Xong./.
Cảm ơn bạn đã hướng dẫn ! Mình dựa vào phương thức ( code ) của bạn, từ đó mình viết code như thế này bạn xem có được hay không? ( nhìn thì không có bài bản cho lắm ).
1/ thêm 2 trường F15 và F48 vào đoạn SQL tiếp theo (đoạn lấy kết quả trung gian) để lấy thêm 2 cột Q và cột AY của DATA.
Tại sheet4: Ghi vào AF20 và AG20: Code như sau:
.Open ("Select F15, F48 From [DATA$C4:AY" & dong & "] Where F13 = " & Phieu & " And F12 Like " & Xom), cnn
Sheet4.Range("AF16"). CopyFromRecordset . DataSource
.Close
2/ Chép dữ liệu từ Ô AF20 và ô AG20 vào Ô AA2, AC2 và Z3 Code như sau: (code này mình đặt ở cuối chương trình )

Sheet4.Range("Z9").Resize(UBound(arr, 1), 1) = arrKT
............................................

Range("Z3").Value = Range("AG20").Value
If Range("AF20").Value = "Lưu Trú" Then
Range("AC2").Value = "Lưu Trú"
ElseIf Range("AF20").Value = "V" & ChrW(7855) & "ng" Then
Range("AA2").Value = "V" & ChrW(7855) & "ng"
ElseIf Range("AF20").Value = "" Then
Range("AA2") = ""
Range("AC2") = ""
End If
Range("AF20:AG20").ClearContents
.........................................................

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

MsgBox "Xong!"
3/ Xóa dữ liệu tạm: Range("AF20:AG20").ClearContents
* Khi nào bạn rảnh giúp dùm mình phần II nha. Chúc bạn buổi tối An lành và hạnh phúc.
 
Upvote 0
Cảm ơn bạn đã hướng dẫn ! Mình dựa vào phương thức ( code ) của bạn, từ đó mình viết code như thế này bạn xem có được hay không? ( nhìn thì không có bài bản cho lắm ).
1/ thêm 2 trường F15 và F48 vào đoạn SQL tiếp theo (đoạn lấy kết quả trung gian) để lấy thêm 2 cột Q và cột AY của DATA.
Tại sheet4: Ghi vào AF20 và AG20: Code như sau:
.Open ("Select F15, F48 From [DATA$C4:AY" & dong & "] Where F13 = " & Phieu & " And F12 Like " & Xom), cnn
Sheet4.Range("AF16"). CopyFromRecordset . DataSource
.Close
2/ Chép dữ liệu từ Ô AF20 và ô AG20 vào Ô AA2, AC2 và Z3 Code như sau: (code này mình đặt ở cuối chương trình )

Sheet4.Range("Z9").Resize(UBound(arr, 1), 1) = arrKT
............................................

Range("Z3").Value = Range("AG20").Value
If Range("AF20").Value = "Lưu Trú" Then
Range("AC2").Value = "Lưu Trú"
ElseIf Range("AF20").Value = "V" & ChrW(7855) & "ng" Then
Range("AA2").Value = "V" & ChrW(7855) & "ng"
ElseIf Range("AF20").Value = "" Then
Range("AA2") = ""
Range("AC2") = ""
End If
Range("AF20:AG20").ClearContents
.........................................................

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

MsgBox "Xong!"
3/ Xóa dữ liệu tạm: Range("AF20:AG20").ClearContents
* Khi nào bạn rảnh giúp dùm mình phần II nha. Chúc bạn buổi tối An lành và hạnh phúc.
Vấn đề là chạy được không, kết quả có đúng không? Với bạn thì cứ chạy được là được, bất chấp code dài code ngắn, bất chấp truyền thống hoặc thông lệ.
 
Upvote 0
1C thì sẽ có thêm 1CS (nếu có 1CS), còn 1D không thể ra 1E được
Khi em chạy ấn xuất file trong TONG HOP thì có tạo ra file 1D. Trong 1D có cả 1E; 1 CS; thậm chí có cả CS tại dòng 1913 đến 1918 (em có gửi file đi kèm - 1C cũng tương tự)
 

File đính kèm

Upvote 0
Khi em chạy ấn xuất file trong TONG HOP thì có tạo ra file 1D. Trong 1D có cả 1E; 1 CS; thậm chí có cả CS tại dòng 1913 đến 1918 (em có gửi file đi kèm - 1C cũng tương tự)
Đang chuyện mới bạn lại hỏi lấn sang chuyện cũ. Vậy câu trả lời bài #63 của tôi là vô nghĩa.
Lỗi tại chỗ này: đang 1CS tự nhiên lại chen vào 1D CS. Nó lấy từ dòng đầu khi tìm thấy 1D đến dòng 4310.
1623378524767.png
 
Lần chỉnh sửa cuối:
Upvote 0
@huynhphuong thcspt
Code có bổ sung phần hướng dẫn ở bài #64
Rich (BB code):
Sub Loc()
Dim Rec As Object, dong As Long, i As Long, j As Long, dCH As Long
Dim Xom As String, Phieu As String, sCH As String
Dim arr, arrKT

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Sheet4.Range("B9:CB500").ClearContents
    dong = Sheet1.Range("C" & Rows.Count).End(xlUp).Row
    Phieu = "'" & Sheet4.Range("C1") & "'"
    Xom = "'%" & Sheet4.Range("C2") & "%'"
    Dim cnn As String
    cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=No"""
    Set Rec = CreateObject("ADODB.Recordset")
    With Rec
        .Open ("Select F1,F2,F46,F3,F4,F5,F6,F7,F8,F47,F17,F19,F21,F22,F23,F24,F26,F27,F28,F29,F30,F31,F32,F33,F41,F42,F43,F44 From [DATA$C4:AY" & dong & "]  Where F13 = " & Phieu & " And F12 Like " & Xom), cnn
        Sheet4.Range("B9").CopyFromRecordset .DataSource
        .Close
        .Open ("Select F34, F35, F36, F37, F38, F39, F40, F41, F15, F48 From [DATA$C4:AY" & dong & "]  Where F13 = " & Phieu & " And F12 Like " & Xom), cnn
        Sheet4.Range("AF9").CopyFromRecordset .DataSource
        .Close
        .Open ("Select First(F10),First(F11) From [DATA$C4:AY" & dong & "]  Where F13 = " & Phieu & " And F12 Like " & Xom), cnn
        Sheet4.Range("L2").CopyFromRecordset .DataSource
        .Close
    End With
    Set Rec = Nothing
    arr = Sheet4.Range("AF9:AM" & Sheet4.Range("C" & Rows.Count).End(xlUp).Row)
    ReDim arrKT(1 To UBound(arr, 1), 1 To 1)
    For i = 1 To UBound(arr, 1)
        For j = 1 To UBound(arr, 2)
            If Trim(arr(i, j)) <> "" Then arrKT(i, 1) = arrKT(i, 1) & Right(Sheet1.Cells(2, j + 35), Len(Sheet1.Cells(2, j + 35)) - 11) & "; "
        Next
        If Trim(arrKT(i, 1)) <> "" Then arrKT(i, 1) = Left(Trim(arrKT(i, 1)), Len(Trim(arrKT(i, 1))) - 1)
    Next
    Sheet4.Range("Z9").Resize(UBound(arr, 1), 1) = arrKT
    sCH = Mid(Sheet4.Range("J2"), InStr(1, Sheet4.Range("J2"), "ch"), 6)
    dCH = Sheet4.Range("D9:D" & UBound(arr, 1) + 8).Find(What:=sCH, LookIn:=xlFormulas, LookAt:=xlWhole).Row
    Sheet4.Range("Z3") = Sheet4.Range("AO" & dCH)
    If UCase(Left(Sheet4.Range("AN" & dCH), 1)) = "V" Then
        Sheet4.Range("AA2") = Sheet4.Range("AN" & dCH)
    ElseIf UCase(Left(Sheet4.Range("AN" & dCH), 1)) = "L" Then
        Sheet4.Range("AC2") = Sheet4.Range("AN" & dCH)
    End If
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    MsgBox "Xong!"
End Sub
 
Upvote 0
@huynhphuong thcspt
Code có bổ sung phần hướng dẫn ở bài #64
Rich (BB code):
Sub Loc()
Dim Rec As Object, dong As Long, i As Long, j As Long, dCH As Long
Dim Xom As String, Phieu As String, sCH As String
Dim arr, arrKT

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Sheet4.Range("B9:CB500").ClearContents
    dong = Sheet1.Range("C" & Rows.Count).End(xlUp).Row
    Phieu = "'" & Sheet4.Range("C1") & "'"
    Xom = "'%" & Sheet4.Range("C2") & "%'"
    Dim cnn As String
    cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=No"""
    Set Rec = CreateObject("ADODB.Recordset")
    With Rec
        .Open ("Select F1,F2,F46,F3,F4,F5,F6,F7,F8,F47,F17,F19,F21,F22,F23,F24,F26,F27,F28,F29,F30,F31,F32,F33,F41,F42,F43,F44 From [DATA$C4:AY" & dong & "]  Where F13 = " & Phieu & " And F12 Like " & Xom), cnn
        Sheet4.Range("B9").CopyFromRecordset .DataSource
        .Close
        .Open ("Select F34, F35, F36, F37, F38, F39, F40, F41, F15, F48 From [DATA$C4:AY" & dong & "]  Where F13 = " & Phieu & " And F12 Like " & Xom), cnn
        Sheet4.Range("AF9").CopyFromRecordset .DataSource
        .Close
        .Open ("Select First(F10),First(F11) From [DATA$C4:AY" & dong & "]  Where F13 = " & Phieu & " And F12 Like " & Xom), cnn
        Sheet4.Range("L2").CopyFromRecordset .DataSource
        .Close
    End With
    Set Rec = Nothing
    arr = Sheet4.Range("AF9:AM" & Sheet4.Range("C" & Rows.Count).End(xlUp).Row)
    ReDim arrKT(1 To UBound(arr, 1), 1 To 1)
    For i = 1 To UBound(arr, 1)
        For j = 1 To UBound(arr, 2)
            If Trim(arr(i, j)) <> "" Then arrKT(i, 1) = arrKT(i, 1) & Right(Sheet1.Cells(2, j + 35), Len(Sheet1.Cells(2, j + 35)) - 11) & "; "
        Next
        If Trim(arrKT(i, 1)) <> "" Then arrKT(i, 1) = Left(Trim(arrKT(i, 1)), Len(Trim(arrKT(i, 1))) - 1)
    Next
    Sheet4.Range("Z9").Resize(UBound(arr, 1), 1) = arrKT
    sCH = Mid(Sheet4.Range("J2"), InStr(1, Sheet4.Range("J2"), "ch"), 6)
    dCH = Sheet4.Range("D9:D" & UBound(arr, 1) + 8).Find(What:=sCH, LookIn:=xlFormulas, LookAt:=xlWhole).Row
    Sheet4.Range("Z3") = Sheet4.Range("AO" & dCH)
    If UCase(Left(Sheet4.Range("AN" & dCH), 1)) = "V" Then
        Sheet4.Range("AA2") = Sheet4.Range("AN" & dCH)
    ElseIf UCase(Left(Sheet4.Range("AN" & dCH), 1)) = "L" Then
        Sheet4.Range("AC2") = Sheet4.Range("AN" & dCH)
    End If
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    MsgBox "Xong!"
End Sub
Cảm ơn bạn MaiKa8008 đã bổ phần hướng dẫ ở bài #64.
Báo cáo: Chương trình chạy rất tốt, khớp với dữ liệu.
Khi nào bạn rảnh giúp dùm mình phần II ở bài #59 nha. Chào bạn!
 
Upvote 0
Cảm ơn bạn MaiKa8008 đã bổ phần hướng dẫ ở bài #64.
Báo cáo: Chương trình chạy rất tốt, khớp với dữ liệu.
Khi nào bạn rảnh giúp dùm mình phần II ở bài #59 nha. Chào bạn!
Có nhiều code, cũng đủ dạng rồi. Tự làm 1 lần xem sao chứ yếu hoài vậy xem sao được.
 
Upvote 0
Có nhiều code, cũng đủ dạng rồi. Tự làm 1 lần xem sao chứ yếu hoài vậy xem sao được.
Bạn nghiên cứu code nhé, nhất là mấy cái Array về chỉ số cột để cập nhật từ arrCol đến arrCol3. Không có cách đó code sẽ dài ngoằng à.
 

File đính kèm

Upvote 0
Có nhiều code, cũng đủ dạng rồi. Tự làm 1 lần xem sao chứ yếu hoài vậy xem sao được.
Em có thể hỏi riêng bác trước được không ? cảm ơn bác ! Em có file "chia nhom" bác có thể xem qua giúp em được không ? Em muốn nhờ giúp nhưng chưa rõ file của mình trong đó có dễ hiểu hay có chỗ nào chưa rõ ràng không! Em cảm ơn bác!
 

File đính kèm

Upvote 0
Em có thể hỏi riêng bác trước được không ? cảm ơn bác ! Em có file "chia nhom" bác có thể xem qua giúp em được không ? Em muốn nhờ giúp nhưng chưa rõ file của mình trong đó có dễ hiểu hay có chỗ nào chưa rõ ràng không! Em cảm ơn bác!
Bạn mở chủ đề mới đi để nhiều người khác còn biết. Tất nhiên tôi sẽ trợ giúp. Còn nếu người khác trợ giúp mà bạn thấy hài lòng thì tốt.
 
Upvote 0
Bạn nghiên cứu code nhé, nhất là mấy cái Array về chỉ số cột để cập nhật từ arrCol đến arrCol3. Không có cách đó code sẽ dài ngoằng à.
Chân thành cảm ơn bạn MaiKa8008 đã trợ giúp mình phần II bài #59.
Sau khi chạy thử chương trình, báo cáo bạn như sau:
Chương trình chạy tốt, bên cạnh đó còn vài lỗi nhỏ như sau:
1/ Xem thông tin số phiếu:
- Cột dữ liệu (chuyển đi, đến, chế), (Ghi chú); Thông tin thường trú, tạm trú và số điện thoại: Chưa khớp mình đã khắc phục được rồi ( F44,F45,F50 From ),..
- Nếu Phiếu và Xóm không có trong (DATA) thì chương trình báo lỗi ở câu lệnh sau: dCH = Sheet4.Range("D9:D" & UBound(arr, 1) + 8).Find(What:=sCH, LookIn:=xlFormulas, LookAt:=xlWhole).Row
2/ Cập nhật vào DATA:
- Cập nhật thêm dữ liệu cột ghi chú sheet(PHIEU) vào cột AY sheet(DATA) mình làm như sau:

Sub SaveInfoToData()
......
arrCol = Array(3, 4, 48, 5, 6, 7, 8, 9, 10, 49, 19, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 51) (bổ sung thêm 51)
......
For j = 1 To 24 sửa thành For j = 1 To 25
Không biết mình sửa như vây có đúng không nhưng khi chạy chương trình không cập nhật được dữ liệu.
Mong bạn hướng dẫn để khắc phục lỗi trên. Chào bàn.
 
Upvote 0
Chân thành cảm ơn bạn MaiKa8008 đã trợ giúp mình phần II bài #59.
Sau khi chạy thử chương trình, báo cáo bạn như sau:
Chương trình chạy tốt, bên cạnh đó còn vài lỗi nhỏ như sau:
1/ Xem thông tin số phiếu:
- Cột dữ liệu (chuyển đi, đến, chế), (Ghi chú); Thông tin thường trú, tạm trú và số điện thoại: Chưa khớp mình đã khắc phục được rồi ( F44,F45,F50 From ),..
- Nếu Phiếu và Xóm không có trong (DATA) thì chương trình báo lỗi ở câu lệnh sau: dCH = Sheet4.Range("D9:D" & UBound(arr, 1) + 8).Find(What:=sCH, LookIn:=xlFormulas, LookAt:=xlWhole).Row
2/ Cập nhật vào DATA:
- Cập nhật thêm dữ liệu cột ghi chú sheet(PHIEU) vào cột AY sheet(DATA) mình làm như sau:

Sub SaveInfoToData()
......
arrCol = Array(3, 4, 48, 5, 6, 7, 8, 9, 10, 49, 19, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 51) (bổ sung thêm 51)
......
For j = 1 To 24 sửa thành For j = 1 To 25
Không biết mình sửa như vây có đúng không nhưng khi chạy chương trình không cập nhật được dữ liệu.
Mong bạn hướng dẫn để khắc phục lỗi trên. Chào bàn.
Số 2/ nếu bạn làm như thế thì sẽ ghi cột loại khuyết tật của PHIEU (cột z) vào cột ghi chú của data => sai
Do đó phải thêm Sheet1.Cells(i, 51) = arr(k, 29) -> 51 thì bạn biết rồi (cột ghi chú của data), còn 29 là cột ghi chú của PHIEU.
Bài đã được tự động gộp:

Còn số 1: bạn bẫy lỗi để nó thông báo lỗi và kết thúc chương trình đi.
 
Lần chỉnh sửa cuối:
Upvote 0
Số 2/ nếu bạn làm như thế thì sẽ ghi cột loại khuyết tật của PHIEU (cột z) vào cột ghi chú của data => sai
Do đó phải thêm Sheet1.Cells(i, 51) = arr(k, 29) -> 51 thì bạn biết rồi (cột ghi chú của data), còn 29 là cột ghi chú của PHIEU.
Bài đã được tự động gộp:

Còn số 1: bạn bẫy lỗi để nó thông báo lỗi và kết thúc chương trình đi.
Chào bạn MaiKa8008 ! Cảm ơn bạn hướng dẫn cách để khắc phục lỗi ở bài #76.
Qua sự hướng dẫn của bạn mình đã khắc phục xong cụ thể:
1/ Mình thêm lệnh bẫy lỗi và thêm thông báo cuối đoạn Code.
Sub Loc()
On Error Resume Next
...............
If Sheet4.Range("L2") <> "" Then
MsgBox "Xong!"
Else
MsgBox "Khong co so phieu nay trong xom !"
End If
End Sub
2/ Cật nhập bổ sung thêm thông tin chủ hộ ở sheet(PHIEU): Họ tên chủ hô: L2, M2; Thường trú AA2, Tạm trú AC2; Điện thoại Z3 vào sheet(DATA):
a) Họ tên chủ hô: L2, M2; Thông tin ghi chú: Code như sau.
Sheet1.Cells(i, 51) = arr(k, 29) 'Cật nhật cột ghi chú (PHIEU) cột (29) vào (DATA) cột 51
Sheet1.Cells(i, 12) = Sheet4.Range("L2") ' Cập nhật họ chủ hộ (L2) vào (DATA) cột 12
Sheet1.Cells(i, 13) = Sheet4.Range("M2") 'Cập nhật tên chủ hộ (M2) vào (DATA) cột 13
b) Thường trú AA2, Tạm trú AC2; Điện thoại Z3 :Code như sau.
b.1/ Thông qua bảng tạm để cập nhập:
Sub SaveInfoToData()
..........
arr = Sheet4.Range("B9:AO" & endR) sửa AM thành AO
........................
Sheet1.Cells(i, 50) = arr(k, 40) 'Cập nhật điện thoại (bang tam) cột 40 vào (DATA) cột 50
Sheet1.Cells(i, 17) = arr(k, 39) 'Cập nhật cư trú (bang tam) cột 39 vào (DATA) cột 17
.................
b.2/ Cập nhật từ Ô AA2, AC2, Z3 rồi ghi dữ liệu vào bảng tạm từ bảng tạm ghi vào (DATA):

Sub SaveInfoToData()
.....................................
sCH = Mid(Sheet4.Range("J2"), InStr(1, Sheet4.Range("J2"), "ch"), 6)
dCH = Sheet4.Range("D9:D" & UBound(arr, 1) + 8).Find(What:=sCH, LookIn:=xlFormulas, LookAt:=xlWhole).Row
Sheet4.Range("AO" & dCH) = Sheet4.Range("Z3") 'Cập nhật điện thoại (Z3) vào bảng tạm cột 40 theo trường dữ liệu của chủ hộ
Sheet1.Cells(i, 50) = arr(k, 40) 'Cập nhật điện thoại từ bảng tạm cột 40 vào (DATA) cột 50

sCH = Mid(Sheet4.Range("J2"), InStr(1, Sheet4.Range("J2"), "ch"), 6)
dCH = Sheet4.Range("D9:D" & UBound(arr, 1) + 8).Find(What:=sCH, LookIn:=xlFormulas, LookAt:=xlWhole).Row
If Sheet4.Range("AA2") = "" And Sheet4.Range("AC2") = "" Then
Sheet4.Range("AN" & dCH) = Sheet4.Range("AA2") 'Cật nhật AA2 vào bảng tạm cột 39 theo trường dữ liệu chủ hộ
Sheet1.Cells(i, 17) = arr(k, 39) 'Cập nhật cư trú bảng tạm cột 39 vào (DATA) cột 17
ElseIf Sheet4.Range("AA2") <> "" And Sheet4.Range("AC2") = "" Then
Sheet4.Range("AN" & dCH) = Sheet4.Range("AA2") 'Cập nhật AA2 vào bảng tạm cột 39 theo trường dữ liệu chủ hộ
Sheet1.Cells(i, 17) = arr(k, 39) 'Cật nhập cư trú bảng tạm bảng tạm cột 39 vào (DATA) cột 17
ElseIf Sheet4.Range("AA2") = "" And Sheet4.Range("AC2") <> "" Then
Sheet4.Range("AN" & dCH) = Sheet4.Range("AC2") 'Cập nhập AC2 vào bảng tạm cột 39 theo trường dữ liệu chủ hộ
Sheet1.Cells(i, 17) = arr(k, 39) 'Cập nhập cư trú bảng tạm cột 39 vào (DATA) cột 17
End If
..................................
Cho mình hỏi ở mục b.2/ : Tại sao Click 2 lần vào nút lệnh (Cập nhập vào data) thì dữ liệu mới cập nhật vào (DATA). Có nghĩa là Click lần 1 vào nút lệnh thì dữ liệu mới cập nhập vào bảng tạm ( DATA chưa cập nhập ), Click lần 2 thì dữ liệu mới cập nhật vào DATA. Mong bạn chỉ dẫn đểgỡ rối vấn đề này. Chào bạn.
 
Upvote 0
1/ Bẫy lỗi quên nhập phiếu tại L2 thì phải bẫy và thoát ngay từ đầu chứ sao lại để đến cuối.
Bẫy còn sót lỗi: có nhập phiếu tại L2 nhưng không tìm thấy số phiếu tại xóm đó.
2/ Dữ liệu ở b.2/ đã có tại bảng tạm rồi (AF đến AO - màu xanh - lấy để điền lên Z3, AA2 hoặc AC2): chừ chỉ cần thêm 2 dòng, sửa 1 dòng là chạy tốt chứ làm gì mà code ghê vậy:
Sửa arr = Sheet4.Range("B9:AM" & endR) thành arr = Sheet4.Range("B9:AO" & endR) để lấy thêm 2 cột nữa mà trước đó không lấy
Thêm
Sheet1.Cells(i, 17) = arr(k, 39)
Sheet1.Cells(i, 50) = arr(k, 40)
trước dòng Next cuối sub
Sau này hãy chép code vào trong thẻ code (công cụ đầu tiên bên trái) cho rõ ràng, chứ nhìn vậy rối, không đọc được
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
1/ Bẫy lỗi quên nhập phiếu tại L2 thì phải bẫy và thoát ngay từ đầu chứ sao lại để đến cuối.
Bẫy còn sót lỗi: có nhập phiếu tại L2 nhưng không tìm thấy số phiếu tại xóm đó.
2/ Dữ liệu ở b.2/ đã có tại bảng tạm rồi (AF đến AO - màu xanh - lấy để điền lên Z3, AA2 hoặc AC2): chừ chỉ cần thêm 2 dòng, sửa 1 dòng là chạy tốt chứ làm gì mà code ghê vậy:
Sửa arr = Sheet4.Range("B9:AM" & endR) thành arr = Sheet4.Range("B9:AO" & endR) để lấy thêm 2 cột nữa mà trước đó không lấy
Thêm
Sheet1.Cells(i, 17) = arr(k, 39)
Sheet1.Cells(i, 50) = arr(k, 40)
trước dòng Next cuối sub
Sau này hãy chép code vào trong thẻ code (công cụ đầu tiên bên trái) cho rõ ràng, chứ nhìn vậy rối, không đọc được
Chào buổi sáng! Cảm ơn bạn đã chỉ dẫn cho mình.
1/ Theo cách b.1/ Cập nhật dữ liệu từ nút lệnh (Cập nhật dữ liệu) vào DATA thông qua bảng tạm thì Ok rồi. ( Code trong file đính kèm (b.1) )
2/ Theo cách b.2/ Cập nhật dữ liệu từ nút lệnh (Cập nhật dữ liệu) vào DATA không thông qua bảng tạm ( Với 3 trường dữ liệu Z3, AA2 hoặc AC2 ).
Có nghĩa là nhập dữ liệu từ trực tiếp từ Ô Z3, AA2 hoặc AC2 (không mượm bảng tạm để nhập) vào DATA. (Code trong file đính kèm (b.2)
Mình nghi vấn tại sao ? Click 2 lần vào nút lệnh (Cập nhập vào data) thì dữ liệu mới cập nhật vào (DATA). Có nghĩa là Click lần 1 vào nút lệnh thì dữ liệu mới cập nhập vào bảng tạm ( DATA chưa cập nhập ), Click lần 2 thì dữ liệu mới cập nhật vào DATA. Mong bạn chỉ dẫn để gỡ rối vấn đề này. Chào bạn, Chúc bạn đầu tuần tốt lành và thành đạt !
Ghi chú: Mọi thông tin dữ liệu khác thì cập nhập bình thường.
 

File đính kèm

Upvote 0
Có 2 vấn đề ở b.2/:
1/ Việc đưa Z3, AA2, AC2 xuống Range("AN" & dCH) hoặc Range("AO" & dCH) chỉ cần 1 lần thì bạn lại cho luôn vào vòng lặp => Chậm thực thi công việc và còn sinh ra vấn đề 2/
2/ Việc phải bấm 2 lần là do: mảng arr đã được lấy trước khi thực hiện vòng lặp, trong khi bạn làm những việc đã nói ở 1/ trong vòng lặp thì làm sao có dữ liệu mới trong arr được. VD 2 câu sau đây:
Sheet4.Range("AO" & dCH) = Sheet4.Range("Z3") 'chừ mới lấy từ Z3 xuống AO13
Sheet1.Cells(i, 50) = arr(k, 40) 'Nhưng arr(k, 40) là số cũ đã lấy từ đầu code rồi

=> Do đó phải làm các việc ở 1/ trước dòng arr = Sheet4.Range("B9:AO" & endR). Tuy nhiên cách giải quyết hay nhất là sửa ngay trên dòng của chủ hộ tại bảng tạm (dòng 13). Các loại khuyết tật mà tôi code cũng phải sửa tại đây và lấy tại đây cấp nhật vào Data chứ tại đâu nữa.

Vấn đề nhỏ là trong code thừa 2 dòng lấy sCH và dCH
' sCH = Mid(Sheet4.Range("J2"), InStr(1, Sheet4.Range("J2"), "ch"), 6) 'THUA DONG
' dCH = Sheet4.Range("D9:D" & UBound(arr, 1) + 8).Find(What:=sCH, LookIn:=xlFormulas, LookAt:=xlWhole).Row 'THUA CODE
 
Upvote 0
Có 2 vấn đề ở b.2/:
1/ Việc đưa Z3, AA2, AC2 xuống Range("AN" & dCH) hoặc Range("AO" & dCH) chỉ cần 1 lần thì bạn lại cho luôn vào vòng lặp => Chậm thực thi công việc và còn sinh ra vấn đề 2/
2/ Việc phải bấm 2 lần là do: mảng arr đã được lấy trước khi thực hiện vòng lặp, trong khi bạn làm những việc đã nói ở 1/ trong vòng lặp thì làm sao có dữ liệu mới trong arr được. VD 2 câu sau đây:
Sheet4.Range("AO" & dCH) = Sheet4.Range("Z3") 'chừ mới lấy từ Z3 xuống AO13
Sheet1.Cells(i, 50) = arr(k, 40) 'Nhưng arr(k, 40) là số cũ đã lấy từ đầu code rồi

=> Do đó phải làm các việc ở 1/ trước dòng arr = Sheet4.Range("B9:AO" & endR). Tuy nhiên cách giải quyết hay nhất là sửa ngay trên dòng của chủ hộ tại bảng tạm (dòng 13). Các loại khuyết tật mà tôi code cũng phải sửa tại đây và lấy tại đây cấp nhật vào Data chứ tại đâu nữa.

Vấn đề nhỏ là trong code thừa 2 dòng lấy sCH và dCH
' sCH = Mid(Sheet4.Range("J2"), InStr(1, Sheet4.Range("J2"), "ch"), 6) 'THUA DONG
' dCH = Sheet4.Range("D9:D" & UBound(arr, 1) + 8).Find(What:=sCH, LookIn:=xlFormulas, LookAt:=xlWhole).Row 'THUA CODE
Chào bạn Maika8008, Chân thành cảm ơn bạn hướng dẫn cách khắc phụ sự cố.
Báo cáo bạn: Theo sự hướng dẫn của bạn mình đã khắc phục xong. Chương trình chạy nhanh, gọn khớp dữ liệu.
Rich (BB code):
Sub SaveInfoToData()
Dim arr, arrCol, arrCol2, arrCol3
Dim i&, j&, k&, endR&, endR1&, rw&
Dim dCH As Long
Dim sCH As String
endR1 = Sheet4.Range("D9").End(xlDown).Row
endR = Sheet4.Range("B7").End(xlDown).Row
If endR < 9 Then Exit Sub
sCH = Mid(Sheet4.Range("J2"), InStr(1, Sheet4.Range("J2"), "ch"), 6)
dCH = Sheet4.Range("D9:D" & endR1).Find(What:=sCH, LookIn:=xlFormulas, LookAt:=xlWhole).Row
Sheet4.Range("AO" & dCH) = Sheet4.Range("Z3")
If Sheet4.Range("AA2") = "" And Sheet4.Range("AC2") = "" Then
Sheet4.Range("AN" & dCH) = Sheet4.Range("AA2")
     ElseIf Sheet4.Range("AA2") <> "" And Sheet4.Range("AC2") = "" Then
     Sheet4.Range("AN" & dCH) = Sheet4.Range("AA2")
     ElseIf Sheet4.Range("AA2") = "" And Sheet4.Range("AC2") <> "" Then
     Sheet4.Range("AN" & dCH) = Sheet4.Range("AC2")
End If
arr = Sheet4.Range("B9:AO" & endR)
rw = Sheet1.Range("O4:O" & Sheet1.Range("O" & Rows.Count).End(xlUp).Row).Find(What:=Sheet4.Range("C1"), LookIn:=xlFormulas, LookAt:=xlWhole).Row
arrCol = Array(3, 4, 48, 5, 6, 7, 8, 9, 10, 49, 19, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35)
arrCol2 = Array(44, 45, 46)
arrCol3 = Array(36, 37, 38, 39, 40, 41, 42, 43)
Application.ScreenUpdating = False
For i = rw To rw + endR - 9
    k = k + 1
    Sheet1.Cells(i, 51) = arr(k, 29)
    Sheet1.Cells(i, 12) = Sheet4.Range("L2")
    Sheet1.Cells(i, 13) = Sheet4.Range("M2")
    Sheet1.Cells(i, 50) = arr(k, 40)
    Sheet1.Cells(i, 17) = arr(k, 39)
    For j = 1 To 24
        Sheet1.Cells(i, arrCol(j)) = arr(k, j)
    Next
    For j = 26 To 28
        Sheet1.Cells(i, arrCol2(j - 25)) = arr(k, j)
    Next
    For j = 31 To 38
        Sheet1.Cells(i, arrCol3(j - 30)) = arr(k, j)
    Next
Next
Application.ScreenUpdating = True
End Sub
Chúc bạn An lành và Hạnh phúc. Chào bạn!
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom