Xin trợ giúp về lỗi VBA khi dùng Mảng

Liên hệ QC

alexgressley

Thành viên mới
Tham gia
11/1/10
Bài viết
20
Được thích
0
Các bạn xem giúp mình code trong file với, mình chạy đến dòng bên dưới thì toàn báo lỗi Application-defined or object-defined error.
Sheets("KETQUA").Range(Cells(lr + 1, 1), Cells(lr + 1, 9)).Value = arr

Nếu mình thay bằng địa chỉ cố định thì chạy được, nhưng không đúng với trình tự mình định làm:
Sheets("KETQUA").Range("A2:I2").Value = arr

Lỗi này giải quyết làm sao hả các bạn?

Đây là trình tự công việc mình định làm:
1. Lấy mã model code ở dòng 4, cột từ O trở đi
2. Với mỗi mã model code, kiểm tra giá trị từ dòng 14 cột tương ứng với mã đó, nếu > 0 thì lấy giá trị các ô từ B đến G của dòng đó
3. Chuyển dữ liệu lấy được sang sheet "KETQUA", vào các cột trùng tên

Mình muốn dùng Mảng để tăng tốc độ xử lý, thay vì gán từng giá trị từ bảng này sang bảng kia.

Cảm ơn các bạn nhiều.
 

File đính kèm

  • Học mảng.xlsm
    29.5 KB · Đọc: 6
Sheets("KETQUA").Range(Cells(lr + 1, 1), Cells(lr + 1, 9)).Value = arr
Nếu chỉ ghi cells(a,b) thì nó hiểu là cells của active sheet. bạn thêm Sheets("KETQUA").cells(a,b) vào sẽ chạy được nhé
Đó là vấn đề chạy được, còn code bạn gán mảng một chiều là chưa hợp lý, và dùng mảng thì thường là gán xuống sheet duy nhất một lần cuối code chứ không ai gán theo từng vòng for như vậy
 
Upvote 0
Bạn thử dùng code này xem sao (Sheet KETQUA cứ giữ vậy, không cần phải xóa rồi add làm chi cho mệt):
Mã:
Sub NT()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, U1 As Long, U2 As Long
Dim Bom As Double, MoCode As String, lCol As Long, lRow As Long, N As Long
With Sheets("BOM")
    lCol = .Cells(4, .Columns.Count).End(xlToLeft).Column
    lRow = .Cells(.Rows.Count, "B").End(xlUp).Row
    If lRow < 14 Or lCol < 15 Then Exit Sub
    sArr = .Range(.Cells(4, "B"), .Cells(lRow, lCol)).Value
    U1 = UBound(sArr, 1): U2 = UBound(sArr, 2)
    ReDim dArr(1 To (lCol - 14) * (lRow - 13), 1 To 9)
    For I = 14 To U2 'cot
        MoCode = sArr(1, I)
        For J = 11 To U1 'dong
            Bom = sArr(J, I)
            If Bom > 0 Then
                N = N + 1
                dArr(N, 1) = MoCode
                dArr(N, 9) = Bom
                For K = 1 To 6
                    dArr(N, K + 1) = sArr(J, K)
                Next
            End If
        Next
    Next
End With
With Sheets("KETQUA")
    .Range("A2").Resize(.Rows.Count - 1, 9).ClearContents
    .Range("A2").Resize(N, 9) = dArr
End With
End Sub
 

File đính kèm

  • Học mảng.xlsm
    33 KB · Đọc: 4
Upvote 0
Bạn thử dùng code này xem sao (Sheet KETQUA cứ giữ vậy, không cần phải xóa rồi add làm chi cho mệt):
Cảm ơn bạn nhiều. Code chạy cực nhanh luôn :)
Vấn đề là mình chưa hiểu hết được code này.
Bên dưới là cách hiểu của mình về các dòng lệnh, bạn có thể giải thích chi tiết những chỗ mình chưa hiểu được không:

Sub NT()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, U1 As Long, U2 As Long
Dim Bom As Double, MoCode As String, lCol As Long, lRow As Long, N As Long
With Sheets("BOM")

'Lấy số lượng cột có dữ liệu của dòng 4
lCol = .Cells(4, .Columns.Count).End(xlToLeft).Column
'Lấy số lượng dòng có dữ liệu của cột B
lRow = .Cells(.Rows.Count, "B").End(xlUp).Row
If lRow < 14 Or lCol < 15 Then Exit Sub
'Tạo mảng dữ liệu nguồn, bao gồm toàn bộ dữ liệu trong vùng B4 đến ô cuối cùng có dữ liệu
sArr = .Range(.Cells(4, "B"), .Cells(lRow, lCol)).Value
'Lấy giá trị kích thước mảnh sArr: U1 là theo chiều dòng, U2 là theo chiều cột
U1 = UBound(sArr, 1): U2 = UBound(sArr, 2)
'Định nghĩa mảng dữ liệu đích, nhưng chưa hiểu (1 To (lCol - 14) * (lRow - 13), 1 To 9) là ý nghĩa gì:
ReDim dArr(1 To (lCol - 14) * (lRow - 13), 1 To 9)

'Vòng lặp lấy giá trị từ sArr chuyển sang dArr
For I = 14 To U2 'cot
MoCode = sArr(1, I)
For J = 11 To U1 'dong
Bom = sArr(J, I)
If Bom > 0 Then
N = N + 1
dArr(N, 1) = MoCode
dArr(N, 9) = Bom
For K = 1 To 6
dArr(N, K + 1) = sArr(J, K)
Next
End If
Next
Next
End With

With Sheets("KETQUA")
'Xóa kết quả trong sheet "KETQUA" từ ô A2 đến ô "số dòng-1 & cột 9"
.Range("A2").Resize(.Rows.Count - 1, 9).ClearContents
'Gán kết quả từ dArr vào ô từ A2
.Range("A2").Resize(N, 9) = dArr
End With
End Sub
 
Upvote 0
Cảm ơn bạn nhiều. Code chạy cực nhanh luôn :)
Vấn đề là mình chưa hiểu hết được code này.
Bên dưới là cách hiểu của mình về các dòng lệnh, bạn có thể giải thích chi tiết những chỗ mình chưa hiểu được không:

Sub NT()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, U1 As Long, U2 As Long
Dim Bom As Double, MoCode As String, lCol As Long, lRow As Long, N As Long
With Sheets("BOM")

'Lấy số lượng cột có dữ liệu của dòng 4
lCol = .Cells(4, .Columns.Count).End(xlToLeft).Column
'Lấy số lượng dòng có dữ liệu của cột B
lRow = .Cells(.Rows.Count, "B").End(xlUp).Row
If lRow < 14 Or lCol < 15 Then Exit Sub
'Tạo mảng dữ liệu nguồn, bao gồm toàn bộ dữ liệu trong vùng B4 đến ô cuối cùng có dữ liệu
sArr = .Range(.Cells(4, "B"), .Cells(lRow, lCol)).Value
'Lấy giá trị kích thước mảnh sArr: U1 là theo chiều dòng, U2 là theo chiều cột
U1 = UBound(sArr, 1): U2 = UBound(sArr, 2)
'Định nghĩa mảng dữ liệu đích, nhưng chưa hiểu (1 To (lCol - 14) * (lRow - 13), 1 To 9) là ý nghĩa gì:
ReDim dArr(1 To (lCol - 14) * (lRow - 13), 1 To 9)

'Vòng lặp lấy giá trị từ sArr chuyển sang dArr
For I = 14 To U2 'cot
MoCode = sArr(1, I)
For J = 11 To U1 'dong
Bom = sArr(J, I)
If Bom > 0 Then
N = N + 1
dArr(N, 1) = MoCode
dArr(N, 9) = Bom
For K = 1 To 6
dArr(N, K + 1) = sArr(J, K)
Next
End If
Next
Next
End With

With Sheets("KETQUA")
'Xóa kết quả trong sheet "KETQUA" từ ô A2 đến ô "số dòng-1 & cột 9"
.Range("A2").Resize(.Rows.Count - 1, 9).ClearContents
'Gán kết quả từ dArr vào ô từ A2
.Range("A2").Resize(N, 9) = dArr
End With
End Sub
Chỗ đó chỉ đơn thuần là khai báo mảng darr với số dòng và số cột thôi. Cột biết trước là 9 cột còn dòng thì chưa biết trước. Tùy vào độ rộng của modelcode và vào độ dài của dòng. Do đó phải lấy số modelcode nhân với số dòng để ra tổng dòng. Chính là (lCol - 14) * (lRow - 13)
 
Upvote 0
Chỗ đó chỉ đơn thuần là khai báo mảng darr với số dòng và số cột thôi. Cột biết trước là 9 cột còn dòng thì chưa biết trước. Tùy vào độ rộng của modelcode và vào độ dài của dòng. Do đó phải lấy số modelcode nhân với số dòng để ra tổng dòng. Chính là (lCol - 14) * (lRow - 13)
Cảm ơn bạn đã giải thích, mình hiểu hơn rồi :)
 
Upvote 0
Web KT

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

Back
Top Bottom