Tìm cách tối ưu khi đưa giá trị từ Sheet vào Aray và ngược lại

Liên hệ QC

tedaynui

(*_*)
Thành viên danh dự
Tham gia
12/8/06
Bài viết
1,875
Được thích
2,480
Chào các bạn,
Thông thường mình lấy giá trị từ Sheet đưa vào Array bằng cách dùng For. Ví dụ như
PHP:
Option Base 1
   
  Sub Test()
  Dim Arr(5000, 5)
  For i = 1 To 5000
      For k = 1 To 5
          Arr(i, k) = Sheet1.Cells(i, k)
      Next k
  Next i
  Sheet2.[A1:E5000] = Arr
  End Sub
Không biết có cách nào khác nhanh hơn không.

Và ngược lại, nếu muốn đưa một mảng giá trị từ Array lên Sheet, ví dụ: gán giá trị Arr(1,2) cho đến Arr(5000,2) lên [B1:B5000] thì ngoài For ra còn có cách nào nhanh hơn không ?

Cảm ơn rất nhiều
TDN
 
Được mà Phước, thí dụ:
PHP:
Sub abc()
Dim Arr
Arr = Sheet1.Range("A1:G10")
Sheet2.Range("B11:H20") = Arr
End Sub

Khi gán giá trị Sheet vào Array, thì không cần khai báo kích thước Array trước, nhưng khi gán Array xuống sheet, thì vùng gán xuống phải có cùng kích thước với Array.
 
Upvote 0
Dạ cám ơn hai anh! Ý em không phải gán toàn bộ giá trị của Array lên Sheet.
Ví dụ có 1 Array gồm 10 dòng và 5 cột. Nhưng em chỉ muốn lấy giá trị cột 5 thôi

Thật ra em đang thí nghiệm thử cách đánh giá xếp loại học sinh (khoảng 5000 học sinh) dựa vào Aray xem có nhanh hơn dùng User Function không : Em có 1 bảng danh sách học sinh và các cột điểm (ví dụ có 5000 học sinh và 10 cột điểm không liền nhau).
Như vậy em sẽ tạo 1 Array gồm 5000 dòng và 11 cột (trong đó, cột thứ 11 để chứa kết quả).
Sau khi xử lý, kết quả sẽ chứa trong cột 11 của mảng.
Cuối cùng, em chỉ gán giá trị của cột 11 của Array lên Sheet. (chứ không phải gán toàn bộ Array lên Sheet)
 
Lần chỉnh sửa cuối:
Upvote 0
Array sẽ nhanh hơn UDF. Lúc nãy hiểu sai câu hỏi nên trả lời không đúng. Ta có thể dùng 2 mảng cũng vẫn nhanh.

Thí dụ:

PHP:
Option Base 1
-----------------
Sub abc()
Dim Arr1, Arr2(5000, 1)
Arr1 = Range("A1:E5000")
   For i = 1 To 5000
      Arr2(i, 1) = (Arr1(i, 1) + Arr1(i, 2) + Arr1(i, 3) + (Arr1(i, 4) + Arr1(i, 5)) * 2) / 7
   Next
Range("F1:F5000") = Arr2
End Sub

(Giả định 3 cột A, B, C, hệ số 1; 2 cột D, E hệ số 2)
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn anh nhiều lắm lắm,
Vấn đề ở chỗ dùng 2 hoặc nhiều Array thì lại rất đơn giản nhưng em lại không nghĩ ra cứ lụi hụi trên 1 Array hoài, hic hic
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn anh nhiều lắm lắm,
Vấn đề ở chỗ dùng 2 hoặc nhiều Array thì lại rất đơn giản nhưng em lại không nghĩ ra cứ lụi hụi trên 1 Array hoài, hic hic
Thầy Phước làm đúng cả! Nhưng có 1 chổ rất quan trọng (sẽ ảnh hửong đến tốc độ), đó là đầu tiên phải gán cho bằng được dữ liệu vào Array! Sau đó ta sẽ For... Next trên Array này để tạo ra 1 Array khác (giống như sư phụ Mỹ đã làm)
Nếu cố tình thao tác trực tiếp trên cell thì tốc độ sẽ... ì ạch ngay!
 
Upvote 0
Thêm 1 tí: Nếu kết hợp tính trung bình và đánh giá xếp loại, Arr2 sẽ có 2 cột, không nhất thiết phải 3 Array:

PHP:
Option Base 1
-----------------
Sub abc()
Dim Arr1, Arr2(5000, 2)
Arr1 = Range("A1:E5000")
   For i = 1 To 5000
      Arr2(i, 1) = (Arr1(i, 1) + Arr1(i, 2) + Arr1(i, 3) + (Arr1(i, 4) + Arr1(i, 5)) * 2) / 7
      Select Case Arr2(i, 1)
          Case ....
             Arr2(i, 2) = "Giỏi"
          Case ....
             Arr2(i, 2) = "Khá"
          . . . .
     End Select
   Next
Range("F1:G5000") = Arr2
End Sub

(Thêm những điều kiện theo quy định của ngành GD.)
 
Upvote 0
Thầy Phước làm đúng cả! Nhưng có 1 chổ rất quan trọng (sẽ ảnh hửong đến tốc độ), đó là đầu tiên phải gán cho bằng được dữ liệu vào Array! Sau đó ta sẽ For... Next trên Array này để tạo ra 1 Array khác (giống như sư phụ Mỹ đã làm)
Nếu cố tình thao tác trực tiếp trên cell thì tốc độ sẽ... ì ạch ngay!
Dạ, tất nhiên rồi. Nên em muốn dưa dữ liệu vào Array, xử lý trên Array và đưa kết quả vào Array. Cuối cùng mới "đập" Ảray lên Sheet.
 
Upvote 0
Web KT

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

Back
Top Bottom