Tham chiếu cột biến excel

Bộ sưu tập là một phần rất quan trọng của VBA. Nếu bạn đã sử dụng ngôn ngữ trong một khoảng thời gian bất kỳ thì bạn sẽ sử dụng Bộ sưu tập. Những cái phổ biến nhất là các bộ sưu tập Workbooks, Worksheets, Range và Cells

 

Đoạn mã sau đây cho thấy một số ví dụ về việc sử dụng bộ sưu tập VBA Workbooks

    ' Workbooks is a collection of all open workbooks

    ' Count is the number of workbooks in the collection
    Debug.Print Workbooks.Count

    ' Print the full name of the workbook called Example.xlsm
    Debug.Print Workbooks("Example.xlsm").FullName

    ' Print the full name of the workbook that was opened second
    Debug.Print Workbooks(2).FullName

Bộ sưu tập tương tự như mảng, vì vậy, điều quan trọng là phải hiểu chúng là gì và khác với mảng như thế nào

 

Tải xuống mã

 

Hội thảo trên web về Bộ sưu tập

Nếu bạn là thành viên của trang web, hãy nhấp vào hình ảnh bên dưới để xem hội thảo trên web

(Ghi chú. Các thành viên của trang web có quyền truy cập vào kho lưu trữ hội thảo trên web đầy đủ. )

 

Tham chiếu cột biến excel

 

Bộ sưu tập là gì?

Bộ sưu tập và mảng đều được sử dụng để nhóm các biến. Cả hai đều lưu trữ một tập hợp các mặt hàng tương tự e. g. một danh sách các điểm sinh viên hoặc tên quốc gia. Sử dụng tập hợp hoặc mảng cho phép bạn thao tác nhanh chóng và dễ dàng với một số lượng lớn các mục

Trong bài đăng của tôi trên  tôi đã giải thích một cách đơn giản mảng là gì và tại sao chúng lại hữu ích như vậy. Tôi sẽ tóm tắt ngắn gọn thông tin này ở đây

 

Nếu bạn đang lưu trữ điểm của một học sinh thì bạn có thể dễ dàng thực hiện việc này bằng cách sử dụng một biến duy nhất

    Dim mark As Long
    mark = sheetMarks.Range("A1")

Tuy nhiên, hầu hết thời gian bạn sẽ có nhiều hơn một học sinh để giải quyết. Hãy tưởng tượng bạn muốn lưu trữ điểm của 100 sinh viên. Nếu không sử dụng tập hợp hoặc mảng, bạn sẽ cần tạo hàng trăm biến – một biến để lưu điểm cho mỗi học sinh

 

Một vấn đề khác là bạn phải sử dụng các biến này một cách riêng lẻ. Nếu bạn muốn lưu trữ 100 điểm thì bạn cần một dòng mã mỗi khi bạn muốn lưu trữ giá trị cho một biến

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")

 

Như bạn có thể thấy trong ví dụ trên, viết mã như thế này có nghĩa là hàng trăm dòng mã lặp đi lặp lại. Khi bạn sử dụng tập hợp hoặc mảng, bạn chỉ cần khai báo một biến. Sử dụng vòng lặp với tập hợp hoặc với mảng có nghĩa là bạn chỉ cần một dòng để thêm hoặc đọc giá trị

 

Nếu chúng ta viết lại ví dụ trên bằng cách sử dụng một bộ sưu tập thì chúng ta chỉ cần một vài dòng mã

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next

 

Bộ sưu tập Vs Mảng?

Chúng tôi đã xem xét các bộ sưu tập và mảng có điểm chung. Vậy sự khác biệt là gì và tại sao lại sử dụng cái này hơn cái kia?

Sự khác biệt chính là với một mảng bạn thường đặt kích thước một lần. Điều này có nghĩa là bạn biết kích thước trước khi bắt đầu thêm các phần tử. Hãy để tôi giải thích điều này với một ví dụ

 

Thí dụ. Trường hợp một mảng tốt hơn

Hãy tưởng tượng bạn có một bảng tính điểm của học sinh với một học sinh trên mỗi hàng

 

Tham chiếu cột biến excel

điểm học sinh

 

Bạn muốn lưu trữ thông tin về từng sinh viên. Trong ví dụ này, bạn có thể dễ dàng đếm số hàng để lấy số học sinh. Nói cách khác, bạn biết trước số lượng mặt hàng

