Cách tạo User form chỉ thực hiện các tùy chọn khi người dùng ấn vào nút CommandButton (1 người xem)

  • Thread starter Thread starter vba_gpe
  • Ngày gửi Ngày gửi
Liên hệ QC

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

vba_gpe

Thành viên thường trực
Tham gia
15/12/10
Bài viết
296
Được thích
44
Nghề nghiệp
Thất nghiệp
- Nhờ anh chị trong diễn đàn chỉ giúp mình vấn đề này nhé:
- Mình tạo ra một userform trong đó gồm các MultilPage.
Trong mỗi MultiPage có nhiều Checkbox và OptionButton. Thông thường thì khi Click vào Checkbox hay OptionButton thì Excel sẽ chạy đoạn macro mình gán.
Mình tạo ra một Command Button ten "OK".
Vấn đề ở đây mình muốn tham khảo là làm cách nào để khi Click vào Checkbox hay OptionButton, Excel không chay ngay lập tức, mà chỉ chạy các tùy chọn trong Checkbox hay OptionButton khi mình Click chọn vào nút "OK". (Nút OK sẽ chạy các tùy chọn trong nhiều checkbox và OptionButton).
Có nghĩa là mọi tùy chọn trong user form sẽ không chạy ngay , mà phải thông qua Command Button "OK".

Thân.
Mong được giúp đỡ của anh chị trong diễn đàn.
 
- Nhờ anh chị trong diễn đàn chỉ giúp mình vấn đề này nhé:
- Mình tạo ra một userform trong đó gồm các MultilPage.
Trong mỗi MultiPage có nhiều Checkbox và OptionButton. Thông thường thì khi Click vào Checkbox hay OptionButton thì Excel sẽ chạy đoạn macro mình gán.
Mình tạo ra một Command Button ten "OK".
Vấn đề ở đây mình muốn tham khảo là làm cách nào để khi Click vào Checkbox hay OptionButton, Excel không chay ngay lập tức, mà chỉ chạy các tùy chọn trong Checkbox hay OptionButton khi mình Click chọn vào nút "OK". (Nút OK sẽ chạy các tùy chọn trong nhiều checkbox và OptionButton).
Có nghĩa là mọi tùy chọn trong user form sẽ không chạy ngay , mà phải thông qua Command Button "OK".

Thân.
Mong được giúp đỡ của anh chị trong diễn đàn.
Giả sử trên Form có 4 Checkbox (1~4) và 4 OptionButton (1~4), bạn có thể sử dụng code sau:
Mã:
Private Sub CommandButton1_Click()
    If CheckBox1 Then
        MsgBox "Chay Macro tuong ung voi CheckBox1."
        'Chen doan code cua CheckBox1 vao day
    End If
    If CheckBox2 Then
        MsgBox "Chay Macro tuong ung voi CheckBox2."
        'Chen doan code cua CheckBox2 vao day
    End If
    If CheckBox3 Then
        MsgBox "Chay Macro tuong ung voi CheckBox3."
        'Chen doan code cua CheckBox3 vao day
    End If
    If CheckBox4 Then
        MsgBox "Chay Macro tuong ung voi CheckBox4."
        'Chen doan code cua CheckBox4 vao day
    End If
    If OptionButton1 Then
        MsgBox "Chay Macro tuong ung voi OptionButton1."
        'Chen doan code cua OptionButton1 vao day
    End If
    If OptionButton2 Then
        MsgBox "Chay Macro tuong ung voi OptionButton2."
        'Chen doan code cua OptionButton2 vao day
    End If
    If OptionButton3 Then
        MsgBox "Chay Macro tuong ung voi OptionButton3."
        'Chen doan code cua OptionButton3 vao day
    End If
    If OptionButton4 Then
        MsgBox "Chay Macro tuong ung voi OptionButton4."
        'Chen doan code cua OptionButton4 vao day
    End If
End Sub
Trong code trên, tại các vị trí chú thích (VD: 'Chen doan code cua CheckBox1 vao day,...), bạn có thể tách thành từng Sub riêng và thay vào vị trí đó là câu lệnh gọi Sub. Giả sử vị trí 'Chen doan code cua Checkbox1 vao day được tách thành Sub Chk1 thì toàn bộ đoạn này
Mã:
If CheckBox1 Then
      MsgBox "Chay Macro tuong ung voi CheckBox1."
      'Chen doan code cua CheckBox1 vao day
End If
chỉ cần thay bởi 1 câu lệnh If CheckBox1 Then Chk1 là đủ.
Bạn xem trong file đính kèm nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Giả sử trên Form có 4 Checkbox (1~4) và 4 OptionButton (1~4), bạn có thể sử dụng code sau:
Mã:
Private Sub CommandButton1_Click()
    If CheckBox1 Then
        MsgBox "Chay Macro tuong ung voi CheckBox1."
        'Chen doan code cua CheckBox1 vao day
    End If
    If CheckBox2 Then
        MsgBox "Chay Macro tuong ung voi CheckBox2."
        'Chen doan code cua CheckBox2 vao day
    End If
    If CheckBox3 Then
        MsgBox "Chay Macro tuong ung voi CheckBox3."
        'Chen doan code cua CheckBox3 vao day
    End If
    If CheckBox4 Then
        MsgBox "Chay Macro tuong ung voi CheckBox4."
        'Chen doan code cua CheckBox4 vao day
    End If
    If OptionButton1 Then
        MsgBox "Chay Macro tuong ung voi OptionButton1."
        'Chen doan code cua OptionButton1 vao day
    End If
    If OptionButton2 Then
        MsgBox "Chay Macro tuong ung voi OptionButton2."
        'Chen doan code cua OptionButton2 vao day
    End If
    If OptionButton3 Then
        MsgBox "Chay Macro tuong ung voi OptionButton3."
        'Chen doan code cua OptionButton3 vao day
    End If
    If OptionButton4 Then
        MsgBox "Chay Macro tuong ung voi OptionButton4."
        'Chen doan code cua OptionButton4 vao day
    End If
End Sub
Trong code trên, tại các vị trí chú thích (VD: 'Chen doan code cua CheckBox1 vao day,...), bạn có thể tách thành từng Sub riêng và thay vào vị trí đó là câu lệnh gọi Sub. Giả sử vị trí 'Chen doan code cua Checkbox1 vao day được tách thành Sub Chk1 thì toàn bộ đoạn này
Mã:
If CheckBox1 Then
      MsgBox "Chay Macro tuong ung voi CheckBox1."
      'Chen doan code cua CheckBox1 vao day
End If
chỉ cần thay bởi 1 câu lệnh If CheckBox1 Then Chk1 là đủ.
Bạn xem trong file đính kèm nhé.

Bạn thay thế = vòng lặp thì code ngắn hơn nhiều.

Mã:
Private Sub CommandButton1_Click()
Dim i As Integer
  For i = 1 To 4
     If Controls("OptionButton" & i).Value = True Then _
         MsgBox "Chay Macro tuong ung voi " & Controls("OptionButton" & i).Caption
     If Controls("CheckBox" & i).Value = True Then _
         MsgBox "Chay Macro tuong ung voi " & Controls("CheckBox" & i).Caption
  Next

End Sub
 
Upvote 0
Bạn thay thế = vòng lặp thì code ngắn hơn nhiều.

Mã:
Private Sub CommandButton1_Click()
Dim i As Integer
For i = 1 To 4
If Controls("OptionButton" & i).Value = True Then _
MsgBox "Chay Macro tuong ung voi " & Controls("OptionButton" & i).Caption
If Controls("CheckBox" & i).Value = True Then _
MsgBox "Chay Macro tuong ung voi " & Controls("CheckBox" & i).Caption
Next
 
End Sub
Mình biết điều này, tuy nhiên ý của tác giả câu hỏi không phải chỉ đưa ra thông báo là chạy Macro tương ứng với Control nào mà là thực thi chạy các Macro đó (chính vì vậy, trong code của mình có những câu dạng 'Chen doan code cua CheckBox1 vao day).
Nhân tiện, xin hỏi Domfootwear và các anh chị: Giả sử mình đã có các Sub tương ứng với CheckBox1~4Sub Chk1~4 và tương ứng với OptionButton1~4Sub Opt1~4 thì liệu có dùng vòng For để gọi các Sub này như trong code của Domfootwear được không? Câu lệnh có dạng như vầy nè: If Controls("CheckBox" & i).Value = True Then Call "Chk" & i (tất nhiên đây là ý tưởng chứ không phải câu lệnh đúng).
Xin cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn nghiaphuc và bạn Domfootwear
Theo mình nghĩ cách nào cũng có cái hay.
Nếu theo cách của Doofootwear -Dùng vòng lặp for để chạy thì sẽ nhanh, câu lệnh đỡ rối. Tuy nhiên, theo mình nếu giã sử mình quản lý Userform không theo tên mặc định của Excel : "Checkbox1" hay "Optiontion 1" mà mình quản lý theo tên, nhóm riêng của mình, như vậy thì cách của bác domfootwear gặp vấn đề.
Mình tán thành cách của bạn nghiaphuc, mặc dù câu lênh dài, tuy nhiên cái nào xong thì xong luôn, có thể có nhiều tùy chọn. Nếu quản lý Userform không theo mặc định của Excel thì cách này ok.
- Mình nghĩ, bằng cách này nếu chúng ta sử dụng các đối tượng Application trong VB thì chúng ta có thể tạo nên những Userform đặc hiệu cho riêng mình: Ví dụ như chuyển Menu Option trong Excel 2003 sang các phiên bảng office sau này (2010), tạo ra các Quick Bar riêng cho công việc của mỗi người.
Một lần nữa cảm ơn đóng góp của các bạn.
Mong có nhiều đóng góp hay để chúng ta ngày càng làm chủ Excel.
Thân.
 
Upvote 0
Cảm ơn bạn nghiaphuc và bạn Domfootwear
Theo mình nghĩ cách nào cũng có cái hay.
Nếu theo cách của Doofootwear -Dùng vòng lặp for để chạy thì sẽ nhanh, câu lệnh đỡ rối. Tuy nhiên, theo mình nếu giã sử mình quản lý Userform không theo tên mặc định của Excel : "Checkbox1" hay "Optiontion 1" mà mình quản lý theo tên, nhóm riêng của mình, như vậy thì cách của bác domfootwear gặp vấn đề.
Mình tán thành cách của bạn nghiaphuc, mặc dù câu lênh dài, tuy nhiên cái nào xong thì xong luôn, có thể có nhiều tùy chọn. Nếu quản lý Userform không theo mặc định của Excel thì cách này ok.
.
Tôi thì nói rằng: Cho dù bạn có đặt tên các Control theo bất cứ kiểu gì thì tôi cũng For... Next được ---> Bạn tin không?
(Cái của Domfootwear chỉ là 1 ví dụ nhỏ thôi... khi dùng thật sự có hàng trăm cách tùy biến khác nhau)
 
Upvote 0
Tôi thì nói rằng: Cho dù bạn có đặt tên các Control theo bất cứ kiểu gì thì tôi cũng For... Next được ---> Bạn tin không?
(Cái của Domfootwear chỉ là 1 ví dụ nhỏ thôi... khi dùng thật sự có hàng trăm cách tùy biến khác nhau)
Vậy thì còn gì bằng nữa.
Rất hân hạnh được bạn ndu96081631 chỉ giáo. Bạn có thể gửi lên một ví dụ được không, (còn hàng trăm cách tùy biến khác nhau nữa mà). Thế thì tại sao chúng ta không cùng nhau mà "phẩu thuật" nó chứ!!!
Mình chờ câu trả lời của ndu96081631
thân
 
Upvote 0
Vậy thì còn gì bằng nữa.
Rất hân hạnh được bạn ndu96081631 chỉ giáo. Bạn có thể gửi lên một ví dụ được không, (còn hàng trăm cách tùy biến khác nhau nữa mà). Thế thì tại sao chúng ta không cùng nhau mà "phẩu thuật" nó chứ!!!
Mình chờ câu trả lời của ndu96081631
thân
Nếu bạn để ý tìm thì trên diễn đàn này có ít nhất vài chục bài về vấn đề này
Sửa lại code của Domfootwear như sau:
PHP:
Private Sub CommandButton1_Click()
  Dim Ctl As Control
  For Each Ctl In Me.Controls
    If TypeOf Ctl Is OptionButton And Ctl.Value = True Then _
       MsgBox "Chay Macro tuong ung voi " & Ctl.Caption
    If TypeOf Ctl Is MSForms.CheckBox And Ctl.Value = True Then _
       MsgBox "Chay Macro tuong ung voi " & Ctl.Caption
  Next
End Sub
Code này chẳng "ăn nhậu" gì đến việc đặt tên cả (đặt tên sao tùy bạn)
Chỉ là 1 cách trong hàng đóng cách ---> Phức tạp hơn nữa ta dùng Class
 
Upvote 0
Quả đúng là mình phải ghé nơi đây dài dài rồi. ^^ bác ndu6081631 thông cảm nhé, nhiều lúc tranh luận mới ra được vấn đề.
Cảm ơn các bác trong diễn đàn đã quan tâm bài của em. Sẽ còn học hỏi ở mọi người rất nhiều.
Thân.
Chúc mọi người sức khõe, ngũ ngon.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình biết điều này, tuy nhiên ý của tác giả câu hỏi không phải chỉ đưa ra thông báo là chạy Macro tương ứng với Control nào mà là thực thi chạy các Macro đó (chính vì vậy, trong code của mình có những câu dạng 'Chen doan code cua CheckBox1 vao day).
Nhân tiện, xin hỏi Domfootwear và các anh chị: Giả sử mình đã có các Sub tương ứng với CheckBox1~4Sub Chk1~4 và tương ứng với OptionButton1~4Sub Opt1~4 thì liệu có dùng vòng For để gọi các Sub này như trong code của Domfootwear được không? Câu lệnh có dạng như vầy nè: If Controls("CheckBox" & i).Value = True Then Call "Chk" & i (tất nhiên đây là ý tưởng chứ không phải câu lệnh đúng).
Xin cảm ơn!

Hoàn toàn có thể được, bạn thử dùng cách sau nhé.

Mã:
Private Sub CommandButton1_Click()
  Dim i As Integer
  For i = 1 To 4
     If Controls("OptionButton" & i).Value = True Then
        Application.Run("Ops0" & i)
     End If
     If Controls("CheckBox" & i).Value = True Then
        Application.Run("Check0" & i)
     End If
  Next

End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hoàn toàn có thể được, bạn thử dùng cách sau nhé.

Mã:
Private Sub CommandButton1_Click()
  Dim i As Integer
  For i = 1 To 4
     If Controls("OptionButton" & i).Value = True Then
        Run Application.Run("Ops0" & i)
     End If
     If Controls("CheckBox" & i).Value = True Then
        Run Application.Run("Check0" & i)
     End If
  Next

End Sub
Ngay cả tên các Macro được đặt tùy ý vẫn làm được luôn, bằng cách đánh dấu tên macro vào Tag của các Control như sau:
PHP:
Private Sub CommandButton1_Click()
  Dim Ctl As Control
  For Each Ctl In Me.Controls
    If Ctl.Value = True Then Run Ctl.Tag
  Next
End Sub
Xem file... Trong này tôi đặt tên lại các macro tùy ý
 

File đính kèm

Upvote 0
Thêm 1 chiêu nữa: Chỉ chạy tại ActivePage
PHP:
Private i As Long
Private Sub CommandButton1_Click()
  Dim Ctl As Control
  For Each Ctl In Me.MultiPage1.Pages(i).Controls
    If Ctl.Value = True Then Run Ctl.Tag
  Next
End Sub
PHP:
Private Sub MultiPage1_Change()
  i = Me.MultiPage1.Value
End Sub
PHP:
Private Sub UserForm_Initialize()
  i = Me.MultiPage1.Value
End Sub
 

File đính kèm

Upvote 0
PHP:
Private Sub UserForm_Initialize()
  i = Me.MultiPage1.Value
End Sub
Có lần thấy Thầy đố là làm cách nào để Active cái page mà lần trước active, không dùng cell phụ ? Không biết là có câu trả lời chưa ? Đề tài đó em tìm mãi không ra.

Cách đánh dấu tên macro vào Tag của các Control rất hiệu quả. Như cách của em nó rất nhiều hạn chế. Xin Thầy cho biết nguyên nhân tại sao code của em khi đặt tên Macro dưới 4 kí tự thì nó báo lỗi không tìm thấy Macro ?
 
Lần chỉnh sửa cuối:
Upvote 0
Có lần thấy Thầy đố là làm cách nào để Active cái page mà lần trước active, không dùng cell phụ ? Không biết là có câu trả lời chưa ? Đề tài đó em tìm mãi không ra.
Dùng GetSetting và SaveSetting
PHP:
Private Sub UserForm_Initialize()
  With Me.MultiPage1
    .Value = GetSetting("iPage", "CurPage", "Pos", 0)
  End With
End Sub
PHP:
Private Sub UserForm_Terminate()
  With Me.MultiPage1
    SaveSetting "iPage", "CurPage", "Pos", .SelectedItem.Index
  End With
End Sub
Lưu mọi thứ trong Registry thôi
(Hic... đố nhưng chẳng thấy ai quan tâm nên... cóc thèm trả lời... Ẹc... Ẹc...)
Xin Thầy cho biết nguyên nhân tại sao code của em khi đặt tên Macro dưới 4 kí tự thì nó báo lỗi không tìm thấy Macro ?
Tôi test thấy bình thường, trừ trường hợp tên macro trùng với Địa chỉ của 1 cell hoặc tên 1 name nào đó
 
Lần chỉnh sửa cuối:
Upvote 0
Đề tài này cũng lâu em xin phép đào lại tí.
Em đã tạo ra các checkbox và tag tên các sub vào checkbox ok và thành công hết. Nhưng file của em làm ra thì nó có vấn đề sau:
- Sau khi check các box thì nhấn Button 1 nó sẽ thực thi 1 lệnh chọn các sheet ứng với checkbox, copy sheet xong move sheet đó wa workbook khác
- Cũng check các box đó nhưng Button 2 thi nó sẽ chọn các sheet ứng với các checkbox rồi xuất ra PDF. Mong thầy ndu96081631 giúp em ca này http://www.giaiphapexcel.com/forum/member.php?61139-ndu96081631
 

File đính kèm

Upvote 0
Đề tài này cũng lâu em xin phép đào lại tí.
.....

Không nên đào lại kiểu này bạn ơi, bạn viết hơn 100 bài phải hiểu cách hỏi cho thuận chứ? đừng theo chân những cái sai của người khác.

Vì đào lại thế này, bao nhiêu đề tài cứ dài lê thê mấy ngàn bài, mấy trăm bài... bạn đọc lại có thấy hiểu không?, dễ tìm vấn đề không?

Nên tách riêng ra và nếu thấy gần giống thì link đến đề tài cũ để ai đó có thể tham khảo chéo.
 
Upvote 0
Không nên đào lại kiểu này bạn ơi, bạn viết hơn 100 bài phải hiểu cách hỏi cho thuận chứ? đừng theo chân những cái sai của người khác.

Vì đào lại thế này, bao nhiêu đề tài cứ dài lê thê mấy ngàn bài, mấy trăm bài... bạn đọc lại có thấy hiểu không?, dễ tìm vấn đề không?

Nên tách riêng ra và nếu thấy gần giống thì link đến đề tài cũ để ai đó có thể tham khảo chéo.

Mình chuyển wa topic mới rồi
http://www.giaiphapexcel.com/forum/...kboxes-cho-nhiều-mục-đích&p=638850#post638850
 
Upvote 0
Web KT

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

Back
Top Bottom