Code lấy dữ liệu từ 3 file con.

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

LuuAnh980

Thành viên tiêu biểu
Tham gia
28/9/22
Bài viết
453
Được thích
104
Giới tính
Nữ
Chào các anh trong GPE!!!!
Em có bắt chước code của anh @Hoàng Tuấn 868 làm cho em để lấy dữ liệu, nhưng không biết sai chổ nào mà báo lỗi ngay dòng này:
Mã:
md(k, 11) = "VTF" & Mid(wn.Name, InStr(wn.Name, "WF") - 1, 1)
lỗi Subscript out of range ạ.
Code đây ạ:
Mã:
Option Explicit

Sub LayDuLieuSheetTonDau_TuCacFile()
Application.ScreenUpdating = False
Dim wd As Workbook, wn As Workbook
Dim sd As Worksheet, sn As Worksheet, sn1 As Worksheet, sn2 As Worksheet
Dim lrd As Long, lrn As Long, lrn1 As Long, lrn2 As Long
Dim i As Long, j As Long, k As Long, p As Long, q As Long
Dim md() As String, md1, md2, mn, mn1, mn2

Set wd = ThisWorkbook
Set sd = wd.Sheets("TonDau")
Set sn1 = wd.Sheets("DanhMuc")

lrn1 = sn1.Cells(Rows.Count, 2).End(xlUp).Row
mn1 = sn1.Range("B6:j" & lrn1)


ReDim md(1 To 2000, 1 To 11)
ReDim md1(1 To 2000, 1 To 6)

With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = True
.Show
If .SelectedItems.Count = 0 Then Exit Sub
    For i = 1 To .SelectedItems.Count
        Set wn = Workbooks.Open(.SelectedItems(i), False)
        Set sn = wn.Sheets("BaoCao")
        
        If sn.AutoFilterMode = True Then sn.AutoFilterMode = False
        lrn = sn.Cells(Rows.Count, 2).End(xlUp).Row
        mn = sn.Range("B8:E" & lrn)
        For j = 1 To UBound(mn, 1)
            If Trim(mn(j, 2)) <> "" And Left(mn(j, 2), 11) <> "Steel Plate" Or Trim(mn(j, 2)) <> "" And Left(mn(j, 2), 11) <> "Chequered" Then

                If InStr(mn(j, 2), "Steel Plate") = 0 Then
                    If InStr(mn(j, 2), "Chequered") = 0 Then
            On Error GoTo thoat
            
                    k = k + 1
                    md(k, 4) = mn(j, 1)
                    md1(k, 1) = mn(j, 3)
                    End If
                End If
md(k, 11) = "VTF" & Mid(wn.Name, InStr(wn.Name, "WF") - 1, 1)
End If
thoat:
        Next j
    k = k + 1
    wn.Close False
    Next i
    
    If k > 0 Then
    
    
        For p = 1 To UBound(mn1, 1)
            For q = 1 To k
                If mn1(p, 2) = md(q, 4) Then
                    md(q, 5) = mn1(p, 8)
                    md1(q, 9) = mn1(p, 7)
                End If
            Next q
        Next p
        
 
        sd.Range("A3:M10000").Clear
        sd.Range("A3").Resize(k, 11) = md
        sd.Range("J3").Resize(k - 1, 1) = md1
        lrd = sd.Cells(Rows.Count, 8).End(xlUp).Row
        sd.Range("A3:M" & lrd).Borders.LineStyle = True
  End If
End With

        For i = 6 To lrd - 1
        If sd.Cells(i, 1) = "" Then
            sd.Range("A" & i).Resize(1, 11) = ""
            sd.Range("A" & i).Resize(1, 11).Interior.ColorIndex = 37
        End If
    Next i
    
Application.ScreenUpdating = True
End Sub
 
Lỗi ở chỗ k = 0 chứ không phải instr = 0

1714275827007.png
 