Trong mã ví dụ, bạn có thể thấy rằng chúng tôi lấy số học sinh bằng cách đếm các hàng. Sau đó chúng ta có thể sử dụng điều này để tạo một mảng có kích thước chính xác

    ' Get last row - this is the number of students
    Dim lStudentCount As Long
    lStudentCount = Sheet1.Range("A" & Rows.Count).End(xlUp).Row

    ' Create array of correct size
    Dim arr() As Long
    ReDim arr(1 To lStudentCount)

 

Tham chiếu cột biến excel

Bây giờ chúng ta hãy xem ví dụ thứ hai mà chúng ta không biết trước số lượng mục

 

Ví dụ Trường hợp Bộ sưu tập Tốt hơn

Trong ví dụ này, chúng tôi có cùng một bảng tính học sinh nhưng lần này chúng tôi chỉ muốn học sinh với một tiêu chí nhất định. Ví dụ: chỉ những học sinh đến từ Hoa Kỳ hoặc Anh học Toán hoặc Lịch sử. Nói cách khác, bạn sẽ không biết cách chọn một học sinh cho đến khi bạn đọc thông tin chi tiết của họ từ trang tính

Cũng hãy tưởng tượng rằng các sinh viên có thể được thêm hoặc xóa khỏi danh sách khi ứng dụng chạy

Vì vậy, trong ví dụ này số lượng học sinh không cố định và thay đổi rất nhiều. Ở đây bạn không biết trước số lượng học sinh. Do đó bạn không biết nên tạo mảng có kích thước như thế nào

Bạn có thể tạo một mảng có kích thước lớn nhất có thể. Vấn đề là bạn sẽ có rất nhiều chỗ trống và sẽ phải thêm mã để giải quyết những chỗ trống này. Nếu bạn đọc 50 sinh viên từ tối đa 1000 thì bạn sẽ có 950 vị trí mảng chưa sử dụng

Bạn cũng có thể thay đổi kích thước mảng cho từng mục khi nó được thêm vào. Điều này rất không hiệu quả và khá lộn xộn để làm

 

Vì vậy, đối với ví dụ này sử dụng bộ sưu tập sẽ tốt hơn

    ' Declare
    Dim coll As New Collection

    ' Add item - VBA looks after resizing
    coll.Add "Apple"
    coll.Add "Pear"

    ' remove item - VBA looks after resizing
    coll.Remove 1

 

Khi bạn thêm hoặc xóa một mục vào bộ sưu tập, VBA sẽ thực hiện tất cả việc thay đổi kích thước cho bạn. Bạn không phải chỉ định kích thước hoặc phân bổ không gian mới. VBA làm điều đó dưới mui xe. Tất cả những gì bạn phải làm là thêm một mục hoặc xóa mục đó

Tham chiếu cột biến excel

 

Một lợi thế khác của bộ sưu tập

Bộ sưu tập dễ sử dụng hơn nhiều so với mảng, đặc biệt nếu bạn chưa quen với lập trình. Hầu hết thời gian bạn làm ba việc với các bộ sưu tập

  1. Tạo bộ sưu tập
  2. Thêm một số mặt hàng
  3. Đọc qua các mục

 

Vì vậy, nếu bạn không xử lý số lượng mặt hàng lớn hơn thì việc sử dụng Bộ sưu tập có thể gọn gàng hơn nhiều để sử dụng

 

Một bất lợi của bộ sưu tập

Các kiểu dữ liệu cơ bản(i. e. các biến như chuỗi, ngày, dài, tiền tệ, v.v. ) trong Bộ sưu tập ở dạng chỉ đọc. Bạn có thể thêm hoặc xóa một mục nhưng bạn không thể thay đổi giá trị của mục đó. Nếu bạn định thay đổi các giá trị trong một nhóm các mục thì bạn sẽ cần sử dụng một mảng

 

Nếu bạn đang lưu trữ một đối tượng trong Bộ sưu tập thì bạn có thể thay đổi giá trị vì Bộ sưu tập lưu trữ một tham chiếu thay vì đối tượng thực tế

Tham chiếu cột biến excel

 

Bây giờ chúng ta đã biết khi nào và tại sao nên sử dụng một bộ sưu tập, hãy xem cách sử dụng một bộ sưu tập

