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ị
 
Cũng trên bài này, sau khi sửa lại (dùng biến tạm Tmp As String để thay cho phần tử mảng) và ra kết quả. Em có nhu cầu triển khai theo hướng khác, nhờ các Thầy cho giải thuật:
- Dữ liệu: Sheet2: Data bán hàng, Sheet3: SoHD khách hàng, Sheet4: SoHD Khách hàng đã thanh toán.
- Liệt kê ở Sheet1 MaKH và SoHD từ Sheet2, có trùng SoHD ở Sheet3, nhưng không trùng SoHD đã thanh toán ở Sheet4
- Ghi thêm MaKH và SoHD thanh toán (đợt này) ở Sheet4.
Xin chân thành cảm ơn!
 

File đính kèm

  • Chi tiết thanh toán.rar
    831.6 KB · Đọc: 57
Upvote 0
Mã:
Sub quay()
Dim Aparent(1 To 5), Achild(1 To 3), i As Long


Aparent(1) = Achild
For i = 2 To 3
    Aparent(1)(i) = i
Next i
Aparent(1) = Aparent(1)(2) + Aparent(1)(3)


MsgBox Aparent(1)(2)


End Sub
E đang thử sử dụng mảng trong mảng. Các Anh, Chị và các Thầy cho e hỏi là sau khi e cộng dồn các kết quả con vào Aparent(1) thì không còn truy xuất kết quả con được nữa !
E xin cám ơn !
 
Upvote 0
Mã:
Sub quay()
Dim Aparent(1 To 5), Achild(1 To 3), i As Long


Aparent(1) = Achild
For i = 2 To 3
    Aparent(1)(i) = i
Next i
Aparent(1) = Aparent(1)(2) + Aparent(1)(3)


MsgBox Aparent(1)(2)


End Sub
E đang thử sử dụng mảng trong mảng. Các Anh, Chị và các Thầy cho e hỏi là sau khi e cộng dồn các kết quả con vào Aparent(1) thì không còn truy xuất kết quả con được nữa !
E xin cám ơn !

Đùa với Variant thì phải chịu khó coi chừng kiểu sau khi gán. Nếu không biết cách xét kiểu thì tốt hơn hết là đừng nên chạm vào loại dữ lioệu này, kẻo có ngày bỏng tay.

Thêm vào code trên các lệnh hiển thị kiểu của Aparent(1) sau mỗi lần gán thì sẽ biết tại sao.

Tóm lại, bài này không hẳn là vấn đề của mảng. Nó là vấn đề của kiểu dữ liệu.

Giải thích cho các bạn chưa rõ về kiểu dữ liệu:
Khi không khai báo kiểu thì kiểu được mặc định là Variant.
Vì vậy kiểu của Achild là Variant() - mảng variant; kiểu của Aparent cũng là Variant() - mỗi phần tử của Aparent là Variant, kiểu của Aparent(1) là Variant.
Vì Variant là loại dữ liệu biến hoá được, cho nên khi gán Aparent(1) = Achild thì kiểu của Aparent(1) tự động đổi theo, tức là đổi thành Variant()
Tuy nhiên, khí gán Aparent(1)(i) = i thì kiểu của Aparent(1)(i) đổi thành Long. Lưu ý là đến đây vẫn chưa xác định kiểu rõ rệt cho nên kiểu của Aparent(1) vẫn giữ là Variant().
Khi gán Aparent(1) = Aparent(1)(2) + Aparent(1)(3) thì hệ thống đã xác định được kiểu Long cho Aparent(1); vì Aparent(1)(2) và Aparent(1)(3) là Long nên kết quả của phép cộng chúng là Long
Vì kiểu của Aparent(1) là Long cho nên phép tính truy phần tử mảng theo chỉ số, Aparent(1)(2) không áp dụng được --> lỗi Type Mismatch
 
Upvote 0
Mã:
Sub quay()
Dim Aparent(1 To 5), Achild(1 To 3), i As Long


Aparent(1) = Achild
For i = 2 To 3
    Aparent(1)(i) = i
