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ị
 
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
Cái "Sunday" ở trên là kết quả của định dạng Date thì phải dùng Cell.Text

Befaint ơi Sunday là dạng text do mình dùng if
=+IF(WEEKDAY(K6)=1,"Sunday","").
Và thực tế thì đã tìm ra đúng 4 ngày chủ nhật trong vòng lặp For, tuy nhiên tìm xong rồi không thấy nó làm gì cả.
 
Upvote 0
Befaint ơi Sunday là dạng text do mình dùng if
=+IF(WEEKDAY(K6)=1,"Sunday","").
Và thực tế thì đã tìm ra đúng 4 ngày chủ nhật trong vòng lặp For, tuy nhiên tìm xong rồi không thấy nó làm gì cả.
- Bài này không liên quan gì tới chủ đề của thớt: Mảng trong VBA
Nếu có tiếp tục thì vào thớt gỡ rối, giải thích.
- Loằng ngoằng thế sao không gửi cái file, hoặc xét luôn cái cell chứa date ấy
Trong VBA thì:
PHP:
Ngayxet=cells(6,H).value2
If Weekday(Ngayxet, vbSunday)=1 then
- Lập thớt mới!!!!
 
Upvote 0
Cảm ơn Befaint, mình làm được rồi. Ban đầu là mình có ý định xem dùng mảng mà lên mới post trong thread này, hề hề.
 
Upvote 0
Em có viết giùm cho bạn em một file sổ cái có thể truy vấn theo đối tượng, tuy nhiên em thấy code của em vẫn còn rối và tốc độ vẫn còn khá chậm, vì dữ liệu trong file lớn lắm, maximum của TK ps là trên 13k dòng. Nên em muốn nhờ mọi người xem giúp em đoạn code của em có thể nào gọn và nhanh hơn nữa được không, em xin cám ơn cả nhà.
Sub test()
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
Sheet5.Activate
Sheet5.ShowAllData
Sheet5.Range(Sheet5.Range("A9"), Sheet5.Range("A1048576")).EntireRow.ClearContents
Dim arr
Dim i, j
Dim sArray
Dim DK_1, DK_2
j = 9
DK_1 = Sheet5.Range("D1").Value
DK_2 = Sheet5.Range("D2").Value
arr = Sheet1.Range(Sheet1.Range("A4"), Sheet1.Range("A1048576").End(xlUp).Offset(0, 10)).Value
If DK_2 = 0 Then
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i, 4) = DK_1 And arr(i, 5) = DK_1 Then
Sheet5.Range("A" & j & ":D" & j).Value = Sheet1.Range("A" & i + 3 & ":D" & i + 3).Value
Sheet5.Cells(j, 5).Value = arr(i, 6)
Sheet5.Cells(j, 6).Value = arr(i, 6)
Sheet5.Range("G" & j & ":K" & j).Value = Sheet1.Range("G" & i + 3 & ":K" & i + 3).Value
j = j + 1
ElseIf arr(i, 4) = DK_1 Then
Sheet5.Range("A" & j & ":C" & j).Value = Sheet1.Range("A" & i + 3 & ":C" & i + 3).Value
Sheet5.Cells(j, 4).Value = arr(i, 5)
Sheet5.Cells(j, 5).Value = arr(i, 6)
Sheet5.Range("G" & j & ":K" & j).Value = Sheet1.Range("G" & i + 3 & ":K" & i + 3).Value
j = j + 1
ElseIf arr(i, 5) = DK_1 Then
Sheet5.Range("A" & j & ":C" & j).Value = Sheet1.Range("A" & i + 3 & ":C" & i + 3).Value
Sheet5.Cells(j, 4).Value = arr(i, 4)
Sheet5.Cells(j, 6).Value = arr(i, 6)
Sheet5.Range("G" & j & ":K" & j).Value = Sheet1.Range("G" & i + 3 & ":K" & i + 3).Value
j = j + 1

