Xin hỏi về Assign Macro cho Commandbutton

Liên hệ QC

ca_heo

Thành viên mới
Tham gia
3/1/08
Bài viết
6
Được thích
0
Em mới tập tọe VBA, có điều này xin các anh chỉ giáo :
Trong bảng tính em tạo tự động một số commandbutton và assign chúng về cùng 1 macro. Vấn đề ở đây là làm thế nào trong đoạn mã của Macro đó em có thể biết là command button nào đã gọi đến nó.
Xin cám ơn ...
 
ca_heo đã viết:
Em mới tập tọe VBA, có điều này xin các anh chỉ giáo :
Trong bảng tính em tạo tự động một số commandbutton và assign chúng về cùng 1 macro. Vấn đề ở đây là làm thế nào trong đoạn mã của Macro đó em có thể biết là command button nào đã gọi đến nó.
Xin cám ơn ...

+ Oh, thường 1 nút thì gán 1 macro thôi chứ,

* Nếu bạn một muốn gán các nút đến chung 1 đoạn mã tính toán thì bạn làm như sau:

- Lập 1 Sub dùng chung chứa đoạn mã chung tính toán trên và có 1 tham số truyền vào để nhận dạng ai gọi nó

- Mỗi nút vẫn gán 1 macro - và macro này gọi đến Sub chung kia với 1 tham số nhận dạng nó

.
 
Upvote 0
Ý bạn ấy muốn hỏi làm sao biết Button nào đang gọi Sub ấy! 3 Button cùng Asign 1 macro, vậy cái hiện tại macro đang chạy dc em nào trong 3 Button kia triệu
Có lẽ ý bạn đang muốn đặt điều kiện gì đây, đúng ko? Và nếu là Button 1 gọi thì sẽ chạy thêm cái gì đó, Button 2 gọi sẽ chạy thêm 1 cái khác.. vân vân...
Nếu là thế thì làm như sau:
1> Tạo 1 Sub chung (cái macro chính ấy)... Giã sử nó tên là CHINH
2> Khi Assign macro bạn ko nên chỉ đến cái macro ấy mà nên bấm vào mục New... Cữa sổ VBA hiện ra có dạng:
PHP:
Sub Button1_Click()
 
End Sub
Bạn gõ vào ở giữa chử Call CHINH, xuống dòng và thêm code gì đó bạn muốn
Ví dụ:
PHP:
Sub Button1_Click()
    Call CHINH
    Code đễ làm thêm việc gì đó nếu Button 1 gọi
    .....
End Sub
Đây là macro dành cho Button 1, ngoài việc chạy sub chính nó sẽ làm thêm nhiệm vụ nào đó... Tương tự thế với Button 2, Button 3
ANH TUẤN
 
Upvote 0
- Đặt 1 biến đơn dùng chung x.
- Mỗi cmdbutton khi nhấn, gán 1 giá trị cho x, thí dụ cmd1 cho x=1, cmd2 cho x=2 . . .
- mỗi sub của cmdbutton có dạng:
Mã:
Sub cmd1_click ()
x = 1
Call chung
End Sub

- Sub chung có dạng:
Mã:
Sub Chung()
Msgbox " Button so " & x &" goi"
' code chính 
. . . 
 
End Sub

- Hoặc rõ ràng hơn:
Mã:
Sub Chung()
Select case x
Case 1
thongbao = "Ông nội tui kêu tui chạy"
case 2
thongbao = "Bố tui biểu tui chạy"
Case 3
thongbao = "Vợ tui biểu tui chạy"
. . .
End Select
Msgbox thongbao
' Code chính
. . .
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Trên diển đàn này sao lúc nào cũng tồn tại chuyện: Người trã lời phải chờ người hỏi thế nhỉ?
Thiệt bực mình
 
Upvote 0
Xin lỗi bác Anh Tuấn, em đáp lời bác hơi chậm.
Bác anhtuan hiểu gần đúng ý em rồi đấy,em muốn là khi cái sub đấy được gọi thì nó biết thằng button nào triệu đến nó.
Nhưng ý của em ở đây là làm cách nào tất cả các button của em đều gán chung 1 sub cơ. còn cách gán riêng mỗi button 1 sub rồi trong đấy gọi đến 1 sub chung thì dễ quá, em đã không dám hỏi (sợ các bác cười cho thối mũi :D)
Để em nói cụ thể ý tưởng của em để các bác hiểu :
Các bác biết cái cấu trúc sắp xếp dạng cây như cây thư mục trong windows explorer rồi đấy, trong cái bảng (cụ thể là cái schedule) của em có nhiều mục lớn và các mục con trong đó, em muốn tạo một cái nút gắn ở đầu các mục lớn để mỗi lần bấm vào nó sẽ tự động expand hay colapse các mục con của nó.
Viẹc tạo các button và gán sub cho nó em làm bằng code, cái sub của những thằng button này có công dụng như nhau, chỉ phụ thuộc vào vị trí đặt thằng button đó. Vì thế em muốn gán chung cho chúng nó 1 sub, nhưng phải biết thằng button gọi sub đó là thằng nào để tìm vị trí của nó nữa chứ.
đấy, vấn đề của em là thế, mong các bác chỉ giáo, em xin đa tạ
 
Upvote 0
còn cách gán riêng mỗi button 1 sub rồi trong đấy gọi đến 1 sub chung thì dễ quá, em đã không dám hỏi (sợ các bác cười cho thối mũi :D)
Bạn đã biết vậy rồi sao ko làm theo cách này.. hoặc chuyên nghiệp hơn thì theo cách cũa Ptm0412... Việc gì phải tạo thêm rắc rối ko đáng thế!
Có thể chúng tôi chưa rõ lắm về file thực tế cũa bạn... Hay là bạn post file lên và ghi rõ ý tưởng trong đó xem thế nào nhé
ANH TUẤN
 
Upvote 0
Em nói mãi mà bác vẫn kô hiểu cho em :D
Việc tạo nút và gán macro cho nó em tạo bằng code vì thế kô thể tạo event _Click như làm bằng tay được.

Đây là đoạn mã em làm để tạo các button và gán macro :

Sub New_Group()
ActiveSheet.Buttons.Add(ActiveCell.Left + 1, ActiveCell.Top + 1, _

ActiveCell.Width - 2, ActiveCell.Height - 2).Select
With Selection
.Font.Size = 11
.Font.FontStyle = "Bold"
.Caption = "-"
.Placement = xlMoveAndSize
.PrintObject = False
.OnAction = "btn_Group"
End With

End Sub

Em muốn là trong cái macro btn_Group ấy làm sao để biết được thằng button nào triệu nó ra.
 
Upvote 0
Các bác biết cái cấu trúc sắp xếp dạng cây như cây thư mục trong windows explorer rồi đấy, trong cái bảng (cụ thể là cái schedule) của em có nhiều mục lớn và các mục con trong đó, em muốn tạo một cái nút gắn ở đầu các mục lớn để mỗi lần bấm vào nó sẽ tự động expand hay colapse các mục con của nó.
Quả là bạn đang làm phức tạp hoá vấn đề. nếu chỉ cần cái cây thư mục thì làm theo cách Group and out line là được. Xem file kèm ở đây
http://www.giaiphapexcel.com/forum/showthread.php?t=6730
bài số #7. Bài đó tớ kiếm được 1 thùng bia đấy.
 
Upvote 0
Cám ơn bác ptm0412 đã chỉ giáo, quả thật là mình ngớ ngẩn quá, đi làm cái mà Excel nó đã hỗ trợ rồi. Bác trả lời sớm hộ em một tý thì em đỡ mất mấy tiếng lọ mọ.
Nhưng mà cái Group & Outline này trông nó cứ chuối chuối thế nào ý. Thôi cứ dùng tạm cái mình viết vậy, tiếc công làm mà :D

À để tiện kết thúc cho cái topic này một cách có hậu, em xin đưa ra đáp án của câu hỏi em đưa lúc đầu (lọ mọ mãi mới được đấy các bác ạ, dốt quá) :
Trong lời gọi macro gán cho event OnAction em thêm 1 cái tham số là tên của cái button đó, với mỗi button thì tham số là chính tên của nó luôn, thế là trong cái macro của em, em chỉ việc tìm trong shapes collection cái nào có tên như trong tham số là ra cái button đó ngay.
Cái này hay phết, có thể ứng dụng trong nhiều mục đích khác. Tóm gọn một câu là "Truyền tham số cho macro được gán qua OnAction event"
Cám ơn các bác đã quan tâm chỉ giáo.
Mong sẽ có nhiều dịp hợp tác.
 
Upvote 0
Cám ơn bác ptm0412 đã chỉ giáo, quả thật là mình ngớ ngẩn quá, đi làm cái mà Excel nó đã hỗ trợ rồi. Bác trả lời sớm hộ em một tý thì em đỡ mất mấy tiếng lọ mọ

Vấn đề là bạn đặt câu hỏi không rõ nếu rõ thì mọi người sẽ giúp nhanh thôi, hi iiiiiiiiiiiiii
.
 
Upvote 0
Xin tái bút : Còn có một cách khác đơn giản hơn đó là trong macro chỉ cần gọi Application.Caller là biết ngay tên thằng đã "triệu" nó
 
Upvote 0
Web KT
Back
Top Bottom