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ị
 
Đây là thớt về mảng cho nên tôi thêm bài này. Mục đích dùng mảng thật nhiều chứ khong luận đến hiệu quả (như tốc độ, code dễ xem dễ sửa)

Mã:
Function FMatches(ByVal s1, ByVal s2) As Variant
' compares 2 comma-delimited strings
' return an array (1 To 4):
' 1: intersection; 2: union; 3: left diff; 4: right diff
  a1 = Split(s1, ",")
  a2 = Split(s2, ",")
  ReDim a3(0 To UBound(a1)) As String ' intersection
  i3 = -1
  For Each e In Split(s1, ",")
    If UBound(Filter(a2, e)) >= 0 Then
    ' found e in a2 => a2 contains e
    ' now we insert e in the intersection set (a3)
    ' and take e off a1, a2
      i3 = i3 + 1
      a3(i3) = e ' intersection
      a1 = Filter(a1, e, False)
      a2 = Filter(a2, e, False)
      If UBound(a2) < 0 Then Exit For ' a2 exhausted
    End If
  Next e
  If i3 >= 0 Then ReDim Preserve a3(0 To i3)
  ReDim a(1 To 4) As String
  a(1) = Join(a3, ",") ' intersection
  a(3) = Join(a1, ",") ' left diff
  a(4) = Join(a2, ",") ' right diff
  a(2) = a(3) & IIf(a(3) <> "" And a(1) <> "", ",", "") & a(1) ' union
  a(2) = a(2) & IIf(a(2) <> "" And a(4) <> "", ",", "") & a(4)
  FMatches = a
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Chào anh em. Mình có search trên mạng nhưng vẫn chưa rõ lắm. Mong anh em chỉ giáo giúp mình. Ý là mình có một bảng rất nhiều cột thông tin. Nhưng chỉ xử lý trên vài cột nhất định ví dụ là A,B,C, F, H. mình muốn đưa các giá trị ở các cột này vào mảng để xử lý cho nhanh. Nhưng vì các cột không liên tục nên mình không biết khai báo và nhập dữ liệu vào bảng như thế nào. rồi khi gán trở lại cũng không biết luôn. Mong anh em chỉ giáo thêm. Chân thành cảm ơn
 
Upvote 0
Chào anh em. Mình có search trên mạng nhưng vẫn chưa rõ lắm. Mong anh em chỉ giáo giúp mình. Ý là mình có một bảng rất nhiều cột thông tin. Nhưng chỉ xử lý trên vài cột nhất định ví dụ là A,B,C, F, H. mình muốn đưa các giá trị ở các cột này vào mảng để xử lý cho nhanh. Nhưng vì các cột không liên tục nên mình không biết khai báo và nhập dữ liệu vào bảng như thế nào. rồi khi gán trở lại cũng không biết luôn. Mong anh em chỉ giáo thêm. Chân thành cảm ơn
1. Nếu không quan tâm đến định dạng của các cột (không liên quan đến khâu xử lý) khi ghi dữ liệu từ mảng vào sheet thì bạn cứ khai báo 1 mảng rồi gán nguyên cả bảng vào mảng. Khi xử lý dữ liệu trên mảng thì cứ theo chỉ số cột mà ghi, sửa y như thuộc tính Cells(r, c) của Sheet vậy.
2. Cách khác là cứ khai báo mỗi cột 1 mảng gồm n dòng và 1 cột thế này arr(1 to n, 1 to 1) rồi gán giá trị của mỗi cột vào mỗi mảng để xử lý. Khi chép lại vào sheet thì làm mỗi mảng cho mỗi một tương ứng với khi gán
 
