Cách tạo danh sách thả xuống trong Excel với nhiều lựa chọn

Chuyên Lắp Ráp, Cài Đặt Bộ Máy Tính Cho Văn Phòng, Gamer, Đồ Họa Cao Chuyên Lắp Ráp, Cài Đặt Bộ Máy Tính Cho Văn Phòng, Gamer, Đồ Họa Cao Chuyên Lắp Ráp, Cài Đặt Bộ Máy Tính Cho Văn Phòng, Gamer, Đồ Họa Cao

Cách tạo danh sách thả xuống trong Excel với nhiều lựa chọn

09:27:42 05-06-2024 | Lượt xem: 3142

Bài viết hướng dẫn cách tạo menu thả xuống Excel cho phép người dùng chọn nhiều mục có hoặc không trùng lặp.

Excel đã đi được một chặng đường dài kể từ khi ra đời và ngày càng giới thiệu nhiều tính năng hữu ích hơn với mỗi bản phát hành mới. Trong Excel 365, họ đã thêm khả năng tìm kiếm trong danh sách xác thực dữ liệu, giúp tiết kiệm thời gian rất nhiều khi làm việc với tập hợp dữ liệu lớn. Tuy nhiên, ngay cả với tùy chọn mới này, Excel sẵn có vẫn chỉ cho phép chọn một mục từ danh sách tùy chọn được xác định trước. Nhưng đừng sợ, vì đã có giải pháp. Bằng cách sử dụng VBA, bạn có thể tạo danh sách thả xuống với nhiều lựa chọn. Với khả năng ngăn chặn trùng lặp và xóa các mục không chính xác, tính năng này có thể hợp lý hóa việc nhập dữ liệu và cải thiện độ chính xác trong bảng tính Excel của bạn.

Cách làm thả xuống Excel với nhiều lựa chọn

Tạo danh sách thả xuống nhiều lựa chọn trong Excel là một quá trình gồm hai phần:

1. Đầu tiên, bạn tạo danh sách xác thực dữ liệu thông thường trong một hoặc nhiều ô.

2. Sau đó, chèn mã VBA vào cuối bảng tính đích.

Nó cũng hoạt động theo thứ tự ngược lại :)

Tạo danh sách thả xuống bình thường

Để chèn danh sách thả xuống trong Excel, bạn sử dụng tính năng Data Validation. Các bước hơi khác nhau tùy thuộc vào việc các mục nguồn nằm trong phạm vi thông thường, phạm vi được đặt tên hay bảng Excel.

Tùy chọn tốt nhất là tạo danh sách xác thực dữ liệu từ một bảng. Vì các bảng Excel có tính chất động nên một danh sách thả xuống có liên quan sẽ tự động mở rộng hoặc thu gọn khi bạn thêm hoặc xóa các mục vào/khỏi bảng.

Trong ví dụ này, chúng ta sẽ sử dụng bảng có tên đơn giản Table1 , nằm trong A2:A25 trong ảnh chụp màn hình bên dưới. Để tạo danh sách chọn từ bảng này, các bước là:

1. Chọn một hoặc nhiều ô cho danh sách thả xuống của bạn (D3:D7 trong trường hợp này).

2. Trên tab Data, trong nhóm Data Tools, bấm vào Data Validation.

3. Trong hộp thả xuống Allow, chọn List.

4. Trong hộp Source, nhập công thức tham chiếu gián tiếp đến cột của Table1 có tên Items.
=INDIRECT("Table1[Items]")

5. Khi hoàn tất, hãy nhấp vào OK.

Tạo danh sách xác thực dữ liệu từ một bảng

Chèn mã VBA để cho phép nhiều lựa chọn

Để thêm mã VBA vào bảng tính của bạn, hãy làm theo các bước sau:

1. Mở Trình soạn thảo Visual Basic bằng cách nhấn Alt + F11 hoặc nhấp vào tab Developer > Visual Basic. Nếu bạn không có tab này trên ribbon Excel, hãy xem cách thêm tab Developer.

2. Trong ngăn Project Explorer ở bên trái, bấm đúp vào tên trang tính chứa danh sách thả xuống của bạn. Thao tác này sẽ mở cửa sổ Mã cho trang tính đó.
Hoặc bạn có thể nhấp chuột phải vào tab của trang tính và chọn Mã xem từ menu ngữ cảnh. Thao tác này sẽ mở ngay cửa sổ Mã cho một trang nhất định.

3. Trong cửa sổ Mã, dán mã VBA.

4. Đóng VB Editor và lưu tệp của bạn dưới dạng Sổ làm việc hỗ trợ macro (.xlsm).

Chèn mã VBA để cho phép nhiều lựa chọn

Khi bạn quay lại bảng tính, danh sách thả xuống sẽ cho phép bạn chọn nhiều mục:

Danh sách thả xuống sẽ cho phép bạn chọn nhiều mục

Mã VBA để chọn nhiều mục trong danh sách thả xuống

Dưới đây là mã để tạo danh sách xác thực dữ liệu cho phép chọn nhiều mục, bao gồm các lựa chọn lặp lại:

Mã VBA để chọn nhiều mục trong danh sách thả xuống của Excel

Option Explicit

Private Sub Worksheet_Change(ByVal Destination As Range)

Dim DelimiterType As String

Dim rngDropdown As Range

Dim oldValue As String

Dim newValue As String

DelimiterType = ", "

If Destination.Count > 1 Then Exit Sub

On Error Resume Next

Set rngDropdown = Cells.SpecialCells(xlCellTypeAllValidation)

On Error GoTo exitError

If rngDropdown Is Nothing Then GoTo exitError

If Intersect(Destination, rngDropdown) Is Nothing Then

'do nothing

Else

Application.EnableEvents = False

newValue = Destination.Value

Application.Undo

oldValue = Destination.Value

Destination.Value = newValue

If oldValue = "" Then

'do nothing

Else

If newValue = "" Then

'do nothing

Else

Destination.Value = oldValue & DelimiterType & newValue

' add new value with delimiter

End If

End If

End If

exitError:

Application.EnableEvents = True

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Cách mã này hoạt động:

  • Mã cho phép nhiều lựa chọn trong tất cả các danh sách thả xuống trên một trang cụ thể. Bạn không cần chỉ định tham chiếu ô hoặc phạm vi mục tiêu trong mã.

  • Mã này dành riêng cho trang tính, vì vậy hãy nhớ thêm mã này vào từng trang tính mà bạn muốn cho phép nhiều lựa chọn trong danh sách thả xuống.

  • Mã này cho phép lặp lại, tức là chọn cùng một mục nhiều lần.

  • Các mục đã chọn được phân tách bằng dấu phẩy và dấu cách. Để thay đổi dấu phân cách, hãy thay thế ", " bằng ký tự bạn muốn trong DelimiterType = ", " (dòng 7 trong đoạn mã trên).

Danh sách thả xuống nhiều lựa chọn của Excel mà không trùng lặp

Khi chọn từ một danh sách lớn, người dùng đôi khi có thể chọn cùng một mục nhiều lần mà không nhận thấy. Mã bên dưới giải quyết vấn đề trùng lặp trong danh sách thả xuống xác thực dữ liệu có nhiều lựa chọn. Nó cho phép người dùng chọn một mục cụ thể chỉ một lần. Nếu bạn cố gắng chọn lại cùng một mục, sẽ không có gì xảy ra. Khá tuyệt phải không?

Mã VBA để tạo danh sách thả xuống nhiều lựa chọn mà không lặp lại

Option Explicit

Private Sub Worksheet_Change(ByVal Destination As Range)

Dim rngDropdown As Range

Dim oldValue As String

Dim newValue As String

Dim DelimiterType As String

DelimiterType = ", "

If Destination.Count > 1 Then Exit Sub

On Error Resume Next

Set rngDropdown = Cells.SpecialCells(xlCellTypeAllValidation)

On Error GoTo exitError

If rngDropdown Is Nothing Then GoTo exitError

If Intersect(Destination, rngDropdown) Is Nothing Then

'do nothing

Else

Application.EnableEvents = False

newValue = Destination.Value

Application.Undo

oldValue = Destination.Value

Destination.Value = newValue

If oldValue <> "" Then

If newValue <> "" Then

If oldValue = newValue Or _

InStr(1, oldValue, DelimiterType & newValue) Or _

InStr(1, oldValue, newValue & Replace(DelimiterType, " ", "")) Then

Destination.Value = oldValue

Else

Destination.Value = oldValue & DelimiterType & newValue

End If

End If

End If

End If

exitError:

Application.EnableEvents = True

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Menu thả xuống nhiều lựa chọn với việc loại bỏ mục

Khi người dùng cần chọn nhiều tùy chọn nhưng có thể mắc lỗi hoặc thay đổi ý định trong quá trình lựa chọn, danh sách thả xuống nhiều lựa chọn cho phép loại bỏ các mục không chính xác có thể là cứu cánh.

Hãy xem xét một tình huống trong đó bạn cần phân công nhiều nhiệm vụ cho các thành viên trong nhóm bằng danh sách thả xuống. Với chức năng mặc định của Excel, cách duy nhất để loại bỏ nhiệm vụ được giao không chính xác là xóa toàn bộ nội dung của ô và bắt đầu lại. Với khả năng xóa từng mục khỏi vùng chọn, nhóm có thể dễ dàng sửa đổi nhiệm vụ được giao mà không nhầm lẫn hoặc mắc lỗi.

Mã bên dưới triển khai chức năng xóa mục theo cách đơn giản và trực quan: lần nhấp đầu tiên vào một mục sẽ thêm mục đó vào vùng chọn và lần nhấp thứ hai vào cùng mục đó sẽ xóa mục đó khỏi vùng chọn.

Mã VBA để tạo menu thả xuống nhiều lựa chọn cho phép xóa các mục đã chọn

Option Explicit

Private Sub Worksheet_Change(ByVal Destination As Range)

Dim rngDropdown As Range

Dim oldValue As String

Dim newValue As String

Dim DelimiterType As String

DelimiterType = ", "

Dim DelimiterCount As Integer

Dim TargetType As Integer

Dim i As Integer

Dim arr() As String

If Destination.Count > 1 Then Exit Sub

On Error Resume Next

Set rngDropdown = Cells.SpecialCells(xlCellTypeAllValidation)

On Error GoTo exitError

If rngDropdown Is Nothing Then GoTo exitError

TargetType = 0

TargetType = Destination.Validation.Type

If TargetType = 3 Then ' is validation type is "list"

Application.ScreenUpdating = False

Application.EnableEvents = False

newValue = Destination.Value

Application.Undo

oldValue = Destination.Value

Destination.Value = newValue

If oldValue <> "" Then

If newValue <> "" Then

If oldValue = newValue Or oldValue = newValue & Replace(DelimiterType, " ", "") Or oldValue = newValue & DelimiterType Then ' leave the value if there is only one in the list

oldValue = Replace(oldValue, DelimiterType, "")

oldValue = Replace(oldValue, Replace(DelimiterType, " ", ""), "")

Destination.Value = oldValue

ElseIf InStr(1, oldValue, DelimiterType & newValue) Or InStr(1, oldValue, newValue & DelimiterType) Or InStr(1, oldValue, DelimiterType & newValue & DelimiterType) Then

arr = Split(oldValue, DelimiterType)

If Not IsError(Application.Match(newValue, arr, 0)) = 0 Then

Destination.Value = oldValue & DelimiterType & newValue

Else:

Destination.Value = ""

For i = 0 To UBound(arr)

If arr(i) <> newValue Then

Destination.Value = Destination.Value & arr(i) & DelimiterType

End If

Next i

Destination.Value = Left(Destination.Value, Len(Destination.Value) - Len(DelimiterType))

End If

ElseIf InStr(1, oldValue, newValue & Replace(DelimiterType, " ", "")) Then

oldValue = Replace(oldValue, newValue, "")

Destination.Value = oldValue

Else

Destination.Value = oldValue & DelimiterType & newValue

End If

Destination.Value = Replace(Destination.Value, Replace(DelimiterType, " ", "") & Replace(DelimiterType, " ", ""), Replace(DelimiterType, " ", "")) ' remove extra commas and spaces

Destination.Value = Replace(Destination.Value, DelimiterType & Replace(DelimiterType, " ", ""), Replace(DelimiterType, " ", ""))

If Destination.Value <> "" Then

If Right(Destination.Value, 2) = DelimiterType Then ' remove delimiter at the end

Destination.Value = Left(Destination.Value, Len(Destination.Value) - 2)

End If

End If

If InStr(1, Destination.Value, DelimiterType) = 1 Then ' remove delimiter as first characters

Destination.Value = Replace(Destination.Value, DelimiterType, "", 1, 1)

End If

If InStr(1, Destination.Value, Replace(DelimiterType, " ", "")) = 1 Then

Destination.Value = Replace(Destination.Value, Replace(DelimiterType, " ", ""), "", 1, 1)

End If

DelimiterCount = 0

For i = 1 To Len(Destination.Value)

If InStr(i, Destination.Value, Replace(DelimiterType, " ", "")) Then

DelimiterCount = DelimiterCount + 1

End If

Next i

If DelimiterCount = 1 Then ' remove delimiter if last character

Destination.Value = Replace(Destination.Value, DelimiterType, "")

Destination.Value = Replace(Destination.Value, Replace(DelimiterType, " ", ""), "")

End If

End If

End If

Application.EnableEvents = True

Application.ScreenUpdating = True

End If

exitError:

Application.EnableEvents = True

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Bản demo bên dưới nêu bật cách hoạt động của danh sách thả xuống nhiều lựa chọn với chức năng loại bỏ trong Excel. Người dùng có thể chọn nhiều tùy chọn từ danh sách xác thực dữ liệu và thực hiện điều chỉnh nhanh chóng. Một cách tiếp cận hợp lý và hiệu quả để quản lý các lựa chọn!

Bản demo  nêu bật cách hoạt động của danh sách thả xuống

Cách tạo danh sách thả xuống nhiều lựa chọn bằng dấu phân cách tùy chỉnh

Ký tự phân tách các mục trong vùng chọn được đặt trong tham số DelimiterType. Trong tất cả các mã, giá trị mặc định của tham số này là ", " (dấu phẩy và dấu cách) và nó nằm ở dòng 7. Để sử dụng dấu phân cách khác, bạn có thể thay thế "," bằng ký tự mong muốn. Ví dụ:

  • Để phân tách các mục đã chọn bằng dấu cách, hãy sử dụng DelimiterType=" ".

  • Để phân tách bằng dấu chấm phẩy, hãy sử dụng DelimiterType=";" hoặc DelimiterType=";" (có hoặc không có khoảng trắng tương ứng).

  • Để phân tách bằng thanh dọc, hãy sử dụng DelimiterType=" |".

Ví dụ: nếu bạn thay đổi dấu phân cách thành dấu gạch chéo dọc, danh sách chọn nhiều lựa chọn của bạn sẽ trông như sau:

Cách tạo danh sách thả xuống nhiều lựa chọn bằng dấu phân cách tùy chỉnh

Cách tạo danh sách thả xuống với nhiều lựa chọn trong các dòng riêng biệt

Để có được mỗi lựa chọn trong một dòng riêng biệt trong cùng một ô, hãy đặt DelimiterType thành Vbcrlf. Trong VBA, nó là một hằng số cho các ký tự xuống dòng và ký tự xuống dòng.

Chính xác hơn, bạn thay đổi dòng mã này:

DelimiterType = ","

đến cái này:

DelimiterType = vbCrLf

Kết quả là mỗi mục bạn chọn từ danh sách thả xuống sẽ xuất hiện trong một dòng mới:

Cách tạo danh sách thả xuống với nhiều lựa chọn trong các dòng riêng biệt

Cách tạo danh sách thả xuống nhiều lựa chọn cho các cột, hàng, ô và phạm vi cụ thể

Tất cả các mã được mô tả trong hướng dẫn này đều hoạt động trên toàn bộ trang tính. Tuy nhiên, bạn có thể dễ dàng sửa đổi bất kỳ mã nào để nó chỉ áp dụng cho các ô, hàng hoặc cột cụ thể nếu cần. Đối với điều này, hãy tìm dòng mã này:

If rngDropdown Is Nothing Then GoTo exitError

Thêm ngay sau nó, thêm một dòng mới chỉ định nơi cho phép nhiều lựa chọn, như được giải thích trong các ví dụ bên dưới.

Trình đơn thả xuống nhiều lựa chọn cho các cột cụ thể

Để cho phép chọn nhiều mục trong một cột nhất định , hãy thêm mã này:

If Not Destination.Column = 4 Then GoTo exitError

Trong đó "4" là số cột mục tiêu. Trong trường hợp này, danh sách thả xuống nhiều lựa chọn sẽ chỉ được bật trong cột D. Trong tất cả các cột khác, danh sách thả xuống sẽ bị giới hạn ở một lựa chọn duy nhất.

Để nhắm mục tiêu một số cột, hãy chỉ định số của chúng bằng mã này:

If Destination.Column <> 4 And Destination.Column <> 6 Then GoTo exitError

Trong trường hợp này, danh sách thả xuống nhiều lựa chọn sẽ có sẵn trong cột D (4) và F (6).

Danh sách thả xuống nhiều lựa chọn cho một số hàng nhất định

Để chèn nhiều danh sách thả xuống vào một hàng cụ thể, hãy sử dụng mã này:

If Not Destination.Row = 3 Then GoTo exitError

Trong ví dụ này, hãy thay thế "3" bằng số hàng mà bạn muốn bật danh sách thả xuống có nhiều lựa chọn.

Để nhắm mục tiêu nhiều hàng , mã như sau:

If Destination.Row <> 3 And Destination.Row <> 5 Then GoTo exitError

Trong đó "3" và "5" là các hàng được phép chọn nhiều mục.

Nhiều lựa chọn trong các ô cụ thể

Để bật nhiều lựa chọn trong các ô cụ thể , hãy thêm một trong các dòng mã bên dưới.

Đối với một ô duy nhất:

If Not Destination.Address = "$D$3" Then GoTo exitError

Đối với nhiều ô:

If Destination.Address <> "$D$3" And Destination.Address <> "$F$6" Then GoTo exitError

Chỉ cần nhớ thay thế "$D$3" và "$F$6" bằng địa chỉ của các ô mục tiêu của bạn.

Trình đơn thả xuống nhiều lựa chọn cho phạm vi cụ thể

Để giới hạn danh sách thả xuống nhiều lựa chọn của bạn trong một phạm vi cụ thể, hãy thay thế dòng mã này:

If Intersect(Destination, rngDropdown) Is Nothing Then

với cái này:

If Intersect(ActiveCell, Range("C3:D10")) Is Nothing Or Intersect(Destination, rngDropdown) Is Nothing Then

Phạm vi quan tâm được chỉ định trực tiếp trong mã (C3:D10 trong ví dụ trên). Sửa đổi này cung cấp một cách tiếp cận hiệu quả hơn để bàn giao phạm vi - thay vì liệt kê riêng lẻ 16 ô, bạn sử dụng một tham chiếu phạm vi duy nhất.

Cách bật chức năng đa lựa chọn trong trang được bảo vệ

Để bật chức năng thả xuống nhiều lựa chọn trong trang tính được bảo vệ, chỉ cần chèn mã sau vào trang tính nơi bạn đã thêm mã chính.

Mã VBA để cho phép nhiều lựa chọn trong trang được bảo vệ

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

ActiveSheet.Unprotect password:="password"

On Error GoTo exitError2

If Target.Validation.Type = 3 Then

Else

ActiveSheet.Protect password:="password"

End If

Done:

Exit Sub

exitError2:

ActiveSheet.Protect password:="password"

End Sub

Trước khi thêm mã này vào trang tính của bạn, hãy nhớ thay "mật khẩu" bằng mật khẩu thực tế bạn đã sử dụng để bảo vệ trang tính. Và đây là thay đổi duy nhất cần được thực hiện. Mã sẽ tự động phát hiện sự hiện diện của danh sách thả xuống trong một ô nhất định và cho phép chỉnh sửa ô đó. Trong tất cả các ô khác, việc chỉnh sửa sẽ vẫn bị hạn chế.

Vậy là bạn đã có nó - một danh sách thả xuống Excel với nhiều lựa chọn. Việc thêm tính năng tuyệt vời này vào bảng tính của bạn sẽ tăng độ chính xác của dữ liệu đầu vào và giúp bạn hoàn thành công việc nhanh hơn!

Đối tác của chúng tôi

0984 741 740