End If
Next i
End If
If DK_2 <> 0 Then
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i, 4) = DK_1 And arr(i, 5) = DK_1 And (DK_2 = arr(i, 8) Or DK_2 = arr(i, 9)) Then
Sheet5.Range("A" & j & ":D" & j).Value = Sheet1.Range("A" & i + 3 & ":D" & i + 3).Value
Sheet5.Cells(j, 5).Value = arr(i, 6)
Sheet5.Cells(j, 6).Value = arr(i, 6)
j = j + 1
ElseIf arr(i, 4) = DK_1 And (arr(i, 8) = DK_2 Or arr(i, 9) = DK_2) Then
Sheet5.Range("A" & j & ":C" & j).Value = Sheet1.Range("A" & i + 3 & ":C" & i + 3).Value
Sheet5.Cells(j, 4).Value = arr(i, 5)
Sheet5.Cells(j, 5).Value = arr(i, 6)
Sheet5.Range("G" & j & ":K" & j).Value = Sheet1.Range("G" & i + 3 & ":K" & i + 3).Value
j = j + 1
ElseIf arr(i, 5) = DK_1 And (arr(i, 8) = DK_2 Or arr(i, 9) = DK_2) Then
Sheet5.Range("A" & j & ":C" & j).Value = Sheet1.Range("A" & i + 3 & ":C" & i + 3).Value
Sheet5.Cells(j, 4).Value = arr(i, 4)
Sheet5.Cells(j, 6).Value = arr(i, 6)
Sheet5.Range("G" & j & ":K" & j).Value = Sheet1.Range("G" & i + 3 & ":K" & i + 3).Value
j = j + 1
End If
Next i
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
 
Upvote 0
Cho em hỏi trong vba thì làm sao để tạo được mảng có kích thước là 0 như trong hình, tất nhiên là sẽ không dùng listbox. ( trong hình là mảng 0 x 10).
Untitled.png
 
Upvote 0
Dim Arr As Variant
ReDim Arr(0 To 10)

Dim Arr(0 To 10) As Variant

Dim Arr(1 to 10, 1 to 5) As Variant
 
Upvote 0
Upvote 0
Upvote 0
Anh chị cho minh hỏi có cách nào lấy dữ liệu 1 cột hoặc 1 hàng của mảng 2 chiều ra để gán vào mảng 1 chiều khác không ạ?(không dùng vòng lặp(for, do while,..)) Thanks
 
Upvote 0
Anh chị cho minh hỏi có cách nào lấy dữ liệu 1 cột hoặc 1 hàng của mảng 2 chiều ra để gán vào mảng 1 chiều khác không ạ?(không dùng vòng lặp(for, do while,..)) Thanks
Mục đích để nối chuỗi?
Cách:
# Lấy cột:
- Gán mảng 2 chiều xuống bảng tính.
- Mảng 1 chiều = Application.Transpose(cột cần lấy trên bảng tính)

# Lấy hàng:
- Transpose mảng 2 chiều, rồi gán xuống bảng tính.
- Mảng 1 chiều = Application.Transpose(cột cần lấy trên bảng tính ). Cột cần lấy trên bảng tính = hàng cần lấy của mảng 2 chiều.
 
Upvote 0
Mục đích để nối chuỗi?
Cách:
# Lấy cột:
- Gán mảng 2 chiều xuống bảng tính.
- Mảng 1 chiều = Application.Transpose(cột cần lấy trên bảng tính)

# Lấy hàng:
- Transpose mảng 2 chiều, rồi gán xuống bảng tính.
- Mảng 1 chiều = Application.Transpose(cột cần lấy trên bảng tính ). Cột cần lấy trên bảng tính = hàng cần lấy của mảng 2 chiều.

Thanks bạn nhiều, mình cần làm trên chạy code tren VBA thôi, không đụng tới các Worksheet
 
Upvote 0
Web KT

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

Back
Top Bottom