Hiện nút CommandButton theo điều kiện. (1 người xem)

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

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

khamha

Không có việc gì khó...
Tham gia
4/6/10
Bài viết
662
Được thích
846
Nghề nghiệp
CNVC Laos
Trong UserForm,mình có 9 nút CommandButton và những nút này mặc định bị ẩn.
Mình muốn:
Hiện nút CommandButton ẩn khi tên của CommandButton trùng với dữ liệu được nhập tại TexBox1.
Nhờ các bạn viết cho đoạn Code nhé.Thank
(Mạng chậm quá,ko gửi File được)
 
Trong UserForm,mình có 9 nút CommandButton và những nút này mặc định bị ẩn.
Mình muốn:
Hiện nút CommandButton ẩn khi tên của CommandButton trùng với dữ liệu được nhập tại TexBox1.
Nhờ các bạn viết cho đoạn Code nhé.Thank
(Mạng chậm quá,ko gửi File được)
Cde cho khi form hien
Mã:
Private Sub UserForm_Initialize()
CommandButton1.Visible = False
End Sub
code khi nhập text xong và click đúp
Mã:
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1 = CommandButton1.Caption Then
CommandButton1.Visible = True
End If
End Sub
Tuỳ biến cho số lượng command ban có nhé "VBA excel"
Mình thắc mắc cái bạn đề cập tới là tên hay nhãn "caption"?
 
Lần chỉnh sửa cuối:
Upvote 0
Trong UserForm,mình có 9 nút CommandButton và những nút này mặc định bị ẩn.Mình muốn:Hiện nút CommandButton ẩn khi tên của CommandButton trùng với dữ liệu được nhập tại TexBox1.Nhờ các bạn viết cho đoạn Code nhé.Thank(Mạng chậm quá,ko gửi File được)
Sao bạn thích tự làm khó mình quá nhỉ? Đã có đến 9 nút lệnh thì làm cái ComboBox đi cho dễ chọn lựa và chính xác tên!Còn cái thủ tục tên TextBox sẽ như sau:

Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    On Error Resume Next
    If TextBox1 = "" Then Exit Sub
    If KeyCode = 13 Then
        Me(TextBox1.Text).Visible = True
        Me(TextBox1.Text).SetFocus
    End If
End Sub

Sau khi gõ xong tên của nút lệnh nào đó bấm Enter.

======================

Đúng là diễn đàn chạy chậm phát bệnh luôn đó!
 
Upvote 0
Trong UserForm,mình có 9 nút CommandButton và những nút này mặc định bị ẩn.
Mình muốn:
Hiện nút CommandButton ẩn khi tên của CommandButton trùng với dữ liệu được nhập tại TexBox1.
Nhờ các bạn viết cho đoạn Code nhé.Thank
(Mạng chậm quá,ko gửi File được)
Anh thử code sau xem sao:
[GPECODE=vb]Private Sub TextBox1_Change()
Dim Ctrl As Control
For Each Ctrl In Me.Controls
If Ctrl.Name <> "TextBox1" Then Ctrl.Visible = (Ctrl.Name = TextBox1)
Next
End Sub[/GPECODE]
Anh có thể thay sự kiện Change bởi 1 sự kiện khác cho phù hợp (AfterUpdate, DblClick,...)
 
Upvote 0
Trong UserForm,mình có 9 nút CommandButton và những nút này mặc định bị ẩn.
Mình muốn:
Hiện nút CommandButton ẩn khi tên của CommandButton trùng với dữ liệu được nhập tại TexBox1.
Nhờ các bạn viết cho đoạn Code nhé.Thank
(Mạng chậm quá,ko gửi File được)
Bạn gửi File lên đi, tôi làm tổng quát cho bạn! Vấn đề là bạn phải chỉ rõ nút nào cần ẩn hiện.
 
Upvote 0
Bác thử xem file kèm theo xem (em mới tải lại), lười nên chỉ tạo 4 CommandButton. Bác chỉ cần gõ tên trong TextBox là nó hiện ra. Quên là không giải phóng biến đối tượng.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tôi nghĩ tác giả vì muốn tiết kiệm diện tích của Form (dành cho các controls khác) nên muốn sử dụng nút lệnh nào đó khi cần, vì thế mới làm Form kiểu này.

Do đó, tôi "thiết kế" cho bạn đó một kiểu form với ComboBox (CBB) để chọn lựa, hơn là phải gõ sẽ mất thời gian và chưa chắc đã chính xác.

Khi đã chọn lựa một tên nút lệnh trong CBB rồi Enter thì nút lệnh mới sẽ được hiện ra và nút lệnh cũ sẽ ẩn đi, đồng thời vị trí của nút lệnh mới nằm ngay vị trí của nút lệnh cũ.

(Với form này, trong môi trường thiết kế, các bạn kéo rộng ra mới thấy các nút lệnh còn lại)

Code cũng đơn giản như sau:

[GPECODE=vb]Private OldCmdBttn As String


Private Sub UserForm_Initialize()
Dim i As Long
For i = 1 To 9
ComboBox1.AddItem "CommandButton" & i
Next
End Sub


Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
With ComboBox1
If .MatchFound And .Text <> OldCmdBttn Then
If KeyCode = 13 Then
If OldCmdBttn <> "" Then Me(OldCmdBttn).Visible = False
With Me(.Text)
.Left = CommandButton1.Left
.Top = CommandButton1.Top
.Visible = True
.SetFocus
End With
OldCmdBttn = .Text
End If
End If
End With
End Sub
[/GPECODE]

P/s: Hoặc bạn dùng sự kiện Change thay cho sự kiện KeyDown:

[GPECODE=vb]Private Sub ComboBox1_Change()
With ComboBox1
If .MatchFound And .Text <> OldCmdBttn Then
If OldCmdBttn <> "" Then Me(OldCmdBttn).Visible = False
With Me(.Text)
.Left = CommandButton1.Left
.Top = CommandButton1.Top
.Visible = True
End With
OldCmdBttn = .Text
Else
If OldCmdBttn <> "" Then Me(OldCmdBttn).Visible = False
End If
End With
End Sub
[/GPECODE]
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tôi nghĩ tác giả vì muốn tiết kiệm diện tích của Form (dành cho các controls khác) nên muốn sử dụng nút lệnh nào đó khi cần, vì thế mới làm Form kiểu này.

Do đó, tôi "thiết kế" cho bạn đó một kiểu form với ComboBox (CBB) để chọn lựa, hơn là phải gõ sẽ mất thời gian và chưa chắc đã chính xác.

Khi đã chọn lựa một tên nút lệnh trong CBB rồi Enter thì nút lệnh mới sẽ được hiện ra và nút lệnh cũ sẽ ẩn đi, đồng thời vị trí của nút lệnh mới nằm ngay vị trí của nút lệnh cũ.

(Với form này, trong môi trường thiết kế, các bạn kéo rộng ra mới thấy các nút lệnh còn lại)

Code cũng đơn giản như sau:

[GPECODE=vb]Private OldCmdBttn As String


Private Sub UserForm_Initialize()
Dim i As Long
For i = 1 To 9
ComboBox1.AddItem "CommandButton" & i
Next
End Sub


Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
With ComboBox1
If .MatchFound And .Text <> OldCmdBttn Then
If KeyCode = 13 Then
If OldCmdBttn <> "" Then Me(OldCmdBttn).Visible = False
With Me(.Text)
.Left = CommandButton1.Left
.Top = CommandButton1.Top
.Visible = True
.SetFocus
End With
OldCmdBttn = .Text
End If
End If
End With
End Sub
[/GPECODE]

P/s: Hoặc bạn dùng sự kiện Change thay cho sự kiện KeyDown:

[GPECODE=vb]Private Sub ComboBox1_Change()
With ComboBox1
If .MatchFound And .Text <> OldCmdBttn Then
If OldCmdBttn <> "" Then Me(OldCmdBttn).Visible = False
With Me(.Text)
.Left = CommandButton1.Left
.Top = CommandButton1.Top
.Visible = True
End With
OldCmdBttn = .Text
Else
If OldCmdBttn <> "" Then Me(OldCmdBttn).Visible = False
End If
End With
End Sub
[/GPECODE]

Cách của bạn Nghĩa đúng là tiết kiệm được diện tích...Thank.
Quên ko nêu rõ:
1, Các CommandButton "mục tiêu" sẽ được định dạng ẩn sẵn ,Còn các CommandButton khác sẽ hiện bình thường.
2, Điều kiện để hiện CommandButton là: tên của CommandButton "Caption" nào trùng với dữ liệu trên TextBox1 thì sẽ hiện.
Bạn giúp mình nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Cách của bạn Nghĩa đúng là tiết kiệm được diện tích...Thank.
Quên ko nêu rõ:
1, Các CommandButton "mục tiêu" sẽ được định dạng ẩn sẵn ,Còn các CommandButton khác sẽ hiện bình thường.
2, Điều kiện để hiện CommandButton là: tên của CommandButton "Caption" nào trùng với dữ liệu trên TextBox1 thì sẽ hiện.
Bạn giúp mình nhé.

1) Với cái file tôi đã gửi, bạn thêm bao nhiêu cái CommandButton thì nó có ẩn đâu mà lo!

2) Nếu chọn theo Caption thì cũng đơn giản thôi, miễn là ta biết cách đặt tên (Name chứ không phải Caption nha) cho hợp lý, rồi vận dụng INDEX của ComboBox để gọi tên thì không cần dùng bất cứ vòng lặp nào cả!

Giả sử tôi có 9 nút lệnh có Caption "Hoàng Trọng Nghĩa X" và Name của chúng vẫn không thay đổi "CommandButtonX" (với X chạy từ 1 đến 9)

Thì code để gọi chúng ẩn hiện như sau:

[GPECODE=vb]Private Sub ComboBox1_Change()
With ComboBox1
If .MatchFound Then
With Me("CommandButton" & .ListIndex + 1)
If .Name <> OldCmdBttn Then
If OldCmdBttn <> "" Then Me(OldCmdBttn).Visible = False
.Left = CommandButton1.Left
.Top = CommandButton1.Top
.Visible = True
OldCmdBttn = .Name
End If
End With
Else
If OldCmdBttn <> "" Then Me(OldCmdBttn).Visible = False
OldCmdBttn = ""
End If
End With
End Sub[/GPECODE]

Ta thay đổi tại điểm này:

With Me("CommandButton" & .ListIndex + 1)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Áp dụng cái Code của bạn Nghia vào việc khác mà ko được ,bạn xem File và giúp mình nhé.Thank
http://laoupload.com/SBW9O707KD4N/CodeHienCommandbutton.zip.html

Tôi hỏi bạn một lần nữa, bạn vẫn quyết định dùng TEXTBOX hay dùng COMBOBOX như tôi đã đề nghị để sử dụng trong file của bạn vậy?

Và khi hiển thị FRAME, nó có cần thiết phải di chuyển đến một vị trí nhất định không hay là đặt ở đâu thì hiện tại đó?
 
Lần chỉnh sửa cuối:
Upvote 0
Mình cần:
1, Dùng TextBox.
2, khi hiển thị FRAME, nó phảii di chuyển đến một vị trí nhất định.
Thank bạn.
 
Upvote 0
Dù muốn, dù không, tôi vẫn làm theo kiểu COMBOBOX vì nó hợp lý nhất, không phải gõ thủ công.


Các thủ tục trong Form:

[GPECODE=vb]Private OldFrame As String


Private Sub UserForm_Initialize()
Dim i As Byte
For i = 1 To 9
Me("Frame" & i).Caption = Sheets("Sheet1").Range("N" & i)
ComboBox1.AddItem Me("Frame" & i).Caption
Next
'Neu muon hien ten "khamha1":
ComboBox1.ListIndex = 0
End Sub


Private Sub ComboBox1_Change()
With ComboBox1
If .MatchFound Then
With Me("Frame" & .ListIndex + 1)
If .Name <> OldFrame Then
If OldFrame <> "" Then Me(OldFrame).Visible = False
.Left = Frame1.Left
.Top = Frame1.Top
.Visible = True
OldFrame = .Name
End If
End With
Else
If OldFrame <> "" Then Me(OldFrame).Visible = False
OldFrame = ""
End If
End With
End Sub


[/GPECODE]
 

File đính kèm

Upvote 0
Mình muốn dùng TextBox vì lý do:
Chỉ cho hiện tên của người đang mở File Và họ chỉ có quyền mở được cái Frame của họ thôi.
 
Upvote 0
Mình muốn dùng TextBox vì lý do:
Chỉ cho hiện tên của người đang mở File Và họ chỉ có quyền mở được cái Frame của họ thôi.

OK, vậy thì làm theo kiểu của bạn vậy!

Toàn bộ code trong Form sẽ như sau:

[GPECODE=vb]Private OldFrame As String, FrameArr(1 To 9)


Private Sub UserForm_Initialize()
Dim i As Byte
For i = 1 To 9
Me("Frame" & i).Caption = Sheets("Sheet1").Range("N" & i)
FrameArr(i) = Me("Frame" & i).Name
Next
TextBox1 = Sheets("Sheet1").Range("A1")
End Sub


Private Sub CommandButton1_Click()
With TextBox1
If Trim(.Text) = "" Then
MsgBox "Please insert your name here!"
.SetFocus
Else
Dim FindRange As Range
Set FindRange = Range("N1:N9").Find(.Text, LookIn:=xlValues, LookAt:=xlWhole)
If FindRange Is Nothing Then
MsgBox "Your name is incorrect!"
If OldFrame <> "" Then Me(OldFrame).Visible = False
OldFrame = ""
.SetFocus: .SelStart = 0: .SelLength = Len(.Text)
Else
With Me(FrameArr(FindRange.Row))
If .Name <> OldFrame Then
If OldFrame <> "" Then Me(OldFrame).Visible = False
.Left = Frame1.Left
.Top = Frame1.Top
.Visible = True
OldFrame = .Name
End If
End With
End If
End If
End With
End Sub


[/GPECODE]
 

File đính kèm

Upvote 0

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

Back
Top Bottom