Bạn có thể tìm hiểu thêm về Bộ sưu tập so với Mảng trong video này…

Cách tạo một bộ sưu tập

Bạn có thể khai báo và tạo trong một dòng như đoạn mã sau

    ' Declare and create
    Dim coll As New Collection

 

Như bạn có thể thấy, bạn không cần chỉ định kích thước. Khi bộ sưu tập của bạn đã được tạo, bạn có thể dễ dàng thêm các mục vào đó

Bạn cũng có thể khai báo và sau đó tạo bộ sưu tập nếu và khi bạn cần

' Declare
Dim coll As Collection

' Create Collection
Set coll = New Collection

 

Sự khác biệt nhỏ giữa các phương pháp này

Sự khác biệt giữa các phương thức này là đối với phương thức đầu tiên, bộ sưu tập luôn được tạo. Đối với phương pháp thứ hai, bộ sưu tập chỉ được tạo khi đạt đến dòng Đặt. Vì vậy, bạn có thể đặt mã để chỉ tạo bộ sưu tập nếu một điều kiện nhất định được đáp ứng

________số 8_______

 

Ưu điểm của việc sử dụng phương pháp này là tối thiểu. Phân bổ bộ nhớ rất quan trọng vào những năm 1990 khi bộ nhớ máy tính bị hạn chế. Trừ khi bạn đang tạo một số lượng lớn bộ sưu tập trên một PC chậm, bạn sẽ không bao giờ nhận thấy bất kỳ lợi ích nào

Sử dụng Đặt có nghĩa là bộ sưu tập sẽ hoạt động khác so với khi bạn đặt bộ sưu tập thành không có gì. Phần tiếp theo giải thích điều này

Hãy xem video dưới đây để tìm hiểu thêm về Bộ sưu tập…

Xóa tất cả các mục khỏi Bộ sưu tập

Bộ sưu tập không có chức năng RemoveAll. Tuy nhiên, để xóa tất cả các mục khỏi bộ sưu tập, bạn chỉ cần đặt nó thành một bộ sưu tập mới

    Set Coll = New Collection.

 

VBA sẽ xóa bộ sưu tập vì chúng tôi không còn tham chiếu đến nó nữa. Khi chúng tôi xóa tất cả các mục, chúng tôi thường muốn sử dụng lại bộ sưu tập, vì vậy chúng tôi sẽ giết hai con chim một cách hiệu quả bằng cách sử dụng phương pháp này

    Dim mark As Long
    mark = sheetMarks.Range("A1")
0

 

Một điều tinh tế cần lưu ý là nếu chúng ta có hai hoặc nhiều biến tham chiếu đến cùng một bộ sưu tập thì nó sẽ không bị xóa (xem )

Trong ví dụ bên dưới, các mục của bộ sưu tập ban đầu không bị xóa vì nó vẫn được tham chiếu bởi coll2

    Dim mark As Long
    mark = sheetMarks.Range("A1")
1

 

Thêm các mục vào Bộ sưu tập

Thật đơn giản để thêm các mục vào bộ sưu tập. Bạn sử dụng thuộc tính add theo sau là giá trị bạn muốn thêm

    Dim mark As Long
    mark = sheetMarks.Range("A1")
2

 

Bạn có thể có bất kỳ loại cơ bản nào trong bộ sưu tập, chẳng hạn như Double

    Dim mark As Long
    mark = sheetMarks.Range("A1")
3

 

Khi bạn thêm các mục theo cách này, chúng sẽ được thêm vào chỉ mục có sẵn tiếp theo. Trong ví dụ về trái cây, Táo được thêm vào vị trí 1 và Lê vào vị trí 2

 

Trước và sau

Bạn có thể sử dụng các tham số Trước hoặc Sau để chỉ định nơi bạn muốn đặt mục trong bộ sưu tập. Lưu ý rằng bạn không thể sử dụng cả hai đối số này cùng một lúc

    Dim mark As Long
    mark = sheetMarks.Range("A1")
4

 

Sau mã này, bộ sưu tập theo thứ tự
1. Chanh vàng
2. Quả táo
3. Lê

 

    Dim mark As Long
    mark = sheetMarks.Range("A1")
5

 

