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,600
Được thích
2,907
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ị
 
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
cần làm trên chạy code tren VBA
Thử đoạn sau:
PHP:
Function GetRowColumnArray2D(ByVal arSrc, ByVal index As Long, Optional ByVal GetRow As Boolean = True)
''arSrc: Mang 2 chieu
''index: Chi so dong hoac cot can lay du lieu
''GetRow: Mac dinh lay theo dong, nguoc lai =False thi lay theo cot
    Dim Result(), i As Long, j As Long, d As Long
    d = IIf(GetRow = True, 2, 1)
    For i = LBound(arSrc, d) To UBound(arSrc, d)
        If GetRow = True Then
            ReDim Preserve Result(j)
            Result(j) = arSrc(index, i)
            j = j + 1
        Else
            ReDim Preserve Result(j)
            Result(j) = arSrc(i, index)
            j = j + 1
        End If
    Next i
    GetRowColumnArray2D = Result
End Function
 
Upvote 0
Không được. Bạn thử đi...
Mã:
Sub kk()
    Dim c
    Dim a(1 To 3, 1 To 3) As Variant
    Dim i, j
    Dim k
    For i = LBound(a, 2) To UBound(a, 2)
        For j = LBound(a, 1) To UBound(a, 1)
            
            
            k = k + 1
            a(j, i) = k
        Next
    Next
    Range("a1:c3").Value = a
    c = Application.Index(a, 2) 'hang 2
    
    Range("d1:f1").Value = c
    c = Application.Index(a, , 3) 'cot 3
    Range("h1:h3").Value = c
End Sub

Đối với cột thì có thể dùng api, nhưng chưa thử.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
em có mảng sau KHR(r1, 1) = HR(i, 2)

'(1)
Range("A5")= KHR(r1, 1)

Làm thế nào để biến cái "dọc" này thành ngang??

Giả sử kết quả mảng đó có các phần tử tại dòng 1, 2 và 3 là 10, 11 và 12, cột là cột 1. Vậy làm thế nào để chuyển hóa cái "dòng dọc" này thành dòng "ngang"?

Hay nói cách khác em muốn kết quả thể hiện tại 1(1) lần lượt là :A5 là 10, A6 là 11 và A7 là 12
 
Upvote 0
Web KT
Back
Top Bottom