Lỗi "Type mismatch" khi dùng hàm Filter trong Array ? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
32
Giới tính
Nữ
Em chào các anh chị ! Lâu lắm rồi mới động lại vào VBA (Lười quá đi à ^^)
Hiện tại em đang có một số lỗi nhỏ trong quá trình viết code mong các anh chị giúp em giải thích và khắc phục.
Vấn đề 1 và các câu hỏi :
Module 1 em đang muốn tìm giá trị trong một mảng bằng hàm filter .
1654571682563.png
Em có khai báo một mảng động kiểu VariantstrSubNames() nhưng lúc gán giá trị Filter(strName, "Bob") vào mảng strSubNames() thì Trải về lỗi "Type mismatch" . Em có kiểm tra xem Kiểu của Filter nó là cái gì và nó có là mảng hay không thì nó trả về một mảng và có kiểu là String() . Mà cái mảng strSubName() kia nó có kiểu Variant cơ mà (tức nó có thể chứa cả string)) . Sao lại lỗi nhỉ ?
Sau đó em thử không khai báo mảng strSubNames nữa mà chỉ để là biến strSubNames thôi (Tức là Dim strSubNames As Variant)
thì nó lại không thấy lỗi nữa . Tại sao lại thế ? .
Em có thử khai báo lại mảng strSubNames như sau: Dim strSubNames() As String thì nó được .(cái này có liên quan đến vấn đề 2)

Vấn đề 2 và các câu hỏi:
Em có thử dùng hàm Filter trên mảng động nhiều chiều thì nó lại lỗi "Type mismatch" mặc dù đã khai báo mảng A là kiểu String (Dim A() As String)
1654572787683.png
Sau đó em thử lại với các trường hợp tương tự như vấn đề 1 như sau:
Khai báo biến A:
TH1: Dim A() As Variant
TH2: Dim A As Variant
Thì cả hai trường hợp khai báo A này vẫn đều không được ^^

Mong các anh vô giải thích kĩ giúp em với chứ em đang hoang mang quá :>
 

File đính kèm

Lần chỉnh sửa cuối:
Em chào các anh chị ! Lâu lắm rồi mới động lại vào VBA (Lười quá đi à ^^)
Hiện tại em đang có một số lỗi nhỏ trong quá trình viết code mong các anh chị giúp em giải thích và khắc phục.
Vấn đề 1 và các câu hỏi :
Module 1 em đang muốn tìm giá trị trong một mảng bằng hàm filter .

Em có khai báo một mảng động kiểu VariantstrSubNames() nhưng lúc gán giá trị Filter(strName, "Bob") vào mảng strSubNames() thì Trải về lỗi "Type mismatch" . Em có kiểm tra xem Kiểu của Filter nó là cái gì và nó có là mảng hay không thì nó trả về một mảng và có kiểu là String() . Mà cái mảng strSubName() kia nó có kiểu Variant cơ mà (tức nó có thể chứa cả string)) . Sao lại lỗi nhỉ ?
Sau đó em thử không khai báo mảng strSubNames nữa mà chỉ để là biến strSubNames thôi (Tức là Dim strSubNames As Variant)
thì nó lại không thấy lỗi nữa . Tại sao lại thế ? .
Em có thử khai báo lại mảng strSubNames như sau: Dim strSubNames() As String thì nó được .(cái này có liên quan đến vấn đề 2)

Vấn đề 2 và các câu hỏi:
Em có thử dùng hàm Filter trên mảng động nhiều chiều thì nó lại lỗi "Type mismatch" mặc dù đã khai báo mảng A là kiểu String

Sau đó em thử lại với các trường hợp tương tự như vấn đề 1 như sau:
Khai báo biến A:
TH1: Dim A() As Variant
TH2: Dim A As Variant
Thì cả hai trường hợp khai báo A này vẫn đều không được ^^

Mong các anh vô giải thích kĩ giúp em với chứ em đang hoang mang quá :>
Hàm FILTER trong VBA là hàm lọc đối với mảng 1 chiều nên bạn thực hiện bị lỗi.

Thử thay lại và lọc thế nào:

Mã:
Sub LoopThroughArray()
   Dim varArray() As String
   Dim A As Variant
   Dim strFind As String
   strFind = "Doctor"
  
   ReDim varArray(0 To 5)
   varArray(0) = "Mel Smith"
   varArray(1) = "Fred Buckle"
   varArray(2) = "Jane doctor"
   varArray(3) = "Accountant"
   varArray(4) = "Secretary"
   varArray(5) = "Doctor"

    A = Filter(varArray, strFind, True, vbBinaryCompare)
    Dim i As Integer
    For i = LBound(A) To UBound(A)
        Debug.Print A(i)
    Next
    
End Sub
 
Upvote 0
Hàm FILTER trong VBA là hàm lọc đối với mảng 1 chiều nên bạn thực hiện bị lỗi.

Thử thay lại và lọc thế nào:

Mã:
Sub LoopThroughArray()
   Dim varArray() As String
   Dim A As Variant
   Dim strFind As String
   strFind = "Doctor"
 
   ReDim varArray(0 To 5)
   varArray(0) = "Mel Smith"
   varArray(1) = "Fred Buckle"
   varArray(2) = "Jane doctor"
   varArray(3) = "Accountant"
   varArray(4) = "Secretary"
   varArray(5) = "Doctor"

    A = Filter(varArray, strFind, True, vbBinaryCompare)
    Dim i As Integer
    For i = LBound(A) To UBound(A)
        Debug.Print A(i)
    Next
   
End Sub
Dạ vâng ạ ! Em vừa xem lại lý thuyết thì đúng nó chỉ dùng trong mảng một chiều thật ^^
1654574850053.png
 
Upvote 0
Các anh chị ơi !! Hiện tại thì em vẫn chưa tự trả lời được vấn đề 1 mong các anh chị tiếp tục giúp em với ạ ^^
 
Upvote 0
Các anh chị ơi !! Hiện tại thì em vẫn chưa tự trả lời được vấn đề 1 mong các anh chị tiếp tục giúp em với ạ ^^
"Nó" đòi hỏi mảng STRING thì cứ cung cấp mảng STRING đi. Cố ý cung cấp mảng VARIANT rồi đôi co với "nó" làm gì.

Nếu tôi không lầm thì khi hàm VBA trả về một MẢNG STRING thì biến nhận kết quả trả về đó có thể khai báo là MẢNG STRING hoặc VARIANT. Nhưng sau khi nhận kết quả rồi thì về nội dung trong biến đó là MẢNG STRING. Bản chất cái đang có trong lõi nó mà một mảng mà mỗi phần tử có kiểu là String. Cho dù là Filter hay Split cũng vậy.

Mã:
Dim strName() As Variant
  Dim strSubNames1, strSubNames2
  strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")

  strSubNames1 = Filter(strName, "Bob", True)
  Debug.Print TypeName(strSubNames1)    ' kết quả là String()
  
  strSubNames2 = Split("Ngay mai em di", " ")
  Debug.Print TypeName(strSubNames2)    ' kết quả là String()

Cứ chấp nhận là Filter và Split đòi hỏi biến nhận kết quả trả về phải được khai báo là Variant hoặc mảng String thôi. Có nhiều cái mà cứ hỏi tại sao thì phải nhìn vào code trong các thư viện VBA mới trả lời được. Nhiều cái cứ tưởng dùng lôgíc xét được. Nhưng không phải. Cùng một khía cạnh nhưng vd. trong Delphi rất khắt khe nhưng trong VBA thì lại dễ dãi.

Tôi chỉ có ý kiến thế thôi, bạn chờ người khác nhé.
 
Upvote 0
"Nó" đòi hỏi mảng STRING thì cứ cung cấp mảng STRING đi. Cố ý cung cấp mảng VARIANT rồi đôi co với "nó" làm gì.

Nếu tôi không lầm thì khi hàm VBA trả về một MẢNG STRING thì biến nhận kết quả trả về đó có thể khai báo là MẢNG STRING hoặc VARIANT. Nhưng sau khi nhận kết quả rồi thì về nội dung trong biến đó là MẢNG STRING. Bản chất cái đang có trong lõi nó mà một mảng mà mỗi phần tử có kiểu là String. Cho dù là Filter hay Split cũng vậy.

Mã:
Dim strName() As Variant
  Dim strSubNames1, strSubNames2
  strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")

  strSubNames1 = Filter(strName, "Bob", True)
  Debug.Print TypeName(strSubNames1)    ' kết quả là String()
 
  strSubNames2 = Split("Ngay mai em di", " ")
  Debug.Print TypeName(strSubNames2)    ' kết quả là String()

Cứ chấp nhận là Filter và Split đòi hỏi biến nhận kết quả trả về phải được khai báo là Variant hoặc mảng String thôi. Có nhiều cái mà cứ hỏi tại sao thì phải nhìn vào code trong các thư viện VBA mới trả lời được. Nhiều cái cứ tưởng dùng lôgíc xét được. Nhưng không phải. Cùng một khía cạnh nhưng vd. trong Delphi rất khắt khe nhưng trong VBA thì lại dễ dãi.

Tôi chỉ có ý kiến thế thôi, bạn chờ người khác nhé.
Dạ vâng ạ ! Em cứ tưởng đấy là kiến thức cơ bản nên có thể giải thích được luôn chứ . Nếu nó phức tạp thế thì thôi vậy (em không thích mấy thứ phức tạp cho lắm ^^) .
Em cảm ơn anh batman1 và anh Hoàng Trọng Nghĩa nhiều :> Cảm ơn hai anh đã dành thời gian ra đọc bài và khắc phục lỗi giúp em
 
Upvote 0
Ngày nào cũng thức thế này thì rồi mặt đen xì nhỉ. Thức khuya thế thì sắc đẹp xuống dốc không phanh. Hay bạn không sống ở Việt Nam? Tò mò thôi chứ tôi không phải là mật vụ đâu nhé. Không trả lời cũng được.
 
Upvote 0
Tò mò thôi chứ tôi không phải là mật vụ đâu nhé. Không trả lời cũng được.
^^ Hỏi bằng cả sự tò mò là một điều hết sức tuyệt vời mà anh :>
Khi cháu hỏi bà : "Bà dạo này có khỏe không?" mà trong khi tay cháu vẫn đang cầm cái điện thoại nhắn với bạn có khi bà trả lời rồi cũng chỉ vâng cho qua . Còn khi bà hỏi cháu "Hôm nay cháu thích ăn gì?" thì bà tận tụy nấu từng món cháu thích chỉ để đứa cháu được thỏa mãn, chỉ để được thấy đứa cháu thưởng thức món mình nấu hay chỉ đơn giản nghe được câu từ người cháu: "Bà nấu ngon lắm" . Thật ấm áp !! . Vậy điểm giao là ở đâu ?
Ngày nào cũng thức thế này thì rồi mặt đen xì nhỉ. Thức khuya thế thì sắc đẹp xuống dốc không phanh
Thật ra đây cũng là vấn đề hết sức đau đầu với em . Vả lại em cũng biết học những thứ này thật ra không phải là thứ em giá trị . Thứ em giá trị không phải là những thứ như vậy - Vậy em giá trị cái gì ? - . Em biết nhan sắc cực kì quan trọng và nó cũng chỉ có thời hạn nhất định -Tại sao lại bất công vậy chứ ?- Trong khi thanh xuân của con trai như một cơn mưa rào thì con gái chỉ là mưa bóng mây . Vậy điểm giao là ở đâu ? .
Ui ! Em lại để cảm xúc chen vào rồi :< . Chứ thật ra câu trả lời nó đơn giản lắm anh hi . Bình thường em lên giường từ 20h cơ :> Lúc mọi người vẫn đang nghịch điện thoại thì em đi ngủ . Lúc dậy thấy chúng nó vẫn cứ đang cầm lướt lướt ^^
 
Upvote 0
Dạ vâng ạ ! Em vừa xem lại lý thuyết thì đúng nó chỉ dùng trong mảng một chiều thật ^^
...
Tức là khi học, bạn chỉ cần lướt qua rồi phần xem kỹ lại thì nhờ mấy thằng "vô công dồi nghề [sic]" chỉ giùm?

Tôi không bắt bẻ bạn mần gì, chỉ mất công gây lộn.
Tôi chỉ muốn hiểu chắc vấn đề để về sau này có bạn nào lên đây hỏi "chỗ và cách học VBA" thì tôi sẽ chỉ:
Cứ lấy một cái nít con gái nghe kêu kêu, dùng một cái hình xinh xinh, lên đây nhỏ nhẹ hỏi là ăn bứt mọi trường dạy.

Tự chú: Mình nhớ cách đây 2 (2 năm thì phải) có người lên hỏi bài. Đang lủng củng thì người ấy tuông ra câu "Em là con gái, xin giúp em với". Cái mánh này, ai ở lâu trên GPE đều biết.
 
Upvote 0
Tức là khi học, bạn chỉ cần lướt qua rồi phần xem kỹ lại thì nhờ mấy thằng "vô công dồi nghề [sic]" chỉ giùm?

Tôi không bắt bẻ bạn mần gì, chỉ mất công gây lộn.
Tôi chỉ muốn hiểu chắc vấn đề để về sau này có bạn nào lên đây hỏi "chỗ và cách học VBA" thì tôi sẽ chỉ:
Cứ lấy một cái nít con gái nghe kêu kêu, dùng một cái hình xinh xinh, lên đây nhỏ nhẹ hỏi là ăn bứt mọi trường dạy.

Tự chú: Mình nhớ cách đây 2 (2 năm thì phải) có người lên hỏi bài. Đang lủng củng thì người ấy tuông ra câu "Em là con gái, xin giúp em với". Cái mánh này, ai ở lâu trên GPE đều biết.
Tại em đang không hiểu mục đích của anh là gì với em cũng không biết nên trả lời anh thế nào ấy(Nhiều lúc em phải ngồi dịch bài việt hóa của anh mà cũng chẳng thể hiểu nổi anh muốn viết cái gì) . Chẳng nhẽ lại bơ bài viết của anh thì em cũng không muốn . Em muốn anh quay lại đúng vị trí của người đi hướng dẫn và em cũng quay lại đúng vị trí của người đi hỏi bài được không ạ ? Và từ giờ em cũng sẽ không bàn luận gì về bản thân hay thổ lộ bất cứ quan điểm cá nhân nào nữa lên trên trên này nữa. Em không muốn đã tốn thời gian đi hỏi bài rồi mà lại còn phải giải quyết mâu thuẫn giữa hai tư tưởng -Thật mệt mỏi- . Còn nếu anh có góp ý gì về kiến thức hay nội quy diễn đàn thì em chắc chắn sẽ ghi nhận và sửa đổi ạ còn những thứ khác em xin được không phản hồi . Mong anh thông cảm giúp em .
 
Upvote 0
Tôi đã nói tôi không lý luận gì với bạn nữa. Những gì tôi đề ra là dùng để khuyên người khác.
Tôi là dân "cơ hội chủ nghĩa". Chỉ dùng bạn để chỉ người khác. Nói cách khác là "lợi dụng".
Tuy nhiên, tôi không lợi dụng suông. Tôi noi gương con quạ ăn khế trả vàng. Chỉ là có người nhận vàng mà không biết nguồn thôi.
 
Upvote 0
Tôi thấy cái lão "đai môn" đang chuẩn bị xoa tay gõ mấy lời "thù vặt" và "nhớ dai".
Tôi không sợ lão ta phê bình, nhưng lại không muốn lão ta hả hê.

Vây nên tôi mách bạn thêm 1 lần:
- Người trao vàng cho bạn đã từng nhắc nhở rằng "cái túi của bạn nó lớn hơn 3 gang". Bạn cần xem kỹ lại lời ấy, và cột bớt đáy túi lại cho còn đủ 3 gang.
- Câu "lợi dụng" ở trên thực ra là giúp bạn. Ở đây có vài người thích chứng minh tôi sai. Nó giúp bạn nhận vàng 9999 (từ những người ấy) thay vì vàng tạp chủng.
 
Upvote 0
Tôi thấy cái lão "đai môn" đang chuẩn bị xoa tay gõ mấy lời "thù vặt" và "nhớ dai".
Tôi không sợ lão ta phê bình, nhưng lại không muốn lão ta hả hê.
Tôi đang hả hê. Tôi thích cái câu:
Tức là khi học, bạn chỉ cần lướt qua rồi phần xem kỹ lại thì nhờ mấy thằng "vô công dồi nghề [sic]" chỉ giùm?
Vì câu đó đúng.
-----
Còn câu của tôi ở trên, và câu tôi nói hôm Đoan Ngọ (vụ giết sâu bọ bằng thứ gì), cũng có gì đó hay hay dù không phải vàng 9999
 
Upvote 0
Web KT

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

Back
Top Bottom