Next i
Aparent(1) = Aparent(1)(2) + Aparent(1)(3)


MsgBox Aparent(1)(2)


End Sub
E đang thử sử dụng mảng trong mảng. Các Anh, Chị và các Thầy cho e hỏi là sau khi e cộng dồn các kết quả con vào Aparent(1) thì không còn truy xuất kết quả con được nữa !
E xin cám ơn !


Aparent(1) = Achild

Lần gán thứ nhất cho phần tử thứ nhất đã được gán là một mảng Achild (có 3 phần tử)

Aparent(1) = Aparent(1)(2) + Aparent(1)(3)

Lần gán thứ 2 cũng cho phần tử thứ 1 lại là một giá trị.

Như vậy thì làm sao mà bạn có thể bắt nó từ một giá trị trả về lại là một mảng được?

Để nó có thể thực hiện được thì bạn phải làm như sau:

Aparent(1)(2) = Aparent(1)(2) + Aparent(1)(3)

Tức lấy phần tử của mảng con cộng dồn cho chính nó thì mới thực hiện được.

Nhưng nếu là tôi, thì tôi sẽ tính toán cho mảng Achild(1 To 3) này trước, sau đó mới gán mảng đó lên mảng chính Aparent(1) = Achild

Có nghĩa là tôi sẽ làm như thế này:

Mã:
Sub quay()
    Dim i As Long
    Dim Aparent(1 To 5), Achild(1 To 3)
