Code không chạy được

Liên hệ QC

hongphuong1997

Thành viên tiêu biểu
Tham gia
12/11/17
Bài viết
770
Được thích
321
Giới tính
Nữ
Các bác và các anh chị cho cháu hỏi tại sao cháu viết như này mà code không chạy được ạ
Cháu cảm ơn ạ!
Mã:
Sub vidu1()
Dim i As Integer
For i = 2 To 10
Cells(9, i) = WorksheetFunction.Search.Range(Cells(6, 2), Cells(2, i))
Next i
End Sub
 
Há miệng ra nào, ùm! nhai nuốt nhé! Chấm muối tiêu rồi đấy. Coi chừng nghẹn, có xương nhớ nhè ra nhá! (kinh nghiệm trông cháu ngoại 3 mùa dịch covid)

Cells(9, i) = Application.Search(Cells(6, 2), Cells(2, i))
 
Lần chỉnh sửa cuối:
Upvote 0
Application.Worksheetfunction hay Worksheetfunction?
Trả lời gọn: Hai cái như nhau.
Giải thíchn thêm: Đúng theo ngữ pháp khi sử dụng đối tượng thì luôn luôn phải là Application.Worksheetfunction. Tuy nhiên, vì Microsoft định rằng Application là đối tượng chủ chốt toàn cục (global context), và được VBA mặc định nối vào những thuộc tính và phương thức đã được định chắc của nó. Nói cách khác, Worksheetfunction là thuộc tính mà VBA biết là chắc chắn của [Excel] Application, cho nên phần "Application." có thể để cho VBA tự nối.

Application.HàmExcel hay Worksheetfunction.HàmExcel (Application.Worksheetfunction.HàmExcel)?
Trả lời gọn: Trường hợp này thì hai cái khác nhau. Tuy rằng hai cái hàm "HàmExcel" trên sẽ làm việc in hệt nhau.
Giải thích thêm: Nói cho đúng thì bên Application vỏn vẹn gói cái hàm bên Worksheetfunction vào một lớp vỏ giao diện rộng hơn (tiếng nghề gọi là wrapper function). Một trong những điểm "rộng" này là nó tự bẫy lỗi. Nói cách khác, Worksheetfunction gặp lỗi thì lên Error, nếu không bẫy (với On Error...) thì chương trình tắt tịt; hàm gói trong Application thì đã có sẵn phần bẫy lỗi giùm người dùng, và nó trả về một cái lỗi (test bằng IsError(...))
Vì hàm này chính là hàm kia, chỉ gói thêm một lớp giao diện rộng hơn cho nên cái "rộng" nó chậm hơn cái nguyên thuỷ một chút.

Chú:
Application là đối tượng chính của phần mềm. Với Excel thì nó là Excel. Với Word thì nó là Word và sẽ không có WorksheetFunction.

Chú quan trọng hơn:
Những lời giải thích trên giành cho cấp tương đối khá về VBA. Những người mới học, nếu không hiểu thì chỉ nên nhớ phần "trả lời gọn", và chờ đến lúc biết kha khá hãy hiểu phần "giải thích thêm".
 
Upvote 0
Các bác và các anh chị cho cháu hỏi tại sao cháu viết như này mà code không chạy được ạ
Cháu cảm ơn ạ!
Mã:
Sub vidu1()
Dim i As Integer
For i = 2 To 10
Cells(9, i) = WorksheetFunction.Search.Range(Cells(6, 2), Cells(2, i))
Next i
End Sub
Trong VBA có hàm Instr giống hàm Search
 
Upvote 0
Bài 7 gợi ý hàm Instr, nhưng bài 8 ứ chịu :p
Bài #8 có nói: "dùng hàm có sẵn của Excel"
Tuy tôi không tin là thớt hoàn toàn hiểu mình muốn gì, và hậu quả của nó, nhưng tôi nghĩ sẵn tiện ở đây mình có thể thử phân biệt mấy thứ này.

Điểm khác nhau là hàm InStr chỉ giản dị tìm chuỗi, và có thể dùng phân biệt hoa/thường hoặc không phân biệt. Trong khi đó, hàm Search của Excel không phân biệt hoa/thường và đặc biệt là có thể dò với wildcards (điểm này nên để ý vì InStr không làm được).

Phần sau đây đòi hỏi kiến thức kha khá về lý thuyết. Người mới học nên bỏ qua.

Nói Gọn: Hàm InStr là hàm căn bản của VBA (và nhiều phiên bản Basic). Hàm Search là hàm của Worksheetfunction, và vì vậy, nếu VBA chạy trong Access thì không thể sử dụng nó.

Nói chi tiết:
Không kể các hàm người dùng viết ra, ở đây chúng ta có hai loại hàm: hàm cung cấp từ VBA và hàm cung cấp từ ứng dụng tức Application, trong ngữ cảnh Excel thì là nhóm hàm Worksheetfunction.

Để gọi hàm Wotksheetfunction, ta dùng tiền tố Wotksheetfunction, tức là lôi cổ đối tượng (object) Wotksheetfunction lên mà gọi hàm của nó.
Như đã nói ở những bài trước đây, hầu hết các hàm Worksheetfunction đều có phiên bản được ứng dụng gói trong các lớp giao diện rộng hơn để dễ sử dụng. Những phiên bản này được gọi qua đối tượng Application.

Để gọi hàm VBA, ta dùng thẳng tên hàm, không nhất thiết phải qua tiền tố VBA. Lý do là VBA là không gian chủ mặc định, trình dịch tự động biết các hàm không được người dùng viết ra là hàm VBA.

Chú thêm về hàm VBA:
Thỉnh thoảng, ta thấy có người viết code vẫn dùng tiền tố VBA khi gọi hàm. Giả sử ta đang nói về tay code xịn, biết rõ mình đang làm gì thì câu hỏi là: tại sao vậy?

Có hai lý do:

1. người viết nghĩ rằng có khả năng bị chạm têm hàm. Tức là trong một cái code module nào đó có một cái hàm trùng tên với hàm VBA.
Khi xảy ra việc trùng tên thì hàm người dùng sẽ che mất hàm VBA. Cách duy nhất để trình dịch biết là dùng tiền tố VBA.

2. nhiều hàm VBA chịu ảnh hưởng của môi trường (tức các Options). Tức là chúng có thể hoạt động hơi khác một chút, tuỳ theo các options được nêu ra ở đầu module (cũng có khi option được định cho cả application - tự tìm hiểu lấy). Để buộc hàm hoạt động đúng theo căn bản của chúng, ta thêm tiền tố VBA.
Ví dụ điển hình:
Nếu ta đặt Option Base 1 ở đầu module thì hàm Array sẽ trả về mảng bắt đầu với chỉ số 1. Để bảo đảm mảng trả về phải bắt đầu bằng chỉ số 0, ta gọi hàm VBA.Array
 
Upvote 0
Cháu cảm ơn Bác @VetMini ạ, Bác oi cháu mày mò nghiên cứu VBA và cũng được nhiều các Bác các anh chị chỉ bảo cho rất nhiều.
Nhưng đầu óc cháu bị sao ấy (Nó không nhập được vào đầu, hiểu trước quên sau)
Mặc dù cháu rất thích môn này, nhưng mờ khó quá Bác oi.
 
Upvote 0
Cháu cảm ơn Bác @VetMini ạ, Bác oi cháu mày mò nghiên cứu VBA và cũng được nhiều các Bác các anh chị chỉ bảo cho rất nhiều.
Nhưng đầu óc cháu bị sao ấy (Nó không nhập được vào đầu, hiểu trước quên sau)
Mặc dù cháu rất thích môn này, nhưng mờ khó quá Bác oi.
Ở đâu đó tôi có nói: nếu đổ nước đầu vịt khó thấm thì đổ nước hoa, cuối cùng không được thì đổ nước sôi.
Phải có đam mê và có chí muốn học thì mới tiến bộ. Ví dụ đam mê ăn uống là biết chỗ nào bán trà sữa, bán vịt quay ngon, đam mê nấu ăn là biết cách chế biến món "vịt nấu chao", món "gà nấu nho"
 
Upvote 0
Ở đâu đó tôi có nói: nếu đổ nước đầu vịt khó thấm thì đổ nước hoa, cuối cùng không được thì đổ nước sôi.
Phải có đam mê và có chí muốn học thì mới tiến bộ. Ví dụ đam mê ăn uống là biết chỗ nào bán trà sữa, bán vịt quay ngon, đam mê nấu ăn là biết cách chế biến món "vịt nấu chao", món "gà nấu nho"
Bác oi, cháu thường trực ở diễn đàn GPE 16/24h hằng ngày.
Thế mờ toàn "Nước đổ đầu vịt" Bác oi.
 
Upvote 0
Lần đầu được nghe đổ nước thơm đầu vịt hahaha
Phần sau đây đòi hỏi kiến thức kha khá về lý thuyết. Người mới học nên bỏ qua.
hehe, đọc bài viết của bác là cháu hay bị nổ đom đóm mắt,
dùng tiền tố VBA khi gọi hàm
Đã có m ột thời cháu khủng khoảng tuổi dậy thì vì cái chuyện đặt tên hàm trùng nhau giữa các modul.
 
Upvote 0
Ý đồ của bạn là gi? Tại sao lại liên quan tới search (tất nhiên sai cú pháp)
Anh @Nhattanktnn và các Bác oi, cháu muốn thêm một vòng lặp nữa nhưng cháu chỉnh không được.
Các Bác và Anh chỉnh cho em với anh nhé
Em cảm ơn anh ạ.
Mã:
Sub vidu5() 'xong
Dim i As Integer
Dim j As Integer
On Error Resume Next
For j = 1 To 3
For i = 2 To 10
    Cells("12" & j, i) = WorksheetFunction.Search(Cells("6" & j, 2), Cells(2, i))
Next i
Next j
End Sub
 
Upvote 0
Anh @Nhattanktnn và các Bác oi, cháu muốn thêm một vòng lặp nữa nhưng cháu chỉnh không được.
Các Bác và Anh chỉnh cho em với anh nhé
Em cảm ơn anh ạ.
Mã:
Sub vidu5() 'xong
Dim i As Integer
Dim j As Integer
On Error Resume Next
For j = 1 To 3
For i = 2 To 10
    Cells("12" & j, i) = WorksheetFunction.Search(Cells("6" & j, 2), Cells(2, i))
Next i
Next j
End Sub
Khoan xét cái khác, j=1, bạn tự tính "12" & j là bi nhiêu? "6" & j là bi nhiêu?
 
Upvote 0
Cháu cảm ơn Bác ạ!
Thế như nào cơ hở Bác?
Nếu ý đồ là dòng 121 thì sao không là j=121 to 123 hay cells(120+j,..) mà lại dùng & nhỉ? Mấy cái này đâu có quá khó hiểu đâu
(Đoán ý đồ thôi chứ cũng chưa chắc chủ thớt đã muốn như vậy :D )
 
Upvote 0
Nếu ý đồ là dòng 121 thì sao không là j=121 to 123 hay cells(120+j,..) mà lại dùng & nhỉ? Mấy cái này đâu có quá khó hiểu đâu
(Đoán ý đồ thôi chứ cũng chưa chắc chủ thớt đã muốn như vậy :D )
Anh oi, ý của em là kết quả như vùng công thức tô màu vàng.
Anh dạy em với anh nhé
Em Cảm ơn anh ạ
 

File đính kèm

  • Dùng autofin - Copy.xlsb
    15.6 KB · Đọc: 8
Upvote 0
Anh oi, ý của em là kết quả như vùng công thức tô màu vàng.
Anh dạy em với anh nhé
Em Cảm ơn anh ạ
Kiểu nó như này:
Mã:
Sub vidu5() 'xong
Dim i As Integer
Dim j As Integer
On Error Resume Next
For j = 6 To 8
For i = 2 To 11
    Cells(j + 6, i) = WorksheetFunction.Search(Cells(j, "B"), Cells(2, i))
Next i
Next j
End Sub
 
Upvote 0
Hi hi..... em cảm ơn sự gợi ý của anh @Nhattanktnn
Anh oi, em sửa được rùi
Kết quả thì đúng nhưng không biết về lý thuyết có sai gì không hở anh oi.

Mã:
Sub vidu5() 'xong
Dim i As Integer
Dim j As Integer
On Error Resume Next
For j = 0 To 2
For i = 2 To 10
    Cells(12 + j, i) = WorksheetFunction.Search(Cells(6 + j, 2), Cells(2, i))
Next i
Next j
End Sub
Bài đã được tự động gộp:

Kiểu nó như này:
Mã:
Sub vidu5() 'xong
Dim i As Integer
Dim j As Integer
On Error Resume Next
For j = 6 To 8
For i = 2 To 11
    Cells(j + 6, i) = WorksheetFunction.Search(Cells(j, "B"), Cells(2, i))
Next i
Next j
End Sub
hi hi...... em đang viết thì anh đã làm trước cho em rùi
Cuối cùng em lại đăng bài sau anh.
 
Upvote 0
Anh oi, ý của em là kết quả như vùng công thức tô màu vàng.
Anh dạy em với anh nhé
Em Cảm ơn anh ạ
Ý đồ như bạn thì Sub như thế này:
PHP:
Sub vidu5() 'xong
Dim i As Long, j As Long
On Error Resume Next
For j = 0 To 2
    For i = 2 To 12
        Cells(12 + j, i) = WorksheetFunction.Search(Cells(6 + j, 2), Cells(2, i))
    Next i
Next j
End Sub
 
Upvote 0
Hi hi..... em cảm ơn sự gợi ý của anh @Nhattanktnn
Anh oi, em sửa được rùi
Kết quả thì đúng nhưng không biết về lý thuyết có sai gì không hở anh oi.

Mã:
Sub vidu5() 'xong
Dim i As Integer
Dim j As Integer
On Error Resume Next
For j = 0 To 2
For i = 2 To 10
    Cells(12 + j, i) = WorksheetFunction.Search(Cells(6 + j, 2), Cells(2, i))
Next i
Next j
End Sub
Bài đã được tự động gộp:


hi hi...... em đang viết thì anh đã làm trước cho em rùi
Cuối cùng em lại đăng bài sau anh.
Còn ý mấy bài trên bác Vetmini nói về application với worksheetfunction là như thế này này:
Mã:
Sub vidu5()
Dim i As Integer
Dim j As Integer
For j = 6 To 8
For i = 2 To 11
    Cells(j + 6, i) = Application.IfError(Application.Search(Cells(j, "B"), Cells(2, i)), "Khong có")
Next i
Next j
End Sub
 
Upvote 0
Ý đồ như bạn thì Sub như thế này:
PHP:
Sub vidu5() 'xong
Dim i As Long, j As Long
On Error Resume Next
For j = 0 To 2
    For i = 2 To 12
        Cells(12 + j, i) = WorksheetFunction.Search(Cells(6 + j, 2), Cells(2, i))
    Next i
Next j
End Sub
Cháu cảm ơn Bác ạ
Giống như code của cháu lúc nãy của chau.
 
Upvote 0
Còn ý mấy bài trên bác Vetmini nói về application với worksheetfunction là như thế này này:
Mã:
Sub vidu5()
Dim i As Integer
Dim j As Integer
For j = 6 To 8
For i = 2 To 11
    Cells(j + 6, i) = Application.IfError(Application.Search(Cells(j, "B"), Cells(2, i)), "Khong có")
Next i
Next j
End Sub
Không phải. Ý tôi là như vầy:
sr = Application.Search(Cells(j, "B"), Cells(2, i)) ' nếu search không ra thì hàm trả về một trị kiểu Error Variant
If Not IsError(sr) Then Cells(j + 6, i) = sr
 
Upvote 0
Web KT

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

Back
Top Bottom