Sau mã này, bộ sưu tập theo thứ tự
1. Quả táo
2. Chanh vàng
3. Lê

 

Truy cập các mục của Bộ sưu tập

Để truy cập các mục của bộ sưu tập, bạn chỉ cần sử dụng chỉ mục. Như chúng ta đã thấy chỉ mục là vị trí của mục trong bộ sưu tập dựa trên thứ tự chúng được thêm vào

Thứ tự cũng có thể được đặt bằng tham số Trước hoặc Sau

    Dim mark As Long
    mark = sheetMarks.Range("A1")
6

 

Bạn cũng có thể sử dụng Thuộc tính vật phẩm để truy cập một vật phẩm trong bộ sưu tập. Đây là phương thức mặc định của bộ sưu tập nên các dòng mã sau đây là tương đương

    Dim mark As Long
    mark = sheetMarks.Range("A1")
7

 

Các mục trong Bộ sưu tập có phải là Chỉ đọc không?

Đây là một điểm rất quan trọng. Khi một loại dữ liệu cơ bản được lưu trữ trong Bộ sưu tập, nó ở chế độ chỉ đọc. Một kiểu dữ liệu cơ bản là một chuỗi, ngày, số nguyên, dài, v.v.

Nếu bạn cố cập nhật một mục Bộ sưu tập, bạn sẽ gặp lỗi. Đoạn mã sau tạo ra lỗi "bắt buộc phải có đối tượng"

    Dim mark As Long
    mark = sheetMarks.Range("A1")
8

 

Tuy nhiên, bạn có thể thay đổi đối tượng lớp được lưu trữ trong Bộ sưu tập

    Dim mark As Long
    mark = sheetMarks.Range("A1")
9

 

Điều này có vẻ giống như hành vi mâu thuẫn, nhưng có một lý do chính đáng. Bất kỳ mục nào được thêm vào Bộ sưu tập đều ở chế độ chỉ đọc. Tuy nhiên, khi bạn thêm một đối tượng vào Bộ sưu tập, đối tượng không được thêm dưới dạng mục. Một biến có địa chỉ bộ nhớ của đối tượng được thêm vào dưới dạng mục

Điều này xảy ra liền mạch để bạn không nhận thấy nó. Biến mục thực sự là chỉ đọc nhưng đối tượng mà nó trỏ tới thì không

Tất cả những gì bạn cần nhớ là các kiểu dữ liệu cơ bản trong Bộ sưu tập là chỉ đọc. Các đối tượng trong Bộ sưu tập có thể được thay đổi

Bạn có thể đọc thêm về các đối tượng trong bộ nhớ

 

Thêm các loại khác nhau

Bạn cũng có thể thêm các loại mục khác nhau vào bộ sưu tập

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
0

 

Điều này hiếm khi cần thiết. Trong VBA, bộ sưu tập Trang tính chứa các trang tính thuộc loại Trang tính và loại Biểu đồ. (Để tạo một bảng Biểu đồ, chỉ cần nhấp chuột phải vào bất kỳ Biểu đồ nào, chọn Di chuyển và chọn nút radio cho Trang tính mới)

Đoạn mã sau hiển thị loại và tên của tất cả các trang tính trong sổ làm việc hiện tại. Lưu ý để truy cập các loại khác nhau, bạn cần Đối với mỗi biến là một biến thể, nếu không bạn sẽ gặp lỗi

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
1

 

Khi bạn truy cập các mục khác nhau, Đối với mỗi biến phải là một biến thể. Nếu không, bạn sẽ gặp lỗi khi truy cập vào một loại khác với loại mà bạn đã khai báo. Nếu chúng ta đã khai báo sh là một trang tính trong ví dụ trên, nó sẽ báo lỗi khi chúng ta cố gắng truy cập một trang tính kiểu Biểu đồ

Rất hiếm khi bạn cần một bộ sưu tập các loại khác nhau nhưng như bạn có thể thấy đôi khi nó có thể hữu ích

 

Thêm mục bằng phím

Bạn cũng có thể thêm các mục bằng một phím như ví dụ tiếp theo cho thấy

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
2

 

Tôi đã bao gồm các tên tham số để làm cho ví dụ trên rõ ràng. Tuy nhiên bạn không cần phải làm điều này. Chỉ cần nhớ khóa là tham số thứ hai và phải là một chuỗi duy nhất

