Ứng dụng Immediate trong VBA (1 người xem)

Liên hệ QC

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

a.nguoidensau

Thành viên hoạt động
Tham gia
12/4/12
Bài viết
138
Được thích
28
Xin chào các thành viên của diễn đàn GPE.

Ai đó vui lòng chỉ giúp tôi có cái nhìn tổng quát về các ứng dụng của Immediate (Ctrl +G) trong lập trình VBA.
Xin cảm ơn.
[h=1][/h]
 
Nếu bạn muốn kiểm tra giá trị của biến, thuộc tính, kết quả của biểu thức, kết quả in bởi lệnh Debug.Print thì dùng nó.
VÍ dụ bạn làm:
?Application.Version
?Val(Application.Version)
?ActiveCell.Value

Để lấy giá trị cho dấu ? đứng trước nhé.
 
Upvote 0
Nếu bạn muốn kiểm tra giá trị của biến, thuộc tính, kết quả của biểu thức, kết quả in bởi lệnh Debug.Print thì dùng nó.
VÍ dụ bạn làm:
?Application.Version
?Val(Application.Version)
?ActiveCell.Value

Để lấy giá trị cho dấu ? đứng trước nhé.
Tôi nghĩ rằng Immediate có rất nhiều ứng dụng trong viết Code, tuy nhiên để sử dụng thành thạo nó có lẽ phải giành cho người viết Code nhiều. Tôi cũng có đọc 1 số bài viết về vấn đề này, nhưng vẫn chưa biết dùng nó 1 cách linh hoạt.Chẳng khác nào học chữ A là biết chữ A, học chữ B biết chữ B.....
Ứng dụng của nó với mỗi bài toán như thế nào?
Ai đó vui lòng cho tôi 1 vài ví dụ cụ thể để tôi thấy được cái hay của nó.
Xin cảm ơn.
 
Upvote 0
Bạn xem trong lập trình excel bài hướng dẫn debug tôi viết. Chức năng của immediate dùng phối hợp trong kỹ thuật debug, kiểm tra giá trị của biểu thức trong tiến trình chạy code, cách làm như tôi giới thiệu chỉ có thế thôi bạn à. Bạn tưởng tượng thế nào mà nhiều chức năng thế ;)
 
Upvote 0
Cũng có thể coi nó là một thao trường để theo dõi code.
Ví dụ điển hình là nhiều bạn ở diễn đàn này thích dùng button (bấm nut) để chạy code. Nhưng tôi thì gần như luôn luôn chạy nó trong của sổ immdediate bằng cách Sub: đặt con trỏ trong code của sub muốn chạy và nhấn F5; Function: gõ ?TenHam(tham số)

Tôi còn một thói quen khác là giữ các đoạn code ngắn trong 1 tập txt. Lúc cần thì mở ra, cóp 1 dòng, dán vào cửa sổ immediate, enter -> thực thi. Twuf 'immediate' có nghĩa là 'ngay tại chỗ', tôi làm thế là sử dụng phần nào chức năng của nó.
 
Upvote 0
Cũng có thể coi nó là một thao trường để theo dõi code.
Ví dụ điển hình là nhiều bạn ở diễn đàn này thích dùng button (bấm nut) để chạy code. Nhưng tôi thì gần như luôn luôn chạy nó trong của sổ immdediate bằng cách Sub: đặt con trỏ trong code của sub muốn chạy và nhấn F5; Function: gõ ?TenHam(tham số)

Tôi còn một thói quen khác là giữ các đoạn code ngắn trong 1 tập txt. Lúc cần thì mở ra, cóp 1 dòng, dán vào cửa sổ immediate, enter -> thực thi. Twuf 'immediate' có nghĩa là 'ngay tại chỗ', tôi làm thế là sử dụng phần nào chức năng của nó.
Đó, đó, em thích cái kiểu làm của bác đấy.
 
Upvote 0
Mình có 1 ví dụ ngoài lề thế này, xin gốp vui thôi

Tôi có 1 bảng danh sách, như trong hình đính kèm
Ở cột [B:B] ghi mã nhân viên & cột [C:C] ghi họ tên của người đó;

Tôi viết hàm người dùng có nội dung như sau:
PHP:
Option Explicit
Function TimTen(Ma As String, Vùng As Range)
 Dim sRng As Range, MyAdd As String
 
 Set sRng = Vùng.Find([E1].Value, , xlFormulas, xlPart)
 If Not sRng Is Nothing Then
    MyAdd = sRng.Address
    Do
        TimTen = sRng.Offset(, 1)
        Set sRng = Vùng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
 End If
End Function

Sau đó tôi nhập cú fáp hàm vô ô [E4] trên trang tính như sau: =TimTen(E1, B1:B30)

Sau khi nhấn {ENTER} thì excel báo lỗi (như các bạn thấy trong hình)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Nhưng 1 điều kì diệu trong cửa sổ Immediate, nếu ta nhập cú fáp

?TimTen(Range("E1").Value, Columns("B:B")) & nhấn {ENTER}
Thì chàng ta cho kết quả:
Nông Võ Hoàn (Mang mã NV NVH10)
 

File đính kèm

  • DSach.JPG
    DSach.JPG
    68.9 KB · Đọc: 75
Upvote 0
Tôi có 1 bảng danh sách, như trong hình đính kèm
Ở cột [B:B] ghi mã nhân viên & cột [C:C] ghi họ tên của người đó;

Tôi viết hàm người dùng có nội dung như sau:
PHP:
Option Explicit
Function TimTen(Ma As String, Vùng As Range)
 Dim sRng As Range, MyAdd As String
 
 Set sRng = Vùng.Find([E1].Value, , xlFormulas, xlPart)
 If Not sRng Is Nothing Then
    MyAdd = sRng.Address
    Do
        TimTen = sRng.Offset(, 1)
        Set sRng = Vùng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
 End If
End Function

Sau đó tôi nhập cú fáp hàm vô ô [E4] trên trang tính như sau: =TimTen(E1, B1:B30)

Sau khi nhấn {ENTER} thì excel báo lỗi (như các bạn thấy trong hình)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Nhưng 1 điều kì diệu trong cửa sổ Immediate, nếu ta nhập cú fáp

?TimTen(Range("E1").Value, Columns("B:B")) & nhấn {ENTER}
Thì chàng ta cho kết quả:
Nông Võ Hoàn (Mang mã NV NVH10)

Cảm ơn bác đã cho em 1 ví dụ minh họa, em cũng đã kiểm tra.
Dường như nó cho kết quả cuối cùng thì phải?
 
Upvote 0
Tôi có 1 bảng danh sách, như trong hình đính kèm
Ở cột [B:B] ghi mã nhân viên & cột [C:C] ghi họ tên của người đó;

?TimTen(Range("E1").Value, Columns("B:B")) & nhấn {ENTER}
Thì chàng ta cho kết quả:
Nông Võ Hoàn (Mang mã NV NVH10)

Cho Em hỏi hơi ngu một chút.
Em thấy kết quả tại cửa sổ immediate ra kết quả như vậy, thì làm thế nào để chuyển và sửa lên phía code bên trên.
Em cũng rất muốn và hiểu thêm về cái cửa sổ này.
và Em có hình theo bên dưới:


http://i.imgur.com/LyHAgMc.png
 
Upvote 0
Em cũng rất muốn và hiểu thêm về cái cửa sổ này.
và Em có hình theo bên dưới:

Cái cửa sổ ấy chỉ có 1 mục đích duy nhất là TEST CODE, bình thường thôi có gì đâu mà phải tìm hiểu
Đã là TEST thì test gì tùy ý bạn, miễn đúng cú pháp là được
 
Upvote 0
Em thấy kết quả tại cửa sổ immediate ra kết quả như vậy, thì làm thế nào để chuyển và sửa lên phía code bên trên.
Nếu chỉ đi sâu chuyện này e rằng lạc đề của chủ đề tài (CĐT).
Nhưng những mong CĐT lượng thứ:

Trong hàm người dùng thì mình chưa có cách nào sửa được; (Nói thêm: Mình cảm giác rằng Excel đang vây mượn cửa sổ này để xài tạm thôi trong giây lát.)

Mình chỉ còn cách chuyển sang viết macro thì nó sẽ chạy ngon lành từ đầu chí cuối.

Cũng cần nói thêm rằng, nếu ta không dùng fương thức Set sRng=Rng.FindNext(sRng) thì hàm tự tạo nêu trên chạy bình thường.
Đến đây có vài hướng/trường hợp giải quyết & sẽ đạt kết quả khác nhau:

(*) Nếu chỉ cần hàm tự tạo cho ta kết quả tìm thấy đầu tiên, lúc đó ta không cần đến vòng lặp Do . . . Loop; Kếu hàm báo kết quả & kết thúc.

(*) Không tạo vòng lặp Do. . .Loop, mà khai báo lại biến Rng & xài For . . . Next, để lấy hết các giá trị (hay địa chỉ) được tìm thấy.

(Có nghĩa là chuyện xài các trị tìm thấy như thế nào hoàn toàn tùy thuộc vô bạn!)

Chúc buổi sáng tốt lành!
 
Upvote 0
Cái cửa sổ ấy chỉ có 1 mục đích duy nhất là TEST CODE, bình thường thôi có gì đâu mà phải tìm hiểu
Đã là TEST thì test gì tùy ý bạn, miễn đúng cú pháp là được
Đối với cửa sổ immediate thì nó chỉ có chức năng test thui ah, thế mà em cứ nghĩ là nó có chức năng fix code để từ đó sửa lại code chứ.
Vậy cho em hỏi nếu 1 dòng code bị viết sai thì làm sao và bằng cách nào em có thể sửa nó ah?
 
Upvote 0
Đối với cửa sổ immediate . . . , thế mà em cứ nghĩ là nó có chức năng fix code để từ đó sửa lại code chứ.
Vậy cho em hỏi nếu 1 dòng code bị viết sai thì làm sao và bằng cách nào em có thể sửa nó ah?

(*) Nếu sai lỗi chính tả thì bạn fải tự tìm mà sửa thôi
Thay vì Thúy = Thúy + Ổi
Bạn lại nhập Thúy = Thúi + Ổi thì chả ai giúp cho đâu, trừ fi bạn xài Option Eplicit

Còn các loại lỗi khác thì nhờ các công cụ khác, như MsgBox, {F8}, . . . .
 
Upvote 0
(*) Nếu sai lỗi chính tả thì bạn fải tự tìm mà sửa thôi
Thay vì Thúy = Thúy + Ổi
Bạn lại nhập Thúy = Thúi + Ổi thì chả ai giúp cho đâu, trừ fi bạn xài Option Eplicit

Còn các loại lỗi khác thì nhờ các công cụ khác, như MsgBox, {F8}, . . . .
OH, để tìm được lời giải của Bác ở bên ví dụ trên mà em mò lên mò xuống
với đoạn code:


[GPECODE=vb]
Function TimTen(Ma As String, Vung As Range) As Variant
Dim sRng As Range, MyAdd As String

Set sRng = Vung.Find(Ma, , xlFormulas, xlPart)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
TimTen = sRng.Offset(, 1)
Set sRng = Vung.FindNext(sRng)
If sRng Is Nothing Then Exit Do
Loop While sRng.Address <> MyAdd
End If
End Function



[/GPECODE]
 
Upvote 0
Đối với cửa sổ immediate thì nó chỉ có chức năng test thui ah, thế mà em cứ nghĩ là nó có chức năng fix code để từ đó sửa lại code chứ.
Vậy cho em hỏi nếu 1 dòng code bị viết sai thì làm sao và bằng cách nào em có thể sửa nó ah?

Một trong những công việc Debug là "thử sửa trị biến" và "thử code kiểu khác" để xem kết quả có khác ho không. Xem lại bài "kỹ thuật debug"(?) của Nguyễn Duy Tuân.
Bạn ndu chỉ nói đại khái, bạn cần suy nghĩ cho rộng hơn: "TEST CODE" bao gồm Debug, Debug thường thuờng phải sửa code, sửa dữ liệu. Cái từ "Immediate" có nghĩa là "lâm thời"
 
Upvote 0
...
Trong hàm người dùng thì mình chưa có cách nào sửa được; (Nói thêm: Mình cảm giác rằng Excel đang vây mượn cửa sổ này để xài tạm thôi trong giây lát.)
...

Excel có một sô quy luật khi chạy hàm người dùng trong worksheet:
1. Hàm không được chĩnh sửa dữ liệu trong bất cứ phần nào của các sheets. Nếu chạy trong Immedaite thì được
2. Nếu bị lỗi, kể cả lỗi 1 trên, hàm sẽ trả về #VALUE!. Immediate thường sẽ ngưng chạy nếu gặp lỗi.

Nếu bạn bẫy lỗi trong cái hàm trên và duyêt từng trường hợp thì sẽ nghiệm thấy lý do.
 
Upvote 0
Web KT

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

Back
Top Bottom