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,908
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 một bài về mảng gần tương tự bài trước mình gửi mà không biết vì sao code nó không chạy ra kết quả mong muốn. Mọi người giúp mình nhé.
PHP:
Sub hochoi2()
Dim mangDL(), i As Integer, j As Integer, k As Integer
Dim maxRow As Long, maxCol As Long

With Sheets("Check")
    mangDL = .Range("B2").Resize(21, 31).Value
    maxRow = UBound(mangDL, 1): maxCol = UBound(mangDL, 2)
ReDim KQ(1 To maxRow, 1 To maxCol)
    For i = 1 To maxRow
        For j = 1 To maxCol
            If mangDL(i, j) > 400 Then
                KQ(i, j) = mangDL(i, j)
            End If
        Next j
    Next i
    Sheets("19").Range("B9").Resize(maxRow, maxCol) = KQ
End With

End Sub
 

File đính kèm

  • Copy of Mang nhap mon 2 .xlsb
    21.7 KB · Đọc: 14
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub hochoi2()
Dim mangDL(), i As Integer, j As Integer, k As Integer
Dim maxRow As Long, maxCol As Long

With Sheets("Check")
    mangDL = .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 = 1 To maxRow
        For j = 1 To maxCol
            If mangDL(i, j) > 400 Then
                KQ(i, j) = mangDL(i, j)
            End If
        Next j
    Next i

If k Then

    Sheets("19").Range("A9").Resize(22, 31) = KQ

End If

End With

End Sub

Bởi vì không đặt biến k cho nên kết quả chỉ loại bỏ giá trị ở các cột không thỏa mãn, mình muốn bỏ hẳn các STT không đạt yêu cầu thì không cho vào mảng :).
 
Upvote 0
PHP:
Sub hochoi2()
Dim mangDL(), i As Integer, j As Integer, k As Integer
Dim maxRow As Long, maxCol As Long

With Sheets("Check")
    mangDL = .Range("B2").Resize(21, 31).Value
    maxRow = UBound(mangDL, 1): maxCol = UBound(mangDL, 2)
ReDim KQ(1 To maxRow, 1 To maxCol)
    For i = 1 To maxRow
        For j = 1 To maxCol
            If mangDL(i, j) > 400 Then
                KQ(i, j) = mangDL(i, j)
            End If
        Next j
    Next i
    Sheets("19").Range("B9").Resize(maxRow, maxCol) = KQ
End With

End Sub

Bạn tiến hành duyệt 1 lần nữa, xóa các dòng trống đi, nữa là xong.
 
Upvote 0
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
Web KT

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

Back
Top Bottom