Đoạn mã sau hiển thị ví dụ thứ hai về cách sử dụng các phím

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
3

 

Sử dụng phím có ba lợi thế

  1. Nếu đơn đặt hàng thay đổi, mã của bạn sẽ vẫn truy cập đúng mặt hàng
  2. Bạn có thể truy cập trực tiếp mục mà không cần đọc qua toàn bộ bộ sưu tập
  3. Nó có thể làm cho mã của bạn dễ đọc hơn

 

Trong bộ sưu tập Sổ làm việc VBA, truy cập sổ làm việc theo khóa (tên) sẽ tốt hơn nhiều so với theo chỉ mục. Thứ tự phụ thuộc vào thứ tự chúng được mở và do đó khá ngẫu nhiên

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
4

 

Khi nào nên sử dụng phím

Một ví dụ về thời điểm sử dụng các phím như sau. Hãy tưởng tượng bạn có một bộ ID cho 10.000 sinh viên cùng với điểm của họ

Bạn cũng có một số báo cáo trang tính có danh sách ID sinh viên. Đối với mỗi bảng tính này, bạn cần in dấu cho từng học sinh

Bạn có thể làm điều này bằng cách thêm 10.000 sinh viên vào bộ sưu tập bằng cách sử dụng id sinh viên của họ khi họ nhập khóa. Khi bạn đọc ID từ bảng tính, bạn có thể truy cập trực tiếp vào điểm của học sinh này

Nếu bạn không sử dụng khóa, bạn sẽ phải tìm kiếm trong 10.000 ID cho mỗi ID trên báo cáo

 

Thiếu sót của việc sử dụng khóa trong bộ sưu tập

Có hai thiếu sót của các khóa trong Bộ sưu tập

  1. Bạn không thể kiểm tra xem Key có tồn tại hay không
  2. Bạn không thể cập nhật giá trị được lưu trữ tại Key trừ khi nó là một đối tượng

 

Vấn đề đầu tiên rất dễ giải quyết. Đoạn mã sau kiểm tra xem có tồn tại khóa không

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
5

 

Bạn có thể sử dụng nó như thế này

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
6

 

Vấn đề thứ hai là không thể cập nhật giá trị trong Bộ sưu tập. Tuy nhiên, chúng tôi có thể cập nhật một đối tượng và lý do cho việc này là bộ sưu tập không thực sự lưu trữ đối tượng. Nó lưu trữ địa chỉ của đối tượng

Nếu bạn cần cập nhật một giá trị cơ bản như chuỗi dài, v.v. thì không thể. Bạn phải xóa mục này và thêm mục mới

Nếu bạn muốn sử dụng khóa, có một giải pháp thay thế cho Bộ sưu tập. Bạn có thể sử dụng từ điển. Từ điển cung cấp nhiều chức năng hơn để làm việc với các phím. Bạn có thể kiểm tra xem các khóa có tồn tại hay không, cập nhật các giá trị tại các khóa, nhận danh sách các khóa, v.v.

Hãy xem video này để biết thêm về Dictionary vs Collection…

 

Kiểm tra xem một mục có tồn tại trong Bộ sưu tập không

Không có chức năng tích hợp để kiểm tra xem một mục có tồn tại trong bộ sưu tập hay không. Một cách để làm điều đó là đọc qua tất cả các mục trong bộ sưu tập và kiểm tra từng mục một. Điều này rất không hiệu quả, đặc biệt nếu bạn đang xử lý một tập dữ liệu lớn

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
7

 
Nếu các giá trị trong bộ sưu tập là duy nhất thì chúng ta có thể thêm mục đó làm khóa và sử dụng hàm bên dưới để xem khóa có tồn tại không

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
5

 

    ' Declare a variable for each mark
    Dim mark1 As Long
    Dim mark2 As Long
    .
    .
    .
    Dim mark100 As Long

    ' Store the marks from the worksheet in a variable
    mark1 = sheetMarks.Range("A1")
    mark2 = sheetMarks.Range("A2")
    .
    .
    .
    mark100 = sheetMarks.Range("A100")
9

 

Truy cập tất cả các mục trong Bộ sưu tập

