Các câu hỏi về mảng trong VBA (Array)

Liên hệ QC

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,599
Được thích
2,906
Xin các anh chị giúp đỡ Code Gán các giá trị của một Range là các phần tử của Mãng
Ví dụ: Tôi có các giá trị của Range("A1:A10"). Tôi muốn viết code để gán giá trị của các cells từ A1:A10 là các phần tử của Mãng Arr chẳn hạn.
Xin cảm ơn các anh chị
 
Với bài #874 thì code sau cho kết quả vẫn chưa như mong muốn. Tự làm từ A đến Z oải thật.
PHP:
With Sheets("Check")
mangDL = .Range("A1").Resize(22, 31).Value
Có một lần dùng tới thì viết luôn mangDL = Sheets("Check").Range("A1").Resize(22, 31).Value (bỏ with/ end with)

PHP:
Sheets("19").Range("A9").Resize(k, j)
Khi thoát khỏi vòng lặp thì j=j+1, trường hợp này thì j=maxCol+1
 
Upvote 0
PHP:
Sub hochoi2()
Dim mangDL(), i As Integer, j As Integer, k As Integer, l As Long
Dim maxRow As Long, maxCol As Long

mangDL = Sheets("Check").Range("A1").Resize(22, 31).Value
maxRow = UBound(mangDL, 1): maxCol = UBound(mangDL, 2)
k = 0

ReDim KQ(1 To maxRow, 1 To maxCol)
    For i = 2 To maxRow
        For j = 2 To maxCol
            If mangDL(i, j) > 400 Then
                k = k + 1
                j = maxCol + 1
                KQ(k, 1) = mangDL(i, 1)
                KQ(k, j) = mangDL(i, j)
            End If
        Next j
        Exit For
    Next i
MsgBox k

If k Then
Sheets("19").Range("A9").Resize(k, j) = KQ
End If

End Sub

Không biết mình làm sai ở bước nào mà kết quả báo k = 0 befaint ạ. Và cái Exit For tác dụng để nếu không tìm thấy giá trị thỏa mãn thì thoát vòng lặp để tránh lỗi đúng không nhỉ?
 
Upvote 0
Không biết mình làm sai ở bước nào mà kết quả báo k = 0 befaint ạ. Và cái Exit For tác dụng để nếu không tìm thấy giá trị thỏa mãn thì thoát vòng lặp để tránh lỗi đúng không nhỉ?
Bài trên chỉ 2 chỗ cần sửa và có trích dẫn rõ/ cụ thể chỗ nào cần sửa.