Upvote 0
1. Nếu không quan tâm đến định dạng của các cột (không liên quan đến khâu xử lý) khi ghi dữ liệu từ mảng vào sheet thì bạn cứ khai báo 1 mảng rồi gán nguyên cả bảng vào mảng. Khi xử lý dữ liệu trên mảng thì cứ theo chỉ số cột mà ghi, sửa y như thuộc tính Cells(r, c) của Sheet vậy.
2. Cách khác là cứ khai báo mỗi cột 1 mảng gồm n dòng và 1 cột thế này arr(1 to n, 1 to 1) rồi gán giá trị của mỗi cột vào mỗi mảng để xử lý. Khi chép lại vào sheet thì làm mỗi mảng cho mỗi một tương ứng với khi gán
Cảm ơn bạn @Maika8008 nha.
Cho mình hỏi thêm xíu với ý số 1 của bạn khi mình gán một mảng nhiều thông tin như vậy thì có làm chậm code không.
Với lại mình đang khai báo các cột cần dùng dưới dạng "string". nếu chọn hết các cột sẽ phải khai báo lại dưới dạng "variant". Như vậy mình cũng đang thắc mắc là nó có khác nhau gì không. vì mình cũng là học mò chứ không được đào tạo bài bản. nên chưa nắm vững cách vận hành của VBA
 
Upvote 0
Cảm ơn bạn @Maika8008 nha.
Cho mình hỏi thêm xíu với ý số 1 của bạn khi mình gán một mảng nhiều thông tin như vậy thì có làm chậm code không.
Với lại mình đang khai báo các cột cần dùng dưới dạng "string". nếu chọn hết các cột sẽ phải khai báo lại dưới dạng "variant". Như vậy mình cũng đang thắc mắc là nó có khác nhau gì không. vì mình cũng là học mò chứ không được đào tạo bài bản. nên chưa nắm vững cách vận hành của VBA
Dùng mảng để tăng tốc độ code (so với đọc trực tiếp trên sheet) đó chứ.

Nếu các cột bạn xử lý là string thì khi dùng trong mảng như cách 1 cứ xài bình thường dù là variant. Chỉ sợ là khi chép lên sheet thì các cột khác là number sẽ bị mất định dạng từ trước đó. Do vậy dùng cách 2 là ổn nhất, nếu các cột nào liền nhau thì gán chung 1 mảng
 
Upvote 0
Chào anh em. Mình có search trên mạng nhưng vẫn chưa rõ lắm. Mong anh em chỉ giáo giúp mình. Ý là mình có một bảng rất nhiều cột thông tin. Nhưng chỉ xử lý trên vài cột nhất định ví dụ là A,B,C, F, H. mình muốn đưa các giá trị ở các cột này vào mảng để xử lý cho nhanh. Nhưng vì các cột không liên tục nên mình không biết khai báo và nhập dữ liệu vào bảng như thế nào. rồi khi gán trở lại cũng không biết luôn. Mong anh em chỉ giáo thêm. Chân thành cảm ơn
Khi gán trở lại, bạn gán đè lên dữ liệu cũ (ở các cột có thay đổi) hay gán lên 1 vùng mới tạo 1 bảng mới hoàn toàn?
Giả sử bạn có vùng dữ liệu từ A1:Z100. Bạn chỉ quan tâm đến cột A,B,C,F,H và muốn tính toán trên các cột này, ví dụ: H1=A1+B1+C1+F1, và dùng VBA
Nếu không dùng VBA (hoặc dùng VBA) bạn chỉ cần điền công thức trực tiếp vào cột H (hoặc dùng VBA điền CT)
Nếu số dòng nhiều hơn , vài ngàn đến vài chục, vài trăm ngàn dòng, bạn sẽ phải dùng mảng (array) để xử lý.
Ví dụ: gán vùng vào mảng
PHP:
Dim rng
rng = range("A1:Z100").Value

Lúc này rng là 1 biến mảng có cùng kích thước với range cho trước
Lưu ý: khi dùng .Value nghĩa là giá trị trên sheet thế nào thì copy vô mảng như vậy
ví dụ: 1 ô là hiển thị "15:00:00" có giá trị thực (value2) là 1 số thập phân nhỏ hơn 1 (=15/24), khi chuyển vào mảng, muốn tính toán nó như là giờ thực (15/24) thì dùng

