Hỏi về vấn đề gọi Procedure có tham số (1 người xem)

Liên hệ QC

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

phibonaxi

Thành viên mới
Tham gia
3/8/09
Bài viết
49
Được thích
1
Giả sử tôi có viết một sub
Public Sub MyTest(oMyvariable as integer)
msgbox "Number is " & oMyvariable
end Sub

Bây giờ tôi muốn gọi từ Allication.onKey "{Right}","MyTest"

Làm sao để truyền tham số cho MyTest?

Tôi đã thử

Allication.onKey "{Right}","MyTest(1)"

hay

a = 1
Allication.onKey "{Right}","MyTest(a)"

nhưng đều bị lỗi.

Xin các Thầy Cô GPE hướng dẫn!
 
Lần chỉnh sửa cuối:
Giả sử tôi có viết một sub
Public Sub MyTest(oMyvariable as integer)
MyTest = oMyvariable + 1
end Sub

Bây giờ tôi muốn gọi từ Allication.onKey "{Right}","MyTest"

Làm sao để truyền tham số cho MyTest?

Tôi đã thử

Allication.onKey "{Right}","MyTest(1)"

hay

a = 1
Allication.onKey "{Right}","MyTest(a)"

nhưng đều bị lỗi.

Xin các Thầy Cô GPE hướng dẫn!
Làm gì có Sub nào lại có phép gán thế này nhỉ? MyTest = oMyvariable + 1
Bạn thử lại như sau xem:
1. Tạo Sub:
[GPECODE=vb]Public Sub MyTest(oMyvariable As Integer)
MsgBox oMyvariable + 1
End Sub[/GPECODE]
2. Gọi sub trên qua một sub trung gian:
[GPECODE=vb]Sub Test()
Dim a As Integer
a = 1
MyTest (a)
End Sub[/GPECODE]
 
Upvote 0
nghiaphuc hiểu sai ý tôi rồi. Tôi biết cách gọi thông thường, nhưng một số trường hợp chúng ta lại đặt tên Sub trong ngoặc kép, ví dụ như Application.Onkey, thì tôi không biết cách truyền tham số như thế nào.
 
Upvote 0
nghiaphuc hiểu sai ý tôi rồi. Tôi biết cách gọi thông thường, nhưng một số trường hợp chúng ta lại đặt tên Sub trong ngoặc kép, ví dụ như Application.Onkey, thì tôi không biết cách truyền tham số như thế nào.

nghiaphuc hiểu đúng mà

Allication.onKey "{Right}","Test"
 
Lần chỉnh sửa cuối:
Upvote 0
nghiaphuc hiểu sai ý tôi rồi. Tôi biết cách gọi thông thường, nhưng một số trường hợp chúng ta lại đặt tên Sub trong ngoặc kép, ví dụ như Application.Onkey, thì tôi không biết cách truyền tham số như thế nào.

Tóm lại là thêm 1 Sub nữa (Sub "thường") rồi muốn Onkey gì gì đó phải thông qua cái Sub "thường" này
 
Upvote 0
Chào các Thầy,
Tôi thấy rằng đối với Application.OnKey "{Right}", "Test" thì chúng ta gọi Sub Test và sub Test được đặt trong dấu ngoặc kép.

Ví dụ tôi có
Sub MyTest(a as integer)
Msgbox "Ban chon so " & a
End Sub

Tôi có một Sub khác
Sub Main()
For i=1 to 20
Application.OnKey "{Right}", "____"
Next i
End Sub

Tôi muốn gọi Sub MyTest và truyền tham số i vào, giống như MyTest(i) thì trong dấu màu đỏ phải viết như thế nào? Tôi đã thử Application.OnKey "{Right}", "MyTest(i)" nhưng không được.

Vì nếu dùng một Sub nữa, tôi cũng không nghĩ ra là phải viết ra sao? Con số từ 1 đến 20 có thể thay đổi và ta không biết trước.

Có thể câu hỏi của tôi hơi 'gà', vì tôi còn đang cố gắng học hỏi. Vì tôi nhận thấy rằng, trong một số trường hợp, tên Sub cần gọi được đặt trong dấu ngoặc kép " ", vậy cách truyền tham số như thế nào? Đây là điều tôi đang học hỏi, hi vọng sẽ nhận được sự giúp đỡ của các Thầy trong GPE.

