Validation-Giá trị liền trước liền sau

Liên hệ QC

emgaingayngo

Thành viên hoạt động
Tham gia
9/2/07
Bài viết
141
Được thích
5
Xin các cao thủ giúp đỡ:
Trong VBA mình dùng câu lệnh gì để lấy được giá trị liền trước (hoặc liền sau) so với giá trị hiện hành của List of Validation?
 
emgaingayngo đã viết:
Xin các cao thủ giúp đỡ:
Trong VBA mình dùng câu lệnh gì để lấy được giá trị liền trước (hoặc liền sau) so với giá trị hiện hành của List of Validation?

Bạn dùng hàm match lấy thứ tự của ô đó trong dãy (List), sau đó cộng hoặc trừ cho 1

Thân!
 
Upvote 0
Mình đã làm như sau :
Private Sub cmdGiam_Click()
Dim rng as range, bigrng As Range, val As Integer
'Set rng = Range("ChonNgay")
Set bigrng = S02.Range(Cells(22, 1), Cells(22, 256))
val = WorksheetFunction.Match(S02.Range("ChonNgay").Value, bigrng, 0)
val = val - 1
End Sub

nhưng bị báo lỗi :
"unable to get the Match property of the WorksheetFunction class"
 
Lần chỉnh sửa cuối:
Upvote 0
emgaingayngo đã viết:
Xin các cao thủ giúp đỡ:
Trong VBA mình dùng câu lệnh gì để lấy được giá trị liền trước (hoặc liền sau) so với giá trị hiện hành của List of Validation?
Để có thể dùng VBA lấy giá trị liền trước, liền sau của 1 list (danh sách) các ô so với 1 giá trị trong list bất kỳ (list gán trong Source của Data Validation thực chất cũng chỉ là một vùng danh sách mà số cột=1).
Để viết câu lệnh đơn giản và mang tính tổng quát, bạn nên đặt tên name cho list (Insert > Name > Define…). Đối tượng Range(name) trong VBA sẽ tự xác định cho ta biết dòng đầu, dòng cuối, cột của list trong bảng tính.
Thủ tục ListUpDown dưới đây mang tính tổng quát, cho ta biết giá trị ô đang chọn, giá trị trước, giá trị đang chọn và giá trị sau trong list có số cột=1.

Trong tập tin minh họa ListUpDown.xls này, tôi đặt tên name danh sách “A”, “B”, “C”, …, “J” (vùng A1:A10) là “List”. Các biến trong ListUpDown có ý nghĩa như sau (trong cặp móc vuông [ ] là câu lệnh để VBA gán giá trị cho các biến):

rdau: dòng đầu tiên của “List” [rdau = Range("List").Row]

rcuoi: dòng cuối cùng của “List” [rcuoi = Range("List").Rows.Count + rdau – 1]

c: số thứ tự cột của “List” [c = Range("List").Column]

chon: giá trị của ô đang chọn [chon = ActiveCell.Value]

r1: dòng chứa giá trị chon (ô đang chọn) tìm bằng lệnh Find
[r1 = Range("List").Find(What:=chon, After:=Cells(rdau, c)).Row]

up: giá trị liền trước trong danh sách “List” so với chon. Nếu giá trị chon ở đầu “List” thì up sẽ là chuỗi thông báo “ngoai danh sach” (ngoài danh sách)
[If r1 = rdau Then up = "ngoai danh sach" Else up = Cells(r1 - 1, c)]

down: giá trị liền sau trong danh sách “List” so với chon. Nếu giá trị chon ở cuối “List” thì down sẽ là chuỗi thông báo “ngoai danh sach”
[If r1 = rcuoi Then down = "khong co" Else down = Cells(r1 + 1, c)]

Hiện hộp thoại báo kết quả [MsgBox "truoc=" & up & " chon=" & chon & " sau=" & down]
Ví dụ ô đang chọn có giá trị ”C” sẽ hiện hộp thoại có nội dung "truoc=B chon=C sau=D”

Để phòng ngừa ô đang chọn có giá trị không nằm trong danh sách, câu lệnh [On Error GoTo baoloi] buộc thủ tục phải nhảy xuống nhản [baoloi:] khi lệnh Find không xác định được r1 và MsgBox sẽ hiện thông báo "khong tim thay [ AAA ] trong danh sach!"
[baoloi:
MsgBox "khong tim thay [ " & chon & " ] trong danh sach!"]

‘===================
Sub ListUpDown()
On Error GoTo baoloi
rdau = Range("List").Row
rcuoi = Range("List").Rows.Count + rdau - 1
c = Range("List").Column
chon = ActiveCell.Value
r1 = Range("List").Find(What:=chon, After:=Cells(rdau, c)).Row
If r1 = rdau Then up = "ngoai danh sach" Else up = Cells(r1 - 1, c)
If r1 = rcuoi Then down = "ngoai danh sach" Else down = Cells(r1 + 1, c)
MsgBox "Up=" & up & " chon=" & chon & " Down=" & down
Exit Sub
baoloi:
MsgBox "khong tim thay [ " & chon & " ] trong danh sach!"
End Sub
 

File đính kèm

  • ListUpDown.zip
    8.2 KB · Đọc: 107
Upvote 0
Web KT
Back
Top Bottom