PHP:
rng = range("A1:Z100").Value2

Sau đó, bạn dùng For...Next để duyệt qua dòng cột của rng, tính toán , gán giá trị, sau đó gán ngược lại sheet. (Vòng lặp 2 có thể bỏ qua)

PHP:
For i = 1 to Ubound(rng) ' loop dòng
For j=1 to ubound(rng,2) ' loop cột
 If j = 8 then ' cột H
rng(i,j) = rng(i,1) + rng(i,2) + rng(i,3) + rng(i,7) ' cột H = cột A+ B + C + F  
Next
Next
Range("A1:Z100").value = rng ' gán vào sheet

Nếu vùng gán của bạn là vùng mới, và bảng mới có cùng số dòng nhưng chỉ có các cột trên, thì dùng thêm 1 biến mảng 2D

PHP:
Dim rng, res()
rng = range("A1:Z100").Value
Redim res(1 to Ubound(rng), 1 to 5) ' mảng result, có cùng số dòng, và 5 cột)

Sau đó bạn loop rng, tính toán rồi gán qua mảng res
Cuối cùng gán res xuống bảng tính

Bạn thử nếu không được, thì post file mẫu lên nhé.
 
Upvote 0
Mình hiểu cách làm rồi. để cho tiện thì cách số 2 của bạn @Maika8008 là hợp lý nhất mình sẽ khai báo các mảng nhỏ liền với nhau với cùng kiểu dữ liệu.
sau đó chạy vòng lặp for từ giá trị đầu đến cuối và vì số dòng của các mảng nhỏ là giống nhau nên vẫn có thể duyệt qua các mảng cho từng dòng để xử lý/. sau đó gán giá trị ngược trở lại bảng tính với đúng kiểu dữ liệu đã khai báo. Chân thành cảm ơn bạn @Maika8008@bebo021999 đã thông não giùm mình
 
Upvote 0
Xin các chú, anh, chị giúp đỡ code nạp dữ liệu vào mảng từ 1 file có đường dẫn cho trước ạ.
Cháu/em có sử dụng Dialog để lấy được đường dẫn và tên. Giờ cháu/em muốn lấy dữ liệu từ file đó để gán vào 1 mảng ạ.
 
Upvote 0
Xin các chú, anh, chị giúp đỡ code nạp dữ liệu vào mảng từ 1 file có đường dẫn cho trước ạ.
Cháu/em có sử dụng Dialog để lấy được đường dẫn và tên. Giờ cháu/em muốn lấy dữ liệu từ file đó để gán vào 1 mảng ạ.
Không hiểu lắm có nghĩa là cái file đấy vẫn ở máy tính của mình hay là ở máy khác.Nếu máy của mình thì dùng ADO mở và lấy dữ liệu vào mảng thôi.
 
Upvote 0
Không hiểu lắm có nghĩa là cái file đấy vẫn ở máy tính của mình hay là ở máy khác.Nếu máy của mình thì dùng ADO mở và lấy dữ liệu vào mảng thôi.
Vâng, vẫn là cùng 1 máy ạ. Em dùng Dialog để làm thao tác cho người dùng chọn đến tệp cần lấy dữ liệu. Khi đó em sẽ có đường dẫn của tệp đó. Tiếp theo em nạp dữ liệu vào Mảng 2. Trước đó em có Mảng 1 là các từ khoá cần tìm trong cột diễn giải của Mảng 2.
Cái khó là giờ em không áp được phương thức Find vào tìm Mảng 1 trong Mảng 2 được (do có tìm theo 2 kiểu là Có chứa và Bắt đầu). Ngoài ra sau đó em lại phải ghi kết quả ra Mảng 2 vào tệp đó.
Em lại ở công ty nên không gửi file được, bị chặn hết ạ.
 
Upvote 0
Vấn đề này thì dùng countifs với wildcard chứ liên quan gì đến mảng?
 
Upvote 0
Web KT

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

Back
Top Bottom