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!
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 !
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
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 !
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
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 !
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!
Đú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.
Đú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ài ba hôm nay em bận chút việc chưa xem được code bác Ba Tê viết, code chạy ổn, đúng như mong muốn. Bây giờ em đang test để áp dụng.
Chân thành cảm ơn bác!
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.
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.
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
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ảm ơn phihndhsp. Bài này được giải quyết lâu rồi lúc đó chưa biết về mãng. Nhưng có lẻ do topic lập lại bài 1 nên có thể phihndhsp không để ý nên trả lời. À nếu vậy Arr=Rng.Value sao phải dùng For each nhỉ?
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
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ì 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.