[COLOR=#0000ff]    ''Xu ly mang "con" Achild[/COLOR]
    For i = 2 To 3
        Achild(i) = i
    Next i
    Achild(1) = Achild(2) + Achild(3)
[COLOR=#0000ff]    ''Gan mang Achild vao mang "me" Aparent[/COLOR]
    Aparent(1) = Achild
[COLOR=#0000ff]    ''Kiem tra:[/COLOR]
    For i = 1 To 3
        MsgBox Aparent(1)(i)
    Next
End Sub
 
Upvote 0
E cám ơn A VetMini đã giải thích tường tận . Bây giờ thì e đã hiểu thêm chút ít về kiểu Variant này ( e toàn học lớm và chấp vá nên có nhiều cái chưa hiểu cặn kẽ ) . Mong a chỉ bảo thêm những bài sau ! :)

To a Hoàng Trọng Nghĩa : do tình huống e làm nó phát sinh thằng Aparent này trước, còn thằng A child này xuất hiện phụ thuộc vào Aparent. Nhưng e qua góp ý của a , e sẽ thay đổi và vận dụng . E cám ơn A !
 
Upvote 0
Cũng trên bài này, sau khi sửa lại (dùng biến tạm Tmp As String để thay cho phần tử mảng) và ra kết quả. Em có nhu cầu triển khai theo hướng khác, nhờ các Thầy cho giải thuật:
- Dữ liệu: Sheet2: Data bán hàng, Sheet3: SoHD khách hàng, Sheet4: SoHD Khách hàng đã thanh toán.
- Liệt kê ở Sheet1 MaKH và SoHD từ Sheet2, có trùng SoHD ở Sheet3, nhưng không trùng SoHD đã thanh toán ở Sheet4
- Ghi thêm MaKH và SoHD thanh toán (đợt này) ở Sheet4.
Xin chân thành cảm ơn!
Đọc giải thích sao khó hiểu quá, Leo xem file rồi nhập kết quả muốn có vào file xem sao.
Nhớ giải thích vì sao để có kết quả như vậy?
 

File đính kèm

  • LeoNguyenz.rar
    6.7 KB · Đọc: 21
Upvote 0
Đọc giải thích sao khó hiểu quá, Leo xem file rồi nhập kết quả muốn có vào file xem sao.
Nhớ giải thích vì sao để có kết quả như vậy?
Đúng rồi đó bác Ba Tê, Sheet4 sẽ trả về kết quả là thêm các giá trị bác đã tô màu vàng, vì những số đã có rồi thì không cần lặp lại ở sheet4. Sheet1 chỉ trả về kế quả tô vàng thôi, không cần lấy hết các giá trị khác.
 
Upvote 0
Đúng rồi đó bác Ba Tê, Sheet4 sẽ trả về kết quả là thêm các giá trị bác đã tô màu vàng, vì những số đã có rồi thì không cần lặp lại ở sheet4. Sheet1 chỉ trả về kế quả tô vàng thôi, không cần lấy hết các giá trị khác.
Vậy kiểm tra lại file này xem sao
 

File đính kèm

  • Leo.rar
    271.5 KB · Đọc: 39
Upvote 0
CODE 1:
Mã:
Sub CT_Tach_cot()
    Dim i As Integer
    Dim[COLOR=#ff0000] [B]Tach_cot[/B][/COLOR]
    
    For i = 1 To 4
        Tach_cot = Split(Range("B8").Offset(i, 0), "-", 4)
        Range("B13").Offset(i, 0) = Tach_cot(0)
        Range("B13").Offset(i, 1) = Tach_cot(1)
        Range("B13").Offset(i, 2) = Tach_cot(2)
        Range("B13").Offset(i, 3) = Tach_cot(3)
    Next
End Sub

Anh chị cho em hỏi:
Thông thường,:
+ Khi khai báo biến, ta khai báo thế này:
Mã:
dim str as String
+ khi khai bao mảng, ta khai báo thế này:
Mã:
Dim str(5) as String             'mảng cố định
Dim str(1 to 20, 1 to 30)       'mảng từ....đến....
Dim str()                            ' mảng động

Vấn đề là: Trong CODE 1:
Khi dùng hàm split tách chuỗi thì nó sẽ trả về giá trị là một mảng.

Nhưng tại sao: tach_cot lại được khai báo như là kiểu một biến
dim tach_cot

chứ không phải kiểu một mảng?
dim tach_cot()

Em đã tìm hiểu nhiều nhưng vẫn chưa hiểu chỗ này, mong anh chỉ giải thích.


_______________________***______________________

CODE 2
Mã:
Sub test()
Dim [COLOR=#ff0000]arr[/COLOR]
arr = Array(1, 2, 3, 4, 5)
End Sub

CÂU HỎI 2:

TRONG CODE 2: Thông thường, khi khai báo mảng động, ta phải redim lại mảng động số phần tử trong mảng mới sử dụng được. Nhưng khi dùng hàm array nó sẽ tự nhận biết và gán luôn số phần tử cho mảng động ?Nó làm điều này như thế nào, mong anh chị giải thích cho em thông suốt ! Nếu có code diễn giải càng tốt.

Thanks anh chị !
 
Lần chỉnh sửa cuối:
Upvote 0
CODE 1:
Mã:
Sub CT_Tach_cot()
    Dim i As Integer
    Dim[COLOR=#ff0000] [B]Tach_cot[/B][/COLOR]
    
    For i = 1 To 4
        Tach_cot = Split(Range("B8").Offset(i, 0), "-", 4)
        Range("B13").Offset(i, 0) = Tach_cot(0)
        Range("B13").Offset(i, 1) = Tach_cot(1)
        Range("B13").Offset(i, 2) = Tach_cot(2)
        Range("B13").Offset(i, 3) = Tach_cot(3)
    Next
End Sub

Anh chị cho em hỏi:
Thông thường,:
+ Khi khai báo biến, ta khai báo thế này:
Mã:
dim str as String
+ khi khai bao mảng, ta khai báo thế này:
Mã:
Dim str(5) as String             'mảng cố định
Dim str(1 to 20, 1 to 30)       'mảng từ....đến....
Dim str()                            ' mảng động

Vấn đề là: Trong CODE 1:
Khi dùng hàm split tách chuỗi thì nó sẽ trả về giá trị là một mảng.

Nhưng tại sao: tach_cot lại được khai báo như là kiểu một biến
dim tach_cot

chứ không phải kiểu một mảng?
dim tach_cot()

Em đã tìm hiểu nhiều nhưng vẫn chưa hiểu chỗ này, mong anh chỉ giải thích.


_______________________***______________________

CODE 2
Mã:
Sub test()
Dim [COLOR=#ff0000]arr[/COLOR]
arr = Array(1, 2, 3, 4, 5)
End Sub

CÂU HỎI 2:

TRONG CODE 2: Thông thường, khi khai báo mảng động, ta phải redim lại mảng động số phần tử trong mảng mới sử dụng được. Nhưng khi dùng hàm array nó sẽ tự nhận biết và gán luôn số phần tử cho mảng động ?Nó làm điều này như thế nào, mong anh chị giải thích cho em thông suốt ! Nếu có code diễn giải càng tốt.

Thanks anh chị !
Theo tôi được biết nếu khai báo Dim Tach_cot (không có as ...) thì máy hiểu là Variant là nhận bất cứ kiểu gì.
- Câu 1: hàm split trả mảng 1 chiều, nếu bạn khai báo Dim Tach_cot as String (hay gì đó khác mảng) thì nó la làng ngay.
Khai báo Dim Tach_cot() là được
- Câu 2: cũng tương tự như câu 1 thôi.
Khai báo dim Arr() là được
 
Lần chỉnh sửa cuối:
Upvote 0
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ị

For Each Cll In Rng
I = I + 1
ARR(I, 1) = Cll
Next



anh thử xem cái này xem sao
 
Upvote 0
Theo tôi được biết nếu khai báo Dim Tach_cot (không có as ...) thì máy hiểu là Variant là nhận bất cứ kiểu gì.
- Câu 1: hàm split trả mảng 1 chiều, nếu bạn khai báo Dim Tach_cot as String (hay gì đó khác mảng) thì nó la làng ngay.
Khai báo Dim Tach_cot() là được
- Câu 2: cũng tương tự như câu 1 thôi.
Khai báo dim Arr() là được
Nhân câu hỏi này cho em hỏi thêm về việc khai báo này một chút.
1/ Khi làm như anh Viehoai hướng dẫn nhưng máy em báo Error 13. Nhưng nếu khai báo

Mã:
Dim Tach_cot() As String
Thì được

2/ Tại sao các kiểu khai báo sau đều gây lỗi

Mã:
'Cach 1
Sub Test1()
    Dim arr() As String
    arr = Array(1, 2, 3, 4, 5)
End Sub


'Cach 2
Sub Test2()
    Dim arr() As Long
    arr = Array(1, 2, 3, 4, 5)
End Sub

'Cach 3
Sub Test3()
    Dim arr() As String
    arr = Array("1", "2", "3", "4", "5")
End Sub

mà chỉ có khai báo sau mới được

Mã:
Sub Test()
    Dim arr()
    arr = Array(1, 2, 3, 4, 5)
End Sub

3/ Khi gán giá trị 1 vùng trên sheet vào Array thì tại sao các code khai bảo mảng sau gây lỗi


Mã:
'Cach 1
Sub Test4()
    Dim arr() As String
    arr = Range("a1:a10")
End Sub

'Cach 2
Sub Test5()
    Dim arr() As Long
    arr = Range("a1:a10")
End Sub


'Cach 3
Sub Test6()
    Dim arr() As Long
    arr = Range("a1:a10").Value
End Sub


'Cach 4
Sub Test7()
    Dim arr() as String
    arr = Range("a1:a10").Text
End Sub


'Cach 5
Sub Test8()
    Dim arr()
    arr = Range("a1:a10").Text
End Sub

Trong khi khai báo sau lại được
Mã:
Sub Test9()
    Dim arr()
    arr = Range("a1:a10").Value
End Sub


Sub Test9()
    Dim arr()
    arr = Range("a1:a10").Value2
End Sub

Xin cảm ơn!
 
Upvote 0
Chào bạn dhn46,
Mình sẽ trả lời câu hỏi số 2 của bạn:
Mã:
'Cach 1
Sub Test1()
    Dim arr() As String
    arr = Array(1, 2, 3, 4, 5)
End Sub

'Cach 2
Sub Test2()
    Dim arr() As Long
    arr = Array(1, 2, 3, 4, 5)
End Sub

'Cach 3
Sub Test3()
    Dim arr() As String
    arr = Array("1", "2", "3", "4", "5")
End Sub

Khi bạn dùng arr =Array() thì giá trị mà hàm Array() trả về là một Variant (bắt buộc)
Nên nếu bạn có khai báo kiểu cho arr thì phải khai báo kiểu là: variant thì nó mới chịu.

Thân ái !


Quay lại câu hỏi của em
http://www.giaiphapexcel.com/forum/...về-mảng-trong-VBA-(Array)&p=573733#post573733

Khi ta khai báo:
dim tach_cot
nếu không khai báo luôn kiểu cho biến thì nó sẽ cho kiểu mặc định là variant
Cái này em biết rồi. Không bàn tán nữa !

Vấn đề em không hiểu là tại sau:

trong khai báo tach_cot không có dấu hiệu khai báo mảng, mà nó hiểu là mảng ?
Mong anh chị giải đáp cho em được hiểu !

tại không không phải là dim tach_cot()

mà chỉ là dim tach_cot ???

Mong anh chị giải đáp cho em rõ, em xin cảm ơn !
 
Lần chỉnh sửa cuối:
Upvote 0
Quay lại câu hỏi của em
http://www.giaiphapexcel.com/forum/...về-mảng-trong-VBA-(Array)&p=573733#post573733

Khi ta khai báo:
dim tach_cot
nếu không khai báo luôn kiểu cho biến thì nó sẽ cho kiểu mặc định là variant
Cái này em biết rồi. Không bàn tán nữa !

Vấn đề em không hiểu là tại sau:

trong khai báo tach_cot không có dấu hiệu khai báo mảng, mà nó hiểu là mảng ?
Mong anh chị giải đáp cho em được hiểu !

tại không không phải là dim tach_cot()

mà chỉ là dim tach_cot ???

Mong anh chị giải đáp cho em rõ, em xin cảm ơn !

Khi bạn khai báo
Mã:
Dim tach_cot

Thì biến tách cột là dạng Variant. Đã là Variant thì biến đó mang dữ liệu gì mà chả được dù là mảng, số, chuỗi ... Lỗi của mình tại câu 2 bài trên đó là quên mất Help, bạn đọc help về Variant sẽ hiểu.
 
Upvote 0
Mã:
[FONT=Verdana]For Each Ten In Range([c16], [c65536].End(3))           [/FONT] If Ten > 0 And Ten.Font.ColorIndex <> 3 Then  '
                Doc = .Documents.Open(ThisWorkbook.Path & "\" & [d1] & ".doc")
[FONT=Verdana]                .Selection.Find.Execute [c12], , , , , , , , , Ten, [/FONT][COLOR=#ff0000][FONT=Verdana]2[/FONT][/COLOR]
Dạ cho em hỏi số 2 chữ màu đỏ có ý nghĩa gì ạ
 
Upvote 0
Mã:
[FONT=Verdana]For Each Ten In Range([c16], [c65536].End(3))           [/FONT] If Ten > 0 And Ten.Font.ColorIndex <> 3 Then  '
                Doc = .Documents.Open(ThisWorkbook.Path & "\" & [d1] & ".doc")
[FONT=Verdana]                .Selection.Find.Execute [c12], , , , , , , , , Ten, [/FONT][COLOR=#ff0000][FONT=Verdana]2[/FONT][/COLOR]
Dạ cho em hỏi số 2 chữ màu đỏ có ý nghĩa gì ạ
Có 3 số: 0,1,2
0 là không thay gì cả
1 là thay chỉ 1 cụm khi tìm thấy
2 là thay tất cả
Cái này có thể đọc trong VBA Help thì sẽ thấy rõ hơn
 
Upvote 0
dạ cho em hỏi thêm một chút
Mã:
.Selection.Find.Execute [c13], , , , , , , , , Ten([COLOR=#ff0000]1, 3[/COLOR]), 2
Số 1 và 3 màu đỏ ý nghĩ gì vậy ? Em tìm câu trả lời của nó mà tìm mãi không có. Em xin cám ơn
 
Upvote 0
Web KT

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

Back
Top Bottom