Găp vấn đề Frame trong VBA

phihndhsp

Thành viên gạo cội
Tham gia ngày
26 Tháng mười hai 2009
Bài viết
3,305
Được thích
2,392
Điểm
860
Picture1.jpg
tôi muốn thiết kế 1 option chọn lựa một trong nhiều giống như trong VB
nhưng sau khi tôi thiết kế xong và thoát khỏi chế độ design thì nó lại ẩn các option đi, có cách nào khi cho nó chạy thì nó vẫn hiện như dạng thiết kế không? xin cảm ơn
 

nghiaphuc

Thành viên gạo cội
Thành viên danh dự
Tham gia ngày
25 Tháng chín 2009
Bài viết
5,722
Được thích
9,528
Điểm
910
Nơi ở
Ayun Pa - Gia Lai
View attachment 76850
tôi muốn thiết kế 1 option chọn lựa một trong nhiều giống như trong VB
nhưng sau khi tôi thiết kế xong và thoát khỏi chế độ design thì nó lại ẩn các option đi, có cách nào khi cho nó chạy thì nó vẫn hiện như dạng thiết kế không? xin cảm ơn
Bây giờ bạn kéo các Option button ra ngoài Frame, sau đó kéo thả vào lại trong Frame. Thêm nữa, kiểm tra lại thuộc tính Visible của chúng.
Nếu vẫn không được thì bạn thử làm lại:
- Vẽ Frame trước.
- Vẽ các Option button vào trong Frame.
 

phihndhsp

Thành viên gạo cội
Tham gia ngày
26 Tháng mười hai 2009
Bài viết
3,305
Được thích
2,392
Điểm
860
Vẫn không được anh nghĩa phúc, khi thoát khỏi chế độ design thì nó mất những option đi, không giống như trong VB(trong VB vẽ tự do và không bao giờ bị lỗi như vậy)
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,269
Được thích
52,662
Điểm
11,910
Vẫn không được anh nghĩa phúc, khi thoát khỏi chế độ design thì nó mất những option đi, không giống như trong VB(trong VB vẽ tự do và không bao giờ bị lỗi như vậy)
Chưa hình dung được vấn đề... bạn thử đưa file lên đây xem thế nào nhé
 

phihndhsp

Thành viên gạo cội
Tham gia ngày
26 Tháng mười hai 2009
Bài viết
3,305
Được thích
2,392
Điểm
860
Anh xem dùm em nha, sau khi thiết kế xong, em thoát chế độ Design thì những nút option ẩn mất, hôm trước hứa gởi anh kg khô mực mà không thấy anh hồi âm gì nên em về quê rồi, có dịp em gởi anh khô nướng nhậu rai rai
 

File đính kèm

ptm0412

Excel Ordinary Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,450
Được thích
28,774
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp
Dùng Groupbox và option button của Form controls sẽ không bị tình trạng đó.
 
Lần chỉnh sửa cuối:

PhanTuHuong

Excel & AutoCad & VBA & VB.NET
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,884
Được thích
23,476
Điểm
1,860
Nơi ở
Hà Nội
Đúng là dùng Form Control hay hơn ActiveX Control (truờng hợp này), lỗi này cũng khó hiểu, giống trường hợp bản Form 2 (hỗ trợ Unicode) của VB6.
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,269
Được thích
52,662
Điểm
11,910
Anh xem dùm em nha, sau khi thiết kế xong, em thoát chế độ Design thì những nút option ẩn mất, hôm trước hứa gởi anh kg khô mực mà không thấy anh hồi âm gì nên em về quê rồi, có dịp em gởi anh khô nướng nhậu rai rai
Thì ra là vậy!
Nói chung, MS đã thiết kế thì phải có cách xài
Hướng dẫn bạn cách dùng Frame trên Sheet như sau:
1> Vẽ 1 Frame lên sheet
2> Click phải vào Frame, chọn Frame Object\Edit ---> 1 Toolbox sẽ hiện ra
3> Nếu không thấy Toolbox xuất hiện, hãy click phải vào Frame lần nữa và chọn Toolbox
4> Trên cửa sổ Toolbox, chọn OptionButton rồi vẽ vào Frame
5> Thoát chế độ Design Mode
Xong!
Lưu ý: Sau này, nếu muốn xóa OptionButton trên Frame, hãy làm lại bước 2
 

File đính kèm

Lần chỉnh sửa cuối:

phihndhsp

Thành viên gạo cội
Tham gia ngày
26 Tháng mười hai 2009
Bài viết
3,305
Được thích
2,392
Điểm
860
dạ em làm được rồi, cảm ơn anh nhiều, chúc anh và gd năm mới vui vẻ
 

duongapt

Thành viên mới
Tham gia ngày
25 Tháng chín 2011
Bài viết
15
Được thích
1
Điểm
365
Sao Việt code cho các đối tượng không được anh oi
 

duongapt

Thành viên mới
Tham gia ngày
25 Tháng chín 2011
Bài viết
15
Được thích
1
Điểm
365
A có thể tạo cho em một file mẫu gồm
Combo box, list box, command
Sao em tạo được rồi mà không biết vào chỗ nào để viết code và viết trên class cũng biết cách khai báo và gọi các đối tượng trên frame
Nhờ a giúp em
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,269
Được thích
52,662
Điểm
11,910
A có thể tạo cho em một file mẫu gồm
Combo box, list box, command
Sao em tạo được rồi mà không biết vào chỗ nào để viết code và viết trên class cũng biết cách khai báo và gọi các đối tượng trên frame
Nhờ a giúp em
Làm cho bạn 1 Frame gồm có: 1 ComboBox, 1 ListBox, 1 TextBox và 1 CommandButton
Toàn bộ code:
Mã:
[COLOR=#ff0000]Public WithEvents cboBox As MSForms.ComboBox
Public WithEvents lstBox As MSForms.ListBox
Public WithEvents cmdBtt As MSForms.CommandButton
Public WithEvents txtBox As MSForms.TextBox[/COLOR]
[COLOR=#0000cd]Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If TypeName(cboBox) = "Nothing" Then
    Set cboBox = Sheet1.Frame1.Controls("ComboBox1")
    cboBox.List() = Sheet1.Range("A1:A10").Value
  End If
  If TypeName(lstBox) = "Nothing" Then
    Set lstBox = Sheet1.Frame1.Controls("ListBox1")
    lstBox.List() = Sheet1.Range("A1:A10").Value
  End If
  If TypeName(cmdBtt) = "Nothing" Then
    Set cmdBtt = Sheet1.Frame1.Controls("CommandButton1")
  End If
End Sub[/COLOR]
Private Sub cboBox_Click()
  Sheet1.Frame1.Controls("TextBox1").Text = cboBox.Text
End Sub
Private Sub lstBox_Click()
  Sheet1.Frame1.Controls("TextBox1").Text = lstBox.Text
End Sub
Private Sub cmdBtt_Click()
  MsgBox "Hello!"
End Sub
4 dòng khai báo màu đỏ để khai báo các controls (bắt buộc phải có)
Các dòng code màu xanh dùng sự kiện MouseMove trên Frame để khởi tạo các controls (cũng bắt buộc phải có nhưng có thể dùng các sự kiện khác như Auto_Open, Worksheet_Activate... để khởi tạo)
Các dòng code dưới cùng: Điều khiển sự kiện các control (viết bình thường như trên form)
-------------------
Quy trinh là vậy, bạn có thể tùy biến thêm
 

File đính kèm

duongapt

Thành viên mới
Tham gia ngày
25 Tháng chín 2011
Bài viết
15
Được thích
1
Điểm
365
Cắm ơn anh, em tạo được rồi, nhưng còn 2 vấn đề em chưa biết viết như thế nào.
- Em muốn chọn cùng lúc nhiều dòng trong list và chọn nút chọn sẽ tự động lấy vào excell những dòng vừa chọn
- Trong combo danh sách có nhiều mã hàng úa em muốn nhập nội dung trên cell hiện tại sẽ tự động lọc các dòng có nọi dung mình muốn tìm@!##
 

appl

Thành viên chính thức
Tham gia ngày
22 Tháng sáu 2011
Bài viết
57
Được thích
22
Điểm
370
Tuổi
22
upload_2017-10-7_9-42-1.png
Xin cho hỏi, tôi có một vấn đề như sau
trong form tôi có 1 frame và các option, tôi muốn chọn option nào thì sẽ hiển thị thông báo option đó
nếu sự kiện thông qua nút command button để click thì không nói gì, còn nếu cài đặt sự kiện cho từng option thì quá cực
có cách nào cài đặt sự kiện trong frame để khi click vào từng option thì hiện ra thông báo như trên không?
xin chân thành cảm ơn
 

File đính kèm

VetMini

Gian hùng bàn phiếm (thành viên trôi nước)
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
7,856
Được thích
9,205
Điểm
560
Lập một cái class module (WithEvents) attach sự kiện click vào các opt buttons lúc init form
Tuy nhiên, ở đây chỉ có 4 buttons cho nên code sẽ cực hơn code click event cho từng button.
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,269
Được thích
52,662
Điểm
11,910
View attachment 184385
Xin cho hỏi, tôi có một vấn đề như sau
trong form tôi có 1 frame và các option, tôi muốn chọn option nào thì sẽ hiển thị thông báo option đó
nếu sự kiện thông qua nút command button để click thì không nói gì, còn nếu cài đặt sự kiện cho từng option thì quá cực
có cách nào cài đặt sự kiện trong frame để khi click vào từng option thì hiện ra thông báo như trên không?
xin chân thành cảm ơn
Cũng lại dùng Class thôi. Cách làm như sau:
1> Vào menu Insert, chọn Class Module (để chèn 1 class). Mặc định có tên là "Class1".
Code trong class:
Mã:
Public WithEvents opt As MSForms.OptionButton
Private Sub opt_Click()
  MsgBox opt.Name
End Sub
2> Trong UserForm, bỏ hết code của bạn và chèn code dưới đây vào:
Mã:
Dim obj() As New Class1
Private Sub UserForm_Initialize()
  Dim ctr As Control, n As Long
  For Each ctr In Me.Frame1.Controls
    ReDim Preserve obj(n)
    Set obj(n).opt = ctr
    n = n + 1
  Next
End Sub
Lưu ý chỗ Dim obj() As New Class1 . Nếu trước đó, khi bạn chèn Class rồi đổi tên của nó thành "ABC" gì gì đó thì chỗ này bạn cũng phải sửa "Class1" thành "ABC" tương ứng
 

appl

Thành viên chính thức
Tham gia ngày
22 Tháng sáu 2011
Bài viết
57
Được thích
22
Điểm
370
Tuổi
22
Cũng lại dùng Class thôi. Cách làm như sau:
1> Vào menu Insert, chọn Class Module (để chèn 1 class). Mặc định có tên là "Class1".
Code trong class:
Mã:
Public WithEvents opt As MSForms.OptionButton
Private Sub opt_Click()
  MsgBox opt.Name
End Sub
2> Trong UserForm, bỏ hết code của bạn và chèn code dưới đây vào:
Mã:
Dim obj() As New Class1
Private Sub UserForm_Initialize()
  Dim ctr As Control, n As Long
  For Each ctr In Me.Frame1.Controls
    ReDim Preserve obj(n)
    Set obj(n).opt = ctr
    n = n + 1
  Next
End Sub
Lưu ý chỗ Dim obj() As New Class1 . Nếu trước đó, khi bạn chèn Class rồi đổi tên của nó thành "ABC" gì gì đó thì chỗ này bạn cũng phải sửa "Class1" thành "ABC" tương ứng
trường hợp mình muốn gán cái name đó vào 1 biến nào đó trong uniform để xử lý thì mình làm như thế nào anh
 

appl

Thành viên chính thức
Tham gia ngày
22 Tháng sáu 2011
Bài viết
57
Được thích
22
Điểm
370
Tuổi
22
Ở Đây em muốn lấy giá trị caption của option vào 1 cái biến, và trong từng module muốn xử lý nó như thế nào cũng được, nhưng file này em xử lý biến đó thông qua cái lable thôi, nói chung file này em làm cũng đạt được như ý ban đầu, nhưng em muốn học hỏi thêm. Xin chân thành cảm ơn anh Ndu
 

File đính kèm

Lần chỉnh sửa cuối:

hpkhuong

######
Tham gia ngày
20 Tháng năm 2011
Bài viết
4,616
Được thích
4,054
Điểm
560
Nơi ở
Quận 2 - TP.HCM
Ở Đây em muốn lấy giá trị caption của option vào 1 cái biến, và trong từng module muốn xử lý nó như thế nào cũng đươcj, nhưng file này em xử lý biến đó thông qua cái lable thôi, nói chung file này em làm cũng đạt được như ý ban đầu, nhưng em muốn học hỏi thêm. Xin chân thành cảm ơn anh Ndu
Bạn nên chuyển
Mã:
 ReDim Arr_D(1 To UBound(Arr_N, 1))
thành & sau dòng k = k + 1
Mã:
k = k + 1
ReDim Preserve Arr_D(1 To k)
 
Top Bottom