Upvote 0
Dòng code kia không có gì sai cả. Thuộc tính False là không lưu thôi mà chú
Tôi hiểu là giữa wn.Close False và wn.Close chả có khác gì nhau.

Tôi chỉ nói theo kiểu quăng chài thôi, chứ thực ra trên máy tôi thì bỏ hay không bỏ chạy ok. Còn trên máy bạn ấy thì không biết. Bạn có thể giúp bạn ấy và giúp tôi cho tôi được mở rộng tầm mắt được không?
À mà trên máy tôi, tôi bỏ luôn cả dòng "Goto thoát" và dòng "thoát:". Bạn @LuuAnh980 thử bỏ cả 2 dòng này xem sao.
 
Upvote 0
Tôi hiểu là giữa wn.Close False và wn.Close chả có khác gì nhau.

Tôi chỉ nói theo kiểu quăng chài thôi, chứ thực ra trên máy tôi thì bỏ hay không bỏ chạy ok. Còn trên máy bạn ấy thì không biết. Bạn có thể giúp bạn ấy và giúp tôi cho tôi được mở rộng tầm mắt được không?
À mà trên máy tôi, tôi bỏ luôn cả dòng "Goto thoát" và dòng "thoát:".
Cháu về quê nghỉ lễ mất rồi bài này cho anh tuấn anh ấy không hỗ trợ nốt phần dở dang
 
Upvote 0
Em bỏ False thì hiện vầy anh @HUONGHCKT ơi
AA9.png
đòi lưu hay không lưu anh ơi.
 
Upvote 0
On Error Goto thoat
mà trong thoat có câu lệnh close bà nó file rồi, code vẫn chạy vì chạy trên mảng.
Trong vòng lặp gặp thêm Error thứ 2 lại goto thoat lần 2, có còn file đâu mà close?
 
Upvote 0
Cháu về quê nghỉ lễ mất rồi bài này cho anh tuấn anh ấy không hỗ trợ nốt phần dở dang
Chúc bạn và gia đình có kỳ nghỉ lễ vui vẻ nhé.
Tôi chợt nhận thấy bạn đã tiếp thu được tinh thần của anh Vet rất nhiều rồi đấy.
Tôi nói thế nếu không đúng mong bạn hãy xem như chưa đọc, chưa thấy dòng trên này nhé.
Bài đã được tự động gộp:

Em bỏ False thì hiện vầy anh @HUONGHCKT ơi
View attachment 300538
đòi lưu hay không lưu anh ơi.
Thử bỏ "Goto thoat" và "thoat" xem sao.
Như bài #26 đã nêu ra lý do.
 
Upvote 0
Biết cách test thì chỉ 5 phút ra hàng đống chỗ sai, chứ làm gì mà loay hoay cả tuần lễ rồi đoán chỗ này chỗ kia.
 
Upvote 0
Thử bỏ "Goto thoat" và "thoat" xem sao.
Như bài #26 đã nêu ra lý do.
Goto là 1 kiểu bắt lỗi (lỗi bất kỳ, lỗi gì cũng bắt) và xử lý lỗi. Nếu bỏ thì phải biết lỗi gì và xử lý bằng cách khác, chứ không xử lý lỗi là lại sinh chuyện.
Mong Thầy @ptm0412 giúp đỡ ạ. Code này do em bắt chước code của Anh @Hoàng Tuấn 868 làm cho em ạ.
Tôi chỉ gợi ý đến mức đó thôi.
 
