Mảng 1 chiều khi gán xuống sheet lại không đúng (1 người xem)

Liên hệ QC

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

diemhuyenanh

Thành viên hoạt động
Tham gia
6/9/09
Bài viết
167
Được thích
58
chào các anh chị trên GPE. em đang tập viết code với mảng nhưng em gặp trường hợp với mảng 1 chiều khi gán xuống sheet thì không đúng. nhờ anh chị chỉ giáo giúp em xem code sai ở chỗ nào với ạ

Option Base 1
Sub thuthekho()
Dim Arr(), Darr(), tArr(), i, k As Long, Dkdau, Dkcuoi As Date, Dkma As Variant
With Sheets("sheet1")
Dkdau = .Range("H1")
dkcuoi = .Range("H2")
Dkma = .Range("I1")
Arr = .Range("A1:C" & .Range("B56636").End(xlUp).Row).Value
End With
ReDim tArr(1 To UBound(Arr, 1))
ReDim Darr(1 To UBound(Arr, 1), 1 To 2)
For i = 1 To UBound(Arr, 1)
If Arr(i, 1) >= Dkdau And Arr(i, 1) < dkcuoi And Arr(i, 2) = Dkma Then
k = k + 1
tArr(k) = Arr(i, 3)
Darr(k, 1) = Arr(i, 2)
Darr(k, 2) = Arr(i, 1)
End If
Next
Sheets("sheet1").Range("K1").Resize(UBound(Darr, 1), 2) = Darr
Sheets("sheet1").Range("M1").Resize(UBound(tArr, 1), 1) = tArr
End Sub
em gởi cả sheet đính kèm mong nhận được sự trợ giúp của các anh chị
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn thử với cái ni & nghiền ngẫm đi nha:

PHP:
Option Base 1
Sub ThuTheKho()
 Dim Arr(), Darr(), tArr(), I As Long, K As Long
 Dim DkDau As Date, DkCuoi As Date, DkMa As String
 
 With Sheets("sheet1")
    DkDau = .Range("H1"):                   DkCuoi = .Range("H2")
    DkMa = .Range("I1")
    Arr = .Range("A1:C" & .Range("B56636").End(xlUp).Row).Value
 End With
 ReDim tArr(1 To UBound(Arr, 1))
 ReDim Darr(1 To UBound(Arr, 1), 1 To 3)
 For I = 1 To UBound(Arr, 1)
    If Arr(I, 1) >= DkDau And Arr(I, 1) < DkCuoi And Arr(I, 2) = DkMa Then
        K = K + 1
        tArr(K) = UCase$(Arr(I, 3))
        Darr(K, 1) = Arr(I, 1)  '2'
        Darr(K, 2) = Arr(I, 2)  '1'
        Darr(K, 3) = Arr(I, 3)
    End If
 Next
 Sheets("sheet1").Range("k3").Resize(K, 3) = Darr
 Sheets("sheet1").Range("K1").Resize(, K) = tArr
End Sub
 
Upvote 0
Nói ngắn gọn thì thế này: mảng 1 chiều gán xuống sheet nó bị ngang. Nếu gán dọc chỉ được 1 phần tử đầu tiên, nghĩa là gán dọc sẽ được vô khối mảng nhưng mỗi mảng đều thiếu chỗ chứa nên chỉ thể hiện 1 phần tử.
 
Upvote 0
Nói ngắn gọn thì thế này: mảng 1 chiều gán xuống sheet nó bị ngang. Nếu gán dọc chỉ được 1 phần tử đầu tiên, nghĩa là gán dọc sẽ được vô khối mảng nhưng mỗi mảng đều thiếu chỗ chứa nên chỉ thể hiện 1 phần tử.
đúng là như vậy; nhưng ở đây em muốn gán mảng một chiều tArr(K) xuống sheet theo chiều dọc thì phải làm sao
nếu dùng thêm vòng lặp for
for j = 1 to ubound(tArr,1)
.cells(j,9)=tArr(j)
thì sẽ lấy được hết các phần tử trong mảng 1 chiều nhưng như vậy code duyệt qua các ô và các phần tử sẽ lâu hơn. có cách nào đập một phát mảng tArr xuống sheet theo chiều dọc thì sẽ nhanh hơn
 