Để truy cập tất cả các mục trong một bộ sưu tập, bạn có thể sử dụng vòng lặp For hoặc vòng lặp For Each. Hãy xem xét những điều này một cách riêng lẻ

 

Sử dụng vòng lặp For

Với Vòng lặp For bình thường, bạn sử dụng chỉ mục để truy cập từng mục. Ví dụ sau in tên của tất cả các sổ làm việc đang mở

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
0

 

Bạn có thể thấy rằng chúng tôi sử dụng phạm vi từ 1 đến Workbooks. Đếm. Mục đầu tiên luôn ở vị trí một và mục cuối cùng luôn ở vị trí được chỉ định bởi thuộc tính Count của bộ sưu tập

Ví dụ tiếp theo in ra tất cả các mục trong bộ sưu tập do người dùng tạo

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
1

 

Sử dụng For Each

Vòng lặp For Each là vòng lặp chuyên dụng được sử dụng cho Bộ sưu tập. Nó không sử dụng chỉ mục và định dạng được hiển thị trong ví dụ sau

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
2

 

Định dạng của vòng lặp For là
Đối với tôi = 1 Để Coll. Đếm
Kế tiếp

nơi tôi là một dài và Coll là một bộ sưu tập

 

Định dạng của For Each Loop là
Cho Mỗi var Trong Coll
Kế tiếp

trong đó var là một biến thể và Coll là một bộ sưu tập

Để truy cập từng mục
Dành cho . Thu thập(i)
Cho mỗi . biến

 

Ví dụ sau hiển thị các vòng lặp cạnh nhau cho ví dụ về bộ sưu tập người dùng ở trên

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
3

 

Cho Mỗi So Với Cho

Điều quan trọng là phải hiểu sự khác biệt giữa hai vòng lặp

Vòng lặp Cho mỗi Loop

  • nhanh hơn
  • viết gọn gàng hơn
  • chỉ có một đơn đặt hàng – chỉ số thấp đến cao

Vòng lặp For

  • chậm hơn
  • viết ít gọn gàng hơn
  • có thể truy cập theo thứ tự khác nhau

Hãy so sánh các vòng lặp trong từng thuộc tính này

 

Tốc độ

For Each được coi là nhanh hơn For Loop. Ngày nay, đây chỉ là vấn đề nếu bạn có một bộ sưu tập lớn và/hoặc PC/Mạng chậm

 

Gọn gàng hơn

Vòng lặp For Each dễ viết hơn, đặc biệt nếu bạn đang sử dụng các vòng lặp lồng nhau. So sánh các vòng lặp sau. Cả hai đều in tên của tất cả các trang tính trong sổ làm việc đang mở

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
4

Vòng lặp For Each viết gọn gàng hơn và ít có khả năng xảy ra lỗi hơn

 

Gọi món

Thứ tự của vòng lặp For Each luôn từ chỉ số thấp nhất đến cao nhất. Nếu bạn muốn lấy một đơn hàng khác thì bạn cần sử dụng Vòng lặp For. Thứ tự của vòng lặp For có thể được thay đổi. Bạn có thể đọc các mục ngược lại. Bạn có thể đọc một phần của các mục hoặc bạn có thể đọc từng mục thứ hai

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
5

 

Vòng lặp For giúp linh hoạt hơn ở đây nhưng thực tế là hầu hết thời gian bạn chỉ cần thứ tự cơ bản

Bạn có thể tìm hiểu thêm về For Loops trong video bên dưới…

 

Sắp xếp một bộ sưu tập

Không có sắp xếp tích hợp cho bộ sưu tập VBA. Tuy nhiên, chúng ta có thể sử dụng QuickSort này

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
6

 

Bạn có thể sử dụng nó như thế này

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
7

 

Sử dụng Bộ sưu tập với Chức năng và Phụ

Sử dụng Bộ sưu tập làm tham số hoặc giá trị trả về rất dễ thực hiện. Chúng ta sẽ xem xét chúng lần lượt

 

Truyền Bộ sưu tập cho Phụ/Chức năng

Thật đơn giản để chuyển một bộ sưu tập cho một chức năng hoặc phụ. Nó được truyền giống như bất kỳ tham số nào như ví dụ mã sau đây cho thấy

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
8

 

