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 thường trực
Tham gia
28/9/22
Bài viết
389
Được thích
67
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 Subscript out of range ạ.
Bạn từng đăng bài rất nhiều. Cái tối thiểu là đính kèm file để có thể test giúp bạn xem nó như nào thì lại không làm. Việc trên nó như kiểu đem ảnh đi khám bệnh ấy. Xin lỗi vì nếu nói làm bạn thấy tự ái.
 
  • Thích
Reactions: th7
Upvote 0
Xin lỗi em quên ạ. File đây ạ.
 

File đính kèm

  • HoiGPE_0001.xlsb
    462.7 KB · Đọc: 21
  • 04-2024 HoiGPE-WF1.xlsb
    411.2 KB · Đọc: 20
  • 04-2024 HoiGPE-WF3.xlsb
    146.4 KB · Đọc: 18
  • 04-2024 HoiGPE-WF6.xlsb
    412.7 KB · Đọc: 16
Upvote 0
Sao câu hỏi của bạn với bạn này giống nhau không?
 
Upvote 0
Đúng ạ, code này là em chế lại của anh @Hoàng Tuấn 868 làm cho em, em có nhờ ảnh giúp, nhưng ảnh nói ảnh bận công tác chưa giúp được, hôm nay em nôn quá đưa lên đây nhờ anh nào coi thử giúp em ạ.
 
Upvote 0
Bạn không bẫy lỗi thì chỗ này sẽ trả về 0 khi WF nằm ở ngay vị trí đầu tiên hoặc -1 nếu kg tìm thấy, thì hàm MID báo sai thôi.
Mã:
InStr(wn.Name, "WF") - 1
 
Upvote 0
Tôi thấy chỗ sai nhưng không hiểu bài nên không biết sửa. Chỗ này ReDim md(1 To 2000, 1 To 11) nhưng biến k chỗ này md(k, 11) = "VTF" & Mid(wn.Name, InStr(wn.Name, "WF") - 1, 1) nó bằng 0 nên lỗi.
 
Upvote 0
Đúng ạ, code này là em chế lại của anh @Hoàng Tuấn 868 làm cho em, em có nhờ ảnh giúp, nhưng ảnh nói ảnh bận công tác chưa giúp được, hôm nay em nôn quá đưa lên đây nhờ anh nào coi thử giúp em ạ.
Tôi nhớ không lầm thì bài này có điều kiện là dòng nào của cột Item của các sh BaoCao/ file nguồn không có "Steel Plate" hoặc "Chequered" thì mới lấy. do vậy 1 dòng không đồng thời có cả Steel plate và Chequered được. Vậy nên
Thử thay chỗ này
Mã:
            If InStr(mn(j, 2), "Steel Plate") = 0  Then
                     If InStr(mn(j, 2), "Chequered") = 0 Then
thành
Mã:
 If InStr(mn(j, 2), "Steel Plate") = 0 Or InStr(mn(j, 2), "Chequered") = 0 Then
và xóa đi 1 end if xem sao.
Chỗ này
Mã:
ReDim md(1 To 2000, 1 To 11)
ReDim md1(1 To 2000, 1 To 6)
và chỗ này
Mã:
       md(q, 5) = mn1(p, 8)
       md1(q, 9) = mn1(p, 7)
nó có phù hợp với nhau không?
 
Upvote 0
Cám ơn các anh đã quan tâm, mong các anh giúp đỡ.
 
Upvote 0
Định thử nhưng thấy UnProtect sheet, thôi bỏ cuộc...
vgf là gì vậy bạn?
 
Upvote 0
À, bây giờ lại lỗi ngay dòng này ạ :
Mã:
    wn.Close False
 
Upvote 0
Web KT
Back
Top Bottom