P/S: Hay theo cách hiểu của tôi từ thây ndu, chúng ta không thể truyền tham số cho Sub khi nó đặt trong dấu ngoặc kép, mà phải thông qua một Sub trung gian?
 
Upvote 0
Chào các Thầy,
Tôi thấy rằng đối với Application.OnKey "{Right}", "Test" thì chúng ta gọi Sub Test và sub Test được đặt trong dấu ngoặc kép.
....................
Có thể câu hỏi của tôi hơi 'gà', vì tôi còn đang cố gắng học hỏi. Vì tôi nhận thấy rằng, trong một số trường hợp, tên Sub cần gọi được đặt trong dấu ngoặc kép " ", vậy cách truyền tham số như thế nào? Đây là điều tôi đang học hỏi, hi vọng sẽ nhận được sự giúp đỡ của các Thầy trong GPE.
....................

Bạn ơi cú pháp của Bác Bill viết như thế này:

expression.OnKey(Key, Procedure)

Thì không thể nào làm khác hơn được đâu. Tốt nhất bạn gởi file lên và nói rõ yêu cầu thì may ra sẽ có hướng khác lại đáp ứng đúng yêu cầu của bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các Thầy,
Tôi thấy rằng đối với Application.OnKey "{Right}", "Test" thì chúng ta gọi Sub Test và sub Test được đặt trong dấu ngoặc kép.

Ví dụ tôi có
Sub MyTest(a as integer)
Msgbox "Ban chon so " & a
End Sub

Tôi có một Sub khác
Sub Main()
For i=1 to 20
Application.OnKey "{Right}", "____"
Next i
End Sub

Tôi muốn gọi Sub MyTest và truyền tham số i vào, giống như MyTest(i) thì trong dấu màu đỏ phải viết như thế nào? Tôi đã thử Application.OnKey "{Right}", "MyTest(i)" nhưng không được.

Vì nếu dùng một Sub nữa, tôi cũng không nghĩ ra là phải viết ra sao? Con số từ 1 đến 20 có thể thay đổi và ta không biết trước.

Có thể câu hỏi của tôi hơi 'gà', vì tôi còn đang cố gắng học hỏi. Vì tôi nhận thấy rằng, trong một số trường hợp, tên Sub cần gọi được đặt trong dấu ngoặc kép " ", vậy cách truyền tham số như thế nào? Đây là điều tôi đang học hỏi, hi vọng sẽ nhận được sự giúp đỡ của các Thầy trong GPE.

P/S: Hay theo cách hiểu của tôi từ thây ndu, chúng ta không thể truyền tham số cho Sub khi nó đặt trong dấu ngoặc kép, mà phải thông qua một Sub trung gian?

Mình thấy yêu cầu cũng được giải quyết thông qua biến Public. Ta cấp giá trị cho các biến sau đó gọi Sub và Sub này lấy từ các biến Public cũng ổn. Nó chỉ khác cơ chế truyền tham số còn hiệu quả như nhau thôi.
 
Upvote 0
Triển khai ý tưởng của anh sealand thì toàn bộ code trong module chỉ là thế này (nếu tác giả thực sự muốn sử dụng phương thức OnKey):
[GPECODE=vb]Public a As Integer
Sub MyTest()
MsgBox a
End Sub
Sub Main()
a = InputBox("Nhap mot so tu nhien:")
Application.OnKey "{Right}", "MyTest"
End Sub[/GPECODE]
 
Upvote 0
Cảm ơn thầy sealand, quanghainghiaphuc
Hiện tôi cũng sử dụng Public variable như của thầy sealand.
Như đã đề cập, tôi muốn học cách truyền tham số trực tiếp khi mà Sub cần gọi đặt trong dấu ngoặc kép, chứ không chỉ riêng OnKey, ví dụ như .OnAction = "MySub", thì vẫn phải đặt trong dấu ngoặc kép.

Theo như thầy sealand, bây giờ chỉ có một cách duy nhất là dùng Public Variable, tôi sẽ theo cách đó. Trước giờ tôi vẫn tin rằng có một cách trực tiếp, dù đã search rất nhiều trên google nhưng vẫn không có kết quả.

Cám ơn tất cả các thầy
 