Bạn có thể thấy mức độ hữu ích của PrintColl phụ trong ví dụ. Nó sẽ in tất cả các phần tử của BẤT KỲ bộ sưu tập nào. Kích thước hoặc loại phần tử không quan trọng. Điều này cho thấy cách sử dụng các bộ sưu tập linh hoạt

 

Vượt qua ByVal so với ByRef

Một điểm tinh tế cần lưu ý ở đây là chuyển theo giá trị(By Val) và chuyển theo tham chiếu(ByRef) hơi khác nhau

Đối với một biến đơn giản chuyển theo giá trị có nghĩa là một bản sao được tạo. Điều này có nghĩa là nếu Hàm/Phụ thay đổi thì giá trị sẽ không bị thay đổi khi bạn quay lại quy trình gọi

 

Trong ví dụ sau, chúng tôi vượt qua tổng số bằng cách sử dụng cả ByVal và ByRef. Bạn có thể thấy rằng sau khi chúng tôi sử dụng ByRef, giá trị đã thay đổi trong quy trình gọi

    ' Create collection
    Dim collMarks As New Collection

    ' Read 100 values to collection
    Dim c As Range
    For Each c In Sheet1.Range("A1:A100")
        ' This line is used to add all the values
        collMarks.Add c.Value
    Next
9

 

Sử dụng ByVal và ByRef với Bộ sưu tập hơi khác một chút. Nếu bạn thêm hoặc xóa mục thì bộ sưu tập trong trình gọi ban đầu cũng sẽ bị thay đổi. Vì vậy, Subs trong ví dụ sau sẽ xóa cả mục đầu tiên của bộ sưu tập ban đầu

    ' Get last row - this is the number of students
    Dim lStudentCount As Long
    lStudentCount = Sheet1.Range("A" & Rows.Count).End(xlUp).Row

    ' Create array of correct size
    Dim arr() As Long
    ReDim arr(1 To lStudentCount)
0

 

Lý do cho điều này là một biến Bộ sưu tập chứa một con trỏ. Điều này có nghĩa là nó chứa địa chỉ của bộ sưu tập chứ không phải bộ sưu tập thực tế. Vì vậy, khi bạn thêm hoặc xóa một mục, bạn đang thay đổi con trỏ đang trỏ tới chứ không phải chính con trỏ. Tuy nhiên, nếu bạn thay đổi con trỏ, nó sẽ bị thay đổi bên ngoài sub

Bạn không cần phải lo lắng về con trỏ. Tất cả những gì bạn cần biết là điều này ảnh hưởng như thế nào đến hành vi truyền tham số. Nếu bạn đặt tham số bộ sưu tập thành không có gì thì hành vi sẽ phụ thuộc vào việc bạn đã sử dụng ByRef hay ByVal

  • Sử dụng ByRef sẽ đặt lại bộ sưu tập ban đầu
  • Sử dụng ByVal sẽ không thay đổi bộ sưu tập gốc

 

    ' Get last row - this is the number of students
    Dim lStudentCount As Long
    lStudentCount = Sheet1.Range("A" & Rows.Count).End(xlUp).Row

    ' Create array of correct size
    Dim arr() As Long
    ReDim arr(1 To lStudentCount)
1

 

Trả về một bộ sưu tập từ một chức năng

Trả về một bộ sưu tập từ một Hàm cũng giống như trả về bất kỳ đối tượng nào. Bạn cần sử dụng từ khóa Set. Trong ví dụ sau, bạn có thể xem cách trả lại một bộ sưu tập

    ' Get last row - this is the number of students
    Dim lStudentCount As Long
    lStudentCount = Sheet1.Range("A" & Rows.Count).End(xlUp).Row

    ' Create array of correct size
    Dim arr() As Long
    ReDim arr(1 To lStudentCount)
2

Ghi chú. rằng bạn không sử dụng từ khóa Mới khi khai báo bộ sưu tập trong FruitReport() phụ. Điều này là do bộ sưu tập được tạo trong CreateCollection(). Khi bạn trả lại bộ sưu tập, bạn chỉ cần gán biến bộ sưu tập để trỏ đến bộ sưu tập này

 

Ví dụ – Đọc từ một trang tính

Chúng ta hãy xem một ví dụ về cách sử dụng Bộ sưu tập với một trang tính

Chúng tôi sử dụng dữ liệu này

Tham chiếu cột biến excel

điểm học sinh

Người dùng chọn chủ đề tại ô B2

Tham chiếu cột biến excel

Trong ví dụ này, chúng ta đọc qua danh sách sinh viên. Bất kỳ sinh viên nào đang học môn học được liệt kê trong ô B2 sẽ được thêm vào bộ sưu tập

Sau đó, chúng tôi viết kết quả vào trang tính từ ô F5 trở đi

Bạn có thể tải xuống ví dụ dưới đây như một phần của mã nguồn cho bài đăng này

Mã ở đây

    ' Get last row - this is the number of students
    Dim lStudentCount As Long
    lStudentCount = Sheet1.Range("A" & Rows.Count).End(xlUp).Row

    ' Create array of correct size
    Dim arr() As Long
    ReDim arr(1 To lStudentCount)
3

 

Bạn có thể xem video bên dưới để biết thêm về cách đọc giữa Bộ sưu tập và Trang tính…

 

Phần kết luận

Bộ sưu tập là một phần rất hữu ích của VBA. Có nhiều cách dễ sử dụng hơn Mảng và rất hữu ích khi bạn thực hiện nhiều thao tác thêm và xóa mục. Họ chỉ có bốn thuộc tính. Thêm, xóa, đếm và mục. Điều này làm cho họ rất dễ dàng để làm chủ

Các điểm chính của bài đăng này là

  1. Bộ sưu tập là một cách lưu trữ một nhóm các mục cùng nhau
  2. VBA có các bộ sưu tập riêng như Workbooks, Worksheets và Cells
  3. Các mặt hàng không nhất thiết phải cùng loại nhưng thông thường chúng. Bộ sưu tập Trang tính VBA có thể chứa cả trang tính và biểu đồ
  4. Một bộ sưu tập giúp dễ dàng thực hiện cùng một tác vụ trên nhiều mục e. g. in tất cả các giá trị
  5. Bộ sưu tập tương tự như mảng vì cả hai đều lưu trữ các nhóm mặt hàng giống nhau
  6. Bộ sưu tập tốt hơn khi thêm và xóa nhiều mục
  7. Bộ sưu tập sử dụng đơn giản hơn mảng
  8. Mảng hữu ích hơn khi số lượng mục cố định
  9. Mảng hiệu quả hơn khi
  10. Các kiểu dữ liệu cơ bản(i. e. không phải đối tượng) trong Bộ sưu tập là chỉ đọc trong khi mảng được đọc/ghi
  11. Bạn có thể tạo bộ sưu tập chỉ sử dụng Dim hoặc Dim with Set
  12. Bạn có thể xóa toàn bộ bộ sưu tập bằng cách đặt thành Không có gì. Điều này phụ thuộc vào cách nó được tạo ra (xem điểm cuối cùng)
  13. Bạn có thể thêm các mục vào một vị trí cụ thể trong bộ sưu tập bằng cách sử dụng các đối số Trước và Sau với chức năng Thêm bộ sưu tập
  14. Bạn có thể sử dụng Chìa khóa với bộ sưu tập để truy cập trực tiếp vào một mục. Bộ sưu tập không hỗ trợ tốt cho các khóa, vì vậy tốt hơn hết bạn nên sử dụng bộ sưu tập Từ điển khi bạn cần sử dụng Khóa
  15. Bạn có thể sử dụng các vòng lặp For và For Each để truy cập tất cả các mục trong bộ sưu tập. Vòng lặp For Each hiệu quả hơn nhưng chỉ cho phép bạn xem qua bộ sưu tập theo một thứ tự
  16. Bạn có thể dễ dàng chuyển một bộ sưu tập làm đối số cho Hàm hoặc Phụ
  17. Bạn có thể  dễ dàng trả về một bộ sưu tập từ một Hàm

 

Cái gì tiếp theo?

Hướng dẫn VBA miễn phí Nếu bạn là người mới sử dụng VBA hoặc bạn muốn nâng cao các kỹ năng VBA hiện tại của mình thì tại sao không thử Hướng dẫn VBA cơ bản

đào tạo liên quan. Nhận toàn quyền truy cập vào các hội thảo trực tuyến về đào tạo VBA của Excel và tất cả các hướng dẫn

(GHI CHÚ. Lập kế hoạch xây dựng hoặc quản lý Ứng dụng VBA? . )