Sao lại cho j = maxCol + 1 vào vòng lặp làm gì vậy? :(
 
Upvote 0
Bài trên chỉ 2 chỗ cần sửa và có trích dẫn rõ/ cụ thể chỗ nào cần sửa.

Sao lại cho j = maxCol + 1 vào vòng lặp làm gì vậy? :(
Chỗ 1 mình sửa chắc không có vấn đề gì rồi. Nhưng còn chỗ 2 thật sự là chưa hiểu j=j+1. Xét lần lượt cột nếu cột nào thỏa mãn thì lấy số thứ tự cột đó chứ nhỉ.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình chịu rồi befaint ơi, sửa các kiểu không được. Bấm F8 chạy thử thì thấy đã duyệt hết các vòng lặp i và j báo lỗi gán mảng:
KQ(k, 1) = mangDL(i, 1)
KQ(k, j) = mangDL(i, j)
PHP:
Sub hochoi2()
Dim mangDL()
Dim maxRow As Integer, maxCol As Integer, i As Integer, j As Integer, k As Integer, l As Integer

mangDL = Sheets("Check").Range("A1").Resize(22, 31).Value
maxRow = UBound(mangDL, 1): maxCol = UBound(mangDL, 2)
k = 0
ReDim KQ(1 To maxRow, 1 To maxCol)
    For i = 2 To maxRow
        For j = 2 To maxCol
            If mangDL(i, j) > 400 Then
                k = k + 1
                KQ(k, 1) = mangDL(i, 1)
                KQ(k, j) = mangDL(i, j)
            End If
        Next j
    Next i
MsgBox k
If k Then
Sheets("19").Range("A9").Resize(k, j) = KQ
End If

End Sub
 
Upvote 0
Học bài thì cố nhớ 2 điểm này:
1. Báo lỗi gì? chép lai (hoặc snipping tool lại)
2. Tránh viết tiết kiệm dòng như thế này
maxRow = UBound(mangDL, 1): maxCol = UBound(mangDL, 2)
nó làm cho đọc code lại cực bỏ bố. Lúc debug, muón biết một biến được khởi ở chỗ nào, ngừoi ta lướt ngược từ dưới (chỗ được sử dụng) lên cho đến chỗ thấy được gán. Lướt lẹ thì chỉ đọc bên trái. Tìm maxCol đỏ con mắt.
(sau khi code chạy êm rồi người ta mới dồn dòng để tiết kiệm.

Tho code trên, chiều thứ nhất của mảng KQ chỉ đến maxRow trong khi khả năng của k lên đến maxRow*maxCol
 
Upvote 0
Học bài thì cố nhớ 2 điểm này:
1. Báo lỗi gì? chép lai (hoặc snipping tool lại)
2. Tránh viết tiết kiệm dòng như thế này
maxRow = UBound(mangDL, 1): maxCol = UBound(mangDL, 2)
nó làm cho đọc code lại cực bỏ bố. Lúc debug, muón biết một biến được khởi ở chỗ nào, ngừoi ta lướt ngược từ dưới (chỗ được sử dụng) lên cho đến chỗ thấy được gán. Lướt lẹ thì chỉ đọc bên trái. Tìm maxCol đỏ con mắt.
(sau khi code chạy êm rồi người ta mới dồn dòng để tiết kiệm.

Tho code trên, chiều thứ nhất của mảng KQ chỉ đến maxRow trong khi khả năng của k lên đến maxRow*maxCol

Đúng thật là mảng khai báo thiếu phần tử, code đã ra kết quả tuy nhiên phần dồn dòng mình vẫn chưa nghĩ ra cách, bạn chỉ giúp mình nhé.
 

File đính kèm

  • Mang nhap mon 2 .xlsb
    21.9 KB · Đọc: 8
Upvote 0
Code của bạn không có chú thích giải thuật. Tôi có biết bạn muốn làm cái gì đâu mà hỏi cách "dồn dòng".
 
Upvote 0
Code của bạn không có chú thích giải thuật. Tôi có biết bạn muốn làm cái gì đâu mà hỏi cách "dồn dòng".

Bạn ơi trong file mình có ghi mà.

Tại sheets 19 Từ A8 đến AE8 mình muốn điền giá trị tương ứng của sheet Check nếu các giá trị trong vùng A2:AF22 > 400 thì sẽ lấy và gán STT của sheet Check vào STT của sheet 19. Giá trị của cột thỏa mãn gán vào cột tương ứng của sheet 19.

Hiện tại của mình ra kết quả nhưng nó trải dài mà không thành một dòng. Mình muốn kết quả của trường hợp B như sau. Các trường hợp khác tương tự.

Trình độ sư phạm của mình kém nên giải thích có phần dài dòng mà không chắc dễ hiểu không, có gì bạn góp ý nhé!

upload_2017-7-24_13-15-45.png
 
Upvote 0
Có ai hiểu vấn đề giúp mình với, loay hoay mấy hôm mà không nghĩ ra cách nào. Như ảnh đính kèm ở #899 ví dụ B trong cột STT có các giá trị thỏa mãn >400 cho nên sẽ liệt kê ra các giá trị đó thẳng cùng một hàng. Code của mình mới chỉ làm được việc là nếu giá trị B có bao nhiêu cột thỏa mãn thì sẽ có bấy nhiêu dòng thể hiện B có giá trị thỏa mãn đó. Mình muốn nó thể hiện trên cùng 1 dòng thôi.
 
Upvote 0
Có ai hiểu vấn đề giúp mình với, loay hoay mấy hôm mà không nghĩ ra cách nào. Như ảnh đính kèm ở #899 ví dụ B trong cột STT có các giá trị thỏa mãn >400 cho nên sẽ liệt kê ra các giá trị đó thẳng cùng một hàng. Code của mình mới chỉ làm được việc là nếu giá trị B có bao nhiêu cột thỏa mãn thì sẽ có bấy nhiêu dòng thể hiện B có giá trị thỏa mãn đó. Mình muốn nó thể hiện trên cùng 1 dòng thôi.
 

File đính kèm

  • vidu_.xlsb
    19.8 KB · Đọc: 28
Upvote 0
Cảm ơn Befaint, code vượt sự mong đợi của mình. Cảm ơn rất nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Em có một thắc mắc
PHP:
For H = 3 To 128 Step 4
    If sArr(1, H) = "Sunday" Then
        sArr(1, H).Offset(-2, H - 1).Resize(, 4).ThemeColor = xlThemeColorAccent6
    End If
Next H

Offeset hình như không dùng được cho mảng phải không ạ. Em muốn code duyệt theo cột H, nếu phát hiện có giá trị Sunday thì từ vị trí đó di dời lên trên hai dòng và lùi xuống 1 cột sau đó Resize sang 4 cột và đổ màu cho nó.
 
Upvote 0
Em có một thắc mắc
PHP:
For H = 3 To 128 Step 4
    If sArr(1, H) = "Sunday" Then
        sArr(1, H).Offset(-2, H - 1).Resize(, 4).ThemeColor = xlThemeColorAccent6
    End If
Next H

Offeset hình như không dùng được cho mảng phải không ạ. Em muốn code duyệt theo cột H, nếu phát hiện có giá trị Sunday thì từ vị trí đó di dời lên trên hai dòng và lùi xuống 1 cột sau đó Resize sang 4 cột và đổ màu cho nó.
Offset là thuộc tính của range/cells
So sánh chuỗi trong VBA dùng Like (đã nói từ mấy bài trước).
 
Upvote 0
Offset là thuộc tính của range/cells
So sánh chuỗi trong VBA dùng Like (đã nói từ mấy bài trước).

Ừm, đã sửa rồi mà vẫn quen tay dùng toán tử "=" :). Vậy mảng thì có thuộc tính nào tương tự như vậy không befaint?

Mình thử Cell thì báo lỗi mà cái cell này mình chưa tìm hiểu được nhiều
PHP:
For H = 3 To 128 Step 4
    If .Cells(6, H).Value Like "Sunday" Then
        .Cells(4, H - 1).Resize(, 4).ThemeColor = xlThemeColorAccent6
    End If
Next H

Mình nhầm H, không phải "H"
 
Lần chỉnh sửa cuối:
Upvote 0
Ừm, đã sửa rồi mà vẫn quen tay dùng toán tử "=" :). Vậy mảng thì có thuộc tính nào tương tự như vậy không befaint?

Mình thử Cell thì báo lỗi mà cái cell này mình chưa tìm hiểu được nhiều
PHP:
For H = 3 To 128 Step 4
    If .Cells(6, "H").Value Like "Sunday" Then
        .Cells(4, "H" - 1).Resize(, 4).ThemeColor = xlThemeColorAccent6
    End If
Next H
Bạn sử dụng gì thì nên đọc tài liệu trước...
"H" là chuỗi, không đúng với cú pháp của .Cells(), không tính toán được "H"-1
01.jpg
02.jpg

------------
Chắc phải học khóa nào đó cho nhanh thôi!!!
 
Lần chỉnh sửa cuối:
Upvote 0
Mình nhầm Befaint ơi, nhưng sửa thành vậy vẫn không được. Code không báo lỗi nữa nhưng chẳng thấy có tác dụng gì cả.

PHP:
For H = 3 To 128 Step 4
    If Sheets("BCC").Cells(6, H).Value Like "Sunday" Then
        Sheets("BCC").Cells(4, H - 1).Resize(, 4).ThemeColor = xlThemeColorAccent6
    End If
Next H
 
Lần chỉnh sửa cuối:
Upvote 0
Mình nhầm Befaint ơi, nhưng sửa thành vậy vẫn không được

PHP:
For H = 3 To 128 Step 4
    If Sheets("BCC").Cells(6, H).Value Like "Sunday" Then
        Sheets("BCC").Cells(4, H - 1).Resize(, 4).ThemeColor = xlThemeColorAccent6
    End If
Next H

Được rồi Befaint nhé :). Cảm ơn bạn!
Không được chỗ nào? :(
.Resize(, 4) viết chính tắc để rõ ràng, dễ hiểu. Chứ có biết trước cái dấu phẩy đó là gì đâu.

"từ vị trí đó di dời lên trên hai dòng và lùi xuống 1 cột sau đó Resize sang 4 cột"
=cell đó.offset(0,-1).resize(1,4)
Hay?
=cell đó.offset(-2,-1).resize(1,4)
 
Upvote 0
Không được chỗ nào? :(
.Resize(, 4) viết chính tắc để rõ ràng, dễ hiểu. Chứ có biết trước cái dấu phẩy đó là gì đâu.

"từ vị trí đó di dời lên trên hai dòng và lùi xuống 1 cột sau đó Resize sang 4 cột"
=cell đó.offset(0,-1).resize(1,4)
Hay?
=cell đó.offset(-2,-1).resize(1,4)

Ý mình là nếu tìm được giá trị Sunday ở dòng 6 cột H thì: Tại dòng 4, cột H-1 và resize sang 4 cột kế bên sẽ đổ màu theo ý mình. Mình thử Msgbox thì đã tìm thấy Sunday rồi mà đến đoạn đổ màu thì báo lỗi Run time erro

Hoặc theo gợi ý của bạn mình viết lại đoạn code đổ màu như sau:

.Cells(6, H).Offset(-2, -1).Resize(1, 4).ThemeColor = xlThemeColorAccent6 cũng báo lỗi trên :(

Sửa thành như vậy .Cells(6, H).Offset(-2, -1).Resize(1, 4) = 1 thì không báo lỗi nhưng vùng cũng không thấy đổ giá trị 1
 
Upvote 0
Ý mình là nếu tìm được giá trị Sunday ở dòng 6 cột H thì: Tại dòng 4, cột H-1 và resize sang 4 cột kế bên sẽ đổ màu theo ý mình. Mình thử Msgbox thì đã tìm thấy Sunday rồi mà đến đoạn đổ màu thì báo lỗi Run time erro

Hoặc theo gợi ý của bạn mình viết lại đoạn code đổ màu như sau:

.Cells(6, H).Offset(-2, -1).Resize(1, 4).ThemeColor = xlThemeColorAccent6 cũng báo lỗi trên :(

Sửa thành như vậy .Cells(6, H).Offset(-2, -1).Resize(1, 4) = 1 thì không báo lỗi nhưng vùng cũng không thấy đổ giá trị 1
Cái "Sunday" ở trên là kết quả của định dạng Date thì phải dùng Cell.Text
 
Upvote 0
Web KT
Back
Top Bottom