Kiểm tra một giá trị có sẵn xem có tồn tại trong một tập hợp collection hay không mà không cần phải dùng vòng lặp

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Nhật Anh 9x

Thành viên chính thức
Tham gia
21/10/22
Bài viết
72
Được thích
3
Chào Các Anh Chị!

Em đang muôn kiểm tra một giá trị có cho trước xem có tồn tại trong một tập hợp hay không, mà không cần phải dùng vòng lặp. Vì yêu cầu của em là nếu có tồn tại thì sẽ thực thi câu lệnh tiếp theo, còn không tồn tại thì sẽ thoát khỏi sub luôn, vậy anh chị có cách nào xin chỉ dạy cho em với ạ!
 
Bạn gửi 2 cái đó lên đây. Biết chúng là gì sẽ có đáp án phù hợp để trả lời bạn.
Thớt học bập bẹ ở đâu đó, không biết mình nói gì.

1. Collection là một cấu trúc cho phép tìm kiếm theo trị. Bên trong nó có dùng vòng lặp hay không là chuyện của Microsoft. Theo nguyên tắc LTHĐT, người dùng không cần biết.

2. Các thủ thuật khác trên VBA cũng có thể tìm. Cần vòng lặp hay không tùy thuộc vảo điều kiện tìm. Ví dụ tìm trị nào đó xuất hiện lần thứ nhất thì chỉ 1 lần; nhưng tìm lần thứ n thì phải vòng lặp.

3. Câu lệnh Exit nhảy ra khỏi khối. Vòng lặp không phải là vấn đề.

4. Vòng lặp là code căn bản. Rất hiệu quả. Số vòng lặp không thể dùng để đo hiệu quả code. Số lượt lặp mới là tiêu chí đo. Vì ở GPE này có một số ngwoif hay nghĩ đến "giảm số vòng lặp", gây ấn tượng cho người mới học code là vòng lặp làm "giảm tốc độ" code.
 
Upvote 0
Theo mình biết thì để kiểm tra item trong collection có tồn tại hay không thì phải dùng vòng lặp.
Nếu không dùng vòng lặp thì khi tạo item, cần có key (lấy trùng với item) đi kèm nó, sau đó kiểm tra cái key này.

Ví dụ: add item theo cấu trúc này
Col.add item, key

PHP:
Dim col As New Collection, tmp
col.Add "ABC", "ABC"
col.Add "XYZ", "XYZ"
On Error Resume Next
tmp = col("TTT")
If Err.Number = 5 Then 
      maincode
else
      exit sub
end if
Trong đó mình gán tmp = col(Giá trị kiểm tra). Nếu giá trị này không tồn tại thì Err.Number = 5.
Trường hợp trên "TTT" không tồn tại nên maincode sẽ được thực hiện
 
Upvote 0
Người ta hỏi một tập hợp collection cơ mà.
Và hỏi giá trị chứ không phải dùng chữ từ khoá "key, item" gì cả.
Hiện tại vẫn chưa rõ là con gì để xem bói tiếp được. :)
 
Upvote 0
Người ta hỏi một tập hợp collection cơ mà.
Và hỏi giá trị chứ không phải dùng chữ từ khoá "key, item" gì cả.
Hiện tại vẫn chưa rõ là con gì để xem bói tiếp được. :)

Thớt có hai cái "cầu":
- nhu cầu: tìm một giá trị trong một collectioon
- yêu cầu: tìm fđược thì làm gì đo, không được thì thôi.
Trước mắt, thớt còn chưa cho biết collection ở đâu ra? của mình dựng hay từ nơi khác?

Yếu tố vòng lặp đúng ra không liên quan gì đến hai cái câu trên. Nó chỉ là định kiến chủ quan của thớt.
 
Lần chỉnh sửa cuối:
Upvote 0
Chỉ có một cách trừ vòng lặp, chuyển giá trị thành khóa truy cập và sử dụng bắt lỗi.
Hãy cẩn thận những con số và chuỗi số
JavaScript:
Sub test()
  Dim c As New Collection
  c.Add 2, "2"
  c.Add 1, "1"
 'c.Add 1, 1 'không bao giờ add được khóa là một số, vì số là thứ tự truy cập của collection
  On Error GoTo E
  On c("1") GoSub a, b
  On c("2") GoSub a, b
  On c(1) GoSub a, b
  On c(2) GoSub a, b
E:
Exit Sub
a:
  Debug.Print "a"
Return
b:
  Debug.Print "b"