Upvote 0
Thầy @ptm0412 biết trình độ VBA của em mà .
Tôi biết cả cách học như không học của bạn nữa. Và tôi không chiều.
Cách của tôi tìm và sửa như sau: Chẳng hạn tôi nói: "Lỗi ở k = 0 chứ không phải instr = 0"
1. Tìm cách nào:
Khi bi lỗi và tô vàng dòng lệnh, thì trong tình trạng tô vàng tôi kiểm tra giá trị các biến và các giá trị khác có tham gia câu lệnh đó. Nếu các giá trị trong câu lệnh lỗi đều phù hợp thì còn phải tìm thêm các giá trị ở các dòng lệnh bên trên. Thí dụ tên sheet, tên file, kích thước mảng, ...
Cụ thể là k = 0 thì không gán gía trị cho mảng ở vị trí 0 được.
Hoặc file đã đóng thì không đóng nữa được. Cái này ngó xuống task bar là thấy, khỏi đọc code.

2. Sửa làm sao: Phải tự đặt ra câu hỏi.
Lỗi k=0
Tại sao k = 0? tại sao đã gán k = k + 1 rồi mà cứ bằng 0 hoài? Tìm ra là sửa được.
Lỗi đóng file
Tại sao chưa xong đã đóng rồi bây giờ không đóng được? Tại sao lại đóng ngang xương? Tìm ra là sửa được.

Ghi chú:
On Error Goto <label> là 1 cấu trúc khó mà bản thân tôi còn chưa dám xài. Các câu lệnh bên dưới label rất khó kiểm soát, và rất nhiều trường hợp phải thêm câu lệnh Resume để quay về chỗ nào đó chạy tiếp, chứ không phải chạy tuồn tuột đến cuối. (Nếu không resume thì nó chạy xong 1 vài câu lệnh mong muốn để xử lý lỗi, nó chạy tiếp xuống dưới một cách không mong muốn)

Nếu cách học của bạn thay đổi, chịu đọc, chịu tư duy và làm, thì chỉ cần giải thích như trên là tự làm được.
 
Upvote 0
Em đọc lời thầy Mỹ chỉ, mà như "vịt nghe sấm" vậy.
 
Upvote 0
Em đọc lời thầy Mỹ chỉ, mà như "vịt nghe sấm" vậy.
Trả lời nhanh như vậy tức là chỉ đọc lướt qua bài viết mà không đọc lại code đã viết. Nghĩa là cái nết của bạn vẫn vậy, không muốn tư duy mà chỉ muốn ai đó làm sẵn.
Những bài trả lời bên trên không sửa được lỗi chỉ là do không biết cách tìm, chỉ đọc rồi đoán. Instr có thể bằng 0, trừ 1 cũng có thể bằng 0, nhưng trong tình huống tên file có sẵn, tên file có WF rõ ràng, và WF nằm ở vị trí không phải 1, thì không thể bằng 0. Rà chuột vào nó còn hiện ra giá trị 14, 15 gì đó mà lại đoán bằng 0 được!
Thứ 2: Đóng file không được chẳng liên quan gì đến True hay False. True là có lưu trước khi đóng, False là không lưu. Bỏ trống có 2 trường hợp tùy theo file đó có bị đụng chạm gì không:
- không bị đụng chạm gì: mặc định không lưu
- Có chỉnh sửa: Bị hỏi như hình bài 25
Trường hợp không đụng chạm gì nhưng file có dùng hàm volatile, coi như có thay đổi và vẫn hỏi. Đang filter bị bỏ filter ra cũng là 1 thay đổi.
 
Lần chỉnh sửa cuối:
Upvote 0
Căn bản VBA em có biết gì đâu mà em không trả lời nhanh thầy Mỹ, em chỉ biết đổi các tham chiếu trong code thôi, ví dụ md(k, 11) là em biết cộtL vậy thôi, mà cột L em muốn nó là VTF + số cuối của tên file con.
 
Upvote 0
Em đọc những chỉ dạy của Thầy Mỹ mà chả hiểu gì hết các anh ạ.
Mong các anh giúp.
 
Upvote 0
File của bạn có phải làm theo yêu cầu này không, bạn tham khảo thử cách mình làm có đúng không nhé
Do file của bạn có chưa lọc và khoá sheet và có nhiều mục mình không hiểu nên mình tạo file khác giữ dữ liệu cũ.
Trước khi thực hiện bạn cần mở 4 file lên cùng lúc.
Thanks.
 

File đính kèm

Upvote 0
Em đọc những chỉ dạy của Thầy Mỹ mà chả hiểu gì hết các anh ạ.
Mong các anh giúp.
Vấn đề nằm ở việc bạn tiếp nhận góp ý và xử lý vấn đề.
Bạn đưa lên 1 đoạn code và hỏi mọi người vì sao lỗi, mọi người có góp ý tư vấn cho bạn tìm ra một số điểm.
Bạn cũng cần tự xử lý vấn đề của mình nếu muốn tiến bộ thay vì "chả hiểu gì hết" :D
Trong mảng md mà bạn tạo không thể truy vấn về địa chỉ 0 được ? k khởi tạo dĩ nhiên là bằng 0; k = k + 1 nằm trong tận 2 dấu if, khi if không thỏa mãn thì k= 0 thôi.
Tiếp theo ảnh cũng có nói đến là dòng On Error GoTo thoat, và chỉ dẫn rằng nếu không hiểu rõ thì bỏ ra, bạn cũng phải cố gắng thử đã chứ :D
p/s:
1. Trừ khi là bạn code để học hoặc để chơi, còn để áp dụng vào công việc của bạn thì bản phải hiểu rõ, lỡ sai xót thì không thể nói do code "ở trên trển" em lấy về xài.
2. Nếu thực sự "chả hiểu gì hết các anh ạ." thì bạn nên đưa đầu bài, rõ ràng yêu cầu thì diễn đàn sẽ có người giúp đỡ thôi;
 
Lần chỉnh sửa cuối:
Upvote 0
2. Nếu thực sự "chả hiểu gì hết các anh ạ." thì bạn nên đưa đầu bài, rõ ràng yêu cầu thì diễn đàn sẽ có người giúp đỡ thôi;
Đầu bài của em ạ:
Lấy dữ liệu từ sheet!BaoCao của 3 file con: 04-2024 HoiGPE-WF1, 04-2024 HoiGPE-WF3, 04-2024 HoiGPE-WF6. gán vào sheet!TonDau file ThepHinh, theo nguyên tắc sau:
1/ chỉ lấy những tên vật tư khác tên "Steel Plate" và "Chequered" như code hiện tại:
Mã:
If InStr(Arr(i, 3), "Steel Plate") = 0 Or InStr(Arr(i, 3), "Steel Plate") = 0 Then
                        If InStr(Arr(i, 3), "Chequered") = 0 Or InStr(Arr(i, 3), "Chequered") = 0 Then
2/Lấy dữ liệu cột B sheet!BaoCao của 3 file con gán vào cột D sheet!TonDau file ThepHinh.
3/Lấy dữ liệu cột E sheet!BaoCao của 3 file con gán vào cột J sheet!TonDau file ThepHinh.
4/Giá trị cột L sheet!TonDau bằng "VTF" cộng số cuối cùng của tên 3 file con (1,3,6), theo dữ liệu của file con, ví dụ dữ liệu của file con tên 04-2024-HoiGPE-WF1 thì cột L là VTF1.v..vv., code trong file đang là
Mã:
md(k, 11) = "VTF" & Mid(wn.Name, InStr(wn.Name, "WF") - 1, 1)
5/ sau dữ liệu của mỗi xưởng thì có dòng trống phân cách với xưởng khác, và bôi màu từ cột A-> cột M, code trong file:
Mã:
sd.Range("A" & i).Resize(1, 11).Interior.ColorIndex = 37
Mong các anh xem giúp.
Nhưng các anh ơi, đã có Thầy Mỹ chỉ cách sai của code, mà sao các anh, hoặc Thầy Mỹ chỉnh dùm code trên luôn dùm em vậy.???
 
Upvote 0
Web KT

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

Back
Top Bottom