Upvote 0
Thường thì ta không nên làm điều này nhưng để truyền tham số thì có thể dùng cách này - cũng cực chẳng đã.
Vì ông Bill đòi thủ tục chứ không phải hàm vì thế cách truyền tham số cũng phải viết theo hướng đó. Ví dụ, tôi làm thế này thì cũng vẫn được! Nhưng ít khi tôi dùng kiểu Hard-Code như thế này mà nên chọn cách làm mềm dẻo hơn của các bác trong thread này.
[GPECODE=vb]Application.OnKey "{F3}", "'ShowSelectForm ""1""'"
'/////Sửa lại phần của bạn thế này
Sub MyTest(Optional MyVariable as Long)
MsgBox MyVariable
End Sub

Sub Main()
Application.OnKey "{Right}", "'MyTest ""1""'"
End Sub
[/GPECODE]
Với bài của bạn thì là dư lày...
 
Lần chỉnh sửa cuối:
Upvote 0
Không cần phải "hardcode". Hàm OnKey có cách chuyển luôn một đoạn chuỗi lệnh. Chuỗi lệnh này gần giống như cách gọi hàm không có dấu ngoặc ().
Cách gọi: Ham ThamSo1, ThamSo2,...
(không phải tại ông biêu ông biếc đòi hỏi đwacj biệt gì cả, thủ tục chuỗi lệnh bình thường là vậy. Nếu qua bên mấy hệ Unix thì đại khái cũng thế thôi)

Những điều cần làm:
1. Gói chuỗi lệnh giữa 2 dấu nháy đơn (apostrophe) để cho OnKey biết đó là một chuỗi lệnh.
2. Nếu tham lá số thì để dang string, nếu là chuõi thì đóng giữa hai dấu nháy kép (quotes) - vì dấu nháy kép được đưa vào chuỗi nên phải nhân đôi chúng lên. (xem ví dụ của paulsteigel)

Trong câu hỏi của chủ thớt dùng số thì có thể dùng

Allication.onKey "{Right}","'MyTest 1'"
Hoặc
a = 1
tenHam = "MyTest"
Allication.onKey "{Right}", "'" & tenHam & " " & a & "'"

Chú ý: cách này chỉ áp dụng được cho VBA, nếu hàm gọi từ ngôn ngữ khác phải dùng cách khác.
 
Upvote 0
Không cần phải "hardcode". Hàm OnKey có cách chuyển luôn một đoạn chuỗi lệnh. Chuỗi lệnh này gần giống như cách gọi hàm không có dấu ngoặc ().
Bạn không hiểu chữ Hard-code mà tôi định nói ở đây rồi... (Hoặc là do tôi nói hơi tối nghĩa - xin gia đình thông cảm). Ý tôi muốn nói là: Với những sự kiện đặc biệt như tình huống bắt phím Onkey, thường người ta sẽ muốn sử dụng nó cho một tính năng đặc biệt toàn cục, vì thế nhu cầu sử dụng lại cho nhiều bối cảnh khác nhau là cần thiết. Do đó, gắn "chết" cho nó một tham số (ở đây là 1 chẳng hạn) thường sẽ làm mất đi tính "mềm dẻo".
Bản thân việc truyền tham số vào cho onkey với việc gắn một biến dạng [[Allication.onKey "{Right}", "'" & tenHam & " " & a & "'"]] thì cũng đã là Hard-coded rồi.
Đây chính là lý do mà người ta ít khi dùng kiểu này, trừ trường hợp bắt buộc phải làm thế. Cách dùng một thủ tục chính để rẽ nhánh ra các chương trình con vẫn nên là cách giản tiện và hiệu quả nhất.
Việc làm một Onkey với dạng truyền tham số động khi thực thi là không thể, ngoại trừ phải phải thiết lập lại Onkey khi cần những thao tác với tham số khác. Đấy là điểm hạn chế.
Xin có vài dòng lãng đãng.
 
Lần chỉnh sửa cuối:
Upvote 0
Dùng ít thì không sao cả. Dùng nhiều thì người ta viết một cái mô đun đóng gói (thường là wrapper class) bỏ vào thư viện. Khi cần chỉ việc import mô đun và gọi hàm thoải mái. Lúc đó hardcode hay không là chuyện của code trong class, code chính không cần biết tới.
 
Upvote 0

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

Back
Top Bottom