Lần chỉnh sửa cuối:
Upvote 0
đúng là như vậy; nhưng ở đây em muốn gán mảng một chiều tArr(K) xuống sheet theo chiều dọc thì phải làm sao
nếu dùng thêm vòng lặp for
for j = 1 to ubound(tArr,1)
.cells(j,9)=tArr(j)
thì sẽ lấy được hết các phần tử trong mảng 1 chiều nhưng như vậy code duyệt qua các ô và các phần tử sẽ lâu hơn. có cách nào đập một phát mảng tArr xuống sheet theo chiều dọc thì sẽ nhanh hơn

Bạn thử đập cho nó 1 nhát thế này xem có chết không (Cái hàm Transpose có dùng vòng lặp không thì bó tay):

.Cells(1,9).Resize(Ubound(tArr))=WorksheetFunction.Transpose(tArr)


 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử đập cho nó 1 nhát thế này xem có chết không (Cái hàm Transpose có dùng vòng lặp không thì bó tay):

.Cells(1,9).Resize(Ubound(tArr))=WorksheetFunction.Transpose(tArr)
đúng rồi phải dùng worksheetfunction.transpose, em chưa học cáy ni bác giải thích giúp cho em nhớ lấu với nhé
 
Upvote 0
Cái này là hàm bình thường của Excell dùng để đảo chiều mảng thôi mà, vì là hàm của Excell nên VBA muốn dùng phải dẫn chiếu tới WorksheetFunction đó.
 
Upvote 0
Có thể đơn giản hơn, đó là khai báo tArr là mảng 2 chiều 1 cột nhiều dòng.
 
Upvote 0
Có thể đơn giản hơn, đó là khai báo tArr là mảng 2 chiều 1 cột nhiều dòng.
Đúng vậy, nhưng cái này lại vướng 1 hạn chế là với mảng động (với kích thước chưa xác định) thì nó lại dính đúng vào cái chiều không thể thay đổi kích thước mảng. Em nhiều lúc cũng bực mình cái vụ này nhưng phải chịu vì nó thế mà.
 
Upvote 0
Đúng vậy, nhưng cái này lại vướng 1 hạn chế là với mảng động (với kích thước chưa xác định) thì nó lại dính đúng vào cái chiều không thể thay đổi kích thước mảng. Em nhiều lúc cũng bực mình cái vụ này nhưng phải chịu vì nó thế mà.
Đúng vậy. Nhưng trong bài 1, tác giả đã xác định số phần tử bằng câu:

ReDim tArr(1 To UBound(Arr, 1))

Sau đó không có xài redim preserve
 
Upvote 0
em khai báo theo kiểu này thì khi gán xuống sheet lại báo lỗi thế chư nị
redim tArr(1 to ubound(Arr,1),1 to 1) bác viết code cho em học với

Làm đúng thì làm sao lỗi được. Sau khi redim như thế, vào vòng lặp viết:

Mã:
If ...
k = k + 1
    tArr(k, [COLOR=#ff0000]1[/COLOR]) = Arr(i, 3)
 
Upvote 0
Làm đúng thì làm sao lỗi được. Sau khi redim như thế, vào vòng lặp viết:

Mã:
If ...
k = k + 1
    tArr(k, [COLOR=#ff0000]1[/COLOR]) = Arr(i, 3)
hôm nay em kiểm tra theo cách này thì được mà hôm trước em làm lại không được cũng tại vì em khai báo range để gán không đúng lên có thông báo vượt quá kích thước cua range.
hôm nay em có câu hỏi như sau:
gia sử em có mảng dữ liệu là Darr như bài trên mà em muốn cho nó gán vào listbox thì phải làm như thế nào. vì em đang muốn tìm hiểu về listbox có nhiều dòng và cột. cái này thì em không rành cho nắm
 
Upvote 0
hôm nay em kiểm tra theo cách này thì được mà hôm trước em làm lại không được cũng tại vì em khai báo range để gán không đúng lên có thông báo vượt quá kích thước cua range.
hôm nay em có câu hỏi như sau:
gia sử em có mảng dữ liệu là Darr như bài trên mà em muốn cho nó gán vào listbox thì phải làm như thế nào. vì em đang muốn tìm hiểu về listbox có nhiều dòng và cột. cái này thì em không rành cho nắm

Hôm qua là hôm qua mà hôm nay là hôm nay... cũng như hỏi cái gì thì phải hỏi đúng nơi, đúng chỗ
Chuyện gán mảng vào Listbox hoàn toàn không liên quan đến chủ đề topic này ---> Mời sang chỗ khác hỏi tiếp nhé
 
Upvote 0

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

Back
Top Bottom