Return
End Sub
 
Upvote 0
Đã bảo là người ta hỏi một tập hợp collection mà còn cứ cố. Ha ha.


1678693385673.png
 
Upvote 0
Đã bảo là người ta hỏi một tập hợp collection mà còn cứ cố. Ha ha.


View attachment 287537
GPE này là một "tập hợp quay số". Đoán đại ý người hỏi. Ai trùng có quyền hãnh diện mình "đoán đúng trước người khác".
Bình thường người ta tạm quên cái rủi "đoán trậ có khi bị thớt chửi" cho đên khi bị chửi thật.
 
Upvote 0
Biết đâu giá trị cần tìm sẽ tìm trong tập hợp là 1 range. Nếu vậy thì chỉ cần phương thức find.
GPE này là một "tập hợp quay số". Đoán đại ý người hỏi. Ai trùng có quyền hãnh diện mình "đoán đúng trước người khác".
Bình thường người ta tạm quên cái rủi "đoán trậ có khi bị thớt chửi" cho đên khi bị chửi thật.
Tôi chả mấy khi đoán. Nếu tôi hứng và muốn trả lời thì tôi hỏi lại cho đến khi rất rõ ràng mới thôi. Trường hợp đoán (cũng hiếm) thường là đoán đúng.
 
Upvote 0
Biết đâu (kiểu hỏi như vầy thì có cả chục cái biết đâu) thớt không cho Goto là vùng lặp:

' Goto là lệnh nhảy (rẽ nhánh) - code dưới đây là tại nó nhảy ngược chứ đâu phải vòng lặp :p
KhongPhaiVongLap:
code...
If (điều kiện) Then Goto KhongPhaiVongLap
...
 
Upvote 0
@Chủ bài đăng:
Sao bạn lại phải ưu tiên cho mình quyền từ chối vòng lặp?
Sao lại không thể cho biết đó là 1 tập hợp gì, đống rác hay các bợm đang nhậu hay gì gì khác, . . . .?
 
Upvote 0
Các anh chị cho em hỏi, e có thể sửa bài đăng của mình được không ạ, e loay hoay tìm cách sửa lại nói rõ hơn và đưa thông tin vào mà không biết sửa thế nào ạ. vì hôm trước em đang làm thì file của e nó bị lỗi , nên em phải làm lại dữ liệu
 
Upvote 0
Các anh chị cho em hỏi, e có thể sửa bài đăng của mình được không ạ, e loay hoay tìm cách sửa lại nói rõ hơn và đưa thông tin vào mà không biết sửa thế nào ạ. vì hôm trước em đang làm thì file của e nó bị lỗi , nên em phải làm lại dữ liệu
Bạn cứ giải thích bổ sung bằng bài viết tiếp theo.
 
Upvote 0
Em chào Anh Chị:

Em cảm ơn các anh chị vì sự quan tâm tới bài viết của em ạ, nhưng hôm nay em mới xong dữ liệu đầy đủ để gửi lên hỏi anh chị ạ
e xin lỗi vì chưa có kinh nghiệm viết, hỏi những bài đầu, đã tạo nên sự khó chịu cho các anh chị, mong mọi người bỏ qua cho em ạ


Và đây là ý tưởng của em ạ!

Ý tưởng của em là ví dụ 1 tuần, or 1 tháng mình có rất nhiều phiếu xuất, mình chỉ cần chọn khoảng ngày muốn in là nó sự tự hiện ra các số phiếu phát sinh trong khoảng ngày đó ạ. Từ ngày sẽ lấy số phiếu nhỏ nhất, đến ngày sẽ lấy số phiếu lớn nhất
Em muốn khi mình kích vào ô K3 or K4 chọn ngày với điều kiện kí hiệu là X đã chọn thì ô tương ứng L3(nhỏ nhất) , L4(lớn nhất) sẽ tìm ra số phiếu nhỏ nhất, lớn nhất từ sheets("NhapXuat"), và sau khi L3 hoặc L4 thay đổi thì C10 cũng thay đổi ạ
Code e viết ở module 1, anh chị xem qua và chỉ dạy giúp em ạ!

Em xin cảm ơn tất cả mọi người!


1678934938144.png
 

File đính kèm

  • test_pppp.xlsm
    1.7 MB · Đọc: 11
Upvote 0
Từ đó đến nay mà không thấy ai vào giúp thớt nhỉ?
 
Upvote 0
Upvote 0
Web KT

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

Back
Top Bottom