phihndhsp
Thành viên gạo cội




- Tham gia
- 26/12/09
- Bài viết
- 3,363
- Được thích
- 2,488
- Giới tính
- Nam
- Nghề nghiệp
- Giáo Viê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.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
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)
Thì ra là vậy!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
Sao Việt code cho các đối tượng không được anh oi
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
[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
Cũng lại dùng Class thôi. Cách làm như sau: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
Public WithEvents opt As MSForms.OptionButton
Private Sub opt_Click()
MsgBox opt.Name
End Sub
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
Hổng có file lấy gì mà kiểm tra đây bạn?mong anh hướng dẫn cách làm việc với các đối tượng trong multipage ở trường hợp này với ạ, thanks
Public WithEvents cboBox As MSForms.ComboBox
Public WithEvents lstBox As MSForms.ListBox
Public WithEvents cmdBtt As MSForms.CommandButton
Public WithEvents txtBox As MSForms.TextBox
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
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
dạ em copy nguyên trả lời của anh ở page1 ạ, giờ e muốn làm việc thêm với cái multipage mà chưa biết làm thế nào, google vẫn chưa ra ạ, mong anh giúp đỡ, thanksLàm cho bạn 1 Frame gồm có: 1 ComboBox, 1 ListBox, 1 TextBox và 1 CommandButton
Toàn bộ code:
4 dòng khai báo màu đỏ để khai báo các controls (bắt buộc phải có)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
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ư Autpen, 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
Cụ thể bạn muốn làm điều gì trên cái multipage này?dạ em copy nguyên trả lời của anh ở page1 ạ, giờ e muốn làm việc thêm với cái multipage mà chưa biết làm thế nào, google vẫn chưa ra ạ, mong anh giúp đỡ, thanks
Thì khai báo bình thường thôi. Chẳng hạn muốn khai báo TextBox2 nằm trên Page2 của MultiPage thì:Em muốn khai báo khởi tạo sự kiện cho textbox, commandbutton trong multipage, giống như trên frame ở trên ấy ạ, thanks
'...........................
Public WithEvents txtBox2 As MSForms.TextBox
Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'..............................
If TypeName(txtBox2) = "Nothing" Then
Set txtBox2 = Sheet1.Frame1.Controls("MultiPage1").Pages(1).Controls("TextBox2")
End If
End Sub
Private Sub txtBox2_Change()
Sheet1.Frame1.Controls("MultiPage1").Pages(1).Controls("Label2").Caption = txtBox2.Text
End Sub
e đã làm được rồi, thanks anh,anh cho em hỏi thêm là: em có cái button ở ngoài frame, giờ muốn tương tác với cái multipage, em viết như này ko đúng, ko biết lại sửa lại như nào, mong anh chỉ giúp, thanks!
Private Sub reportBtt_Click()
If Sheet1.Frame1.Controls("MultiPage1").Pages(0).Select = True Then Msgbox txtBox1.Value
If Sheet1.Frame1.Controls("MultiPage1").Pages(1).Select = True Then Msgbox txtBox2.Value
End Sub
Anh cho em hỏi sự khác nhau trong câu lệnh trên khi dùng "New" và không dùng "New".Dim obj() As New Class1
Trước mình thử bỏ new, hình như ko chạy,Anh cho em hỏi sự khác nhau trong câu lệnh trên khi dùng "New" và không dùng "New".
Theo kinh nghiệm thì tôi thấy rằng: Nếu có "New" thì khỏi phải có động tác "Set"Anh cho em hỏi sự khác nhau trong câu lệnh trên khi dùng "New" và không dùng "New".
Sub Test1()
Dim x As New Application
MsgBox x.Sum(3, 2)
End Sub
Sub Test2()
Dim x As Application
Set x = New Application
MsgBox x.Sum(3, 2)
End Sub
Sub Test1()
Dim x As New Collection
x.Add 1, "1"
x.Add 2, "2"
x.Add 3, "3"
MsgBox x.Count
End Sub
Sub Test2()
Dim x As Collection
Set x = New Collection
x.Add 1, "1"
x.Add 2, "2"
x.Add 3, "3"
MsgBox x.Count
End Sub
Bình thường nó là một mảng ojbject ( class1)Trước mình thử bỏ new, hình như ko chạy,
Cái này để gọi cái funtion ở trong class1 ra
Theo kinh nghiệm thì tôi thấy rằng: Nếu có "New" thì khỏi phải có động tác "Set"
Ví dụ:
Nhưng không có "New" thì phải "Set"Mã:Sub Test1() Dim x As New Application MsgBox x.Sum(3, 2) End Sub
Ví dụ khác có "New" thì khỏi "Set"Mã:Sub Test2() Dim x As Application Set x = New Application MsgBox x.Sum(3, 2) End Sub
Và không có "New" thì phải "Set"Mã:Sub Test1() Dim x As New Collection x.Add 1, "1" x.Add 2, "2" x.Add 3, "3" MsgBox x.Count End Sub
Nghe "thiên hạ đồn" rằng Nên dùng "Dim + Set" thì sẽ tốt hơn là "Dim New"Mã:Sub Test2() Dim x As Collection Set x = New Collection x.Add 1, "1" x.Add 2, "2" x.Add 3, "3" MsgBox x.Count End Sub
Chẳng biết nữa, thấy cái nào chạy thì mình dùng, cũng chưa đủ trình độ để biết cái nào tốt hơn
Thấy cũng vậy thôi mà. Bạn có quyền Dim obj() as Class1 cũng đâu có vấn đề gì. Chỉ là sau đó bạn phải có động tác Set obj() = New Class1Bình thường nó là một mảng ojbject ( class1)
Nếu chỉ là object thì em hiều, em hỏi là cái chuyện dùng toán tử new khi khai báo một mảng động đối tượng cơ.
dim obj() as new class1
Public WithEvents cmdBtt As MSForms.CommandButton
Private Sub cmdBtt_Click()
MsgBox "Xin chào! Tôi là '" & cmdBtt.Caption & "'"
End Sub
Dim btt() As New clsEvent
Private Sub UserForm_Initialize()
Dim n As Long, ctr As Control
For Each ctr In Me.Frame1.Controls
n = n + 1
ReDim Preserve btt(1 To n)
Set btt(n).cmdBtt = ctr
Next
End Sub
Dim btt() As clsEvent
Private Sub UserForm_Initialize()
Dim n As Long, ctr As Control
For Each ctr In Me.Frame1.Controls
n = n + 1
ReDim Preserve btt(1 To n)
Set btt(n) = New clsEvent
Set btt(n).cmdBtt = ctr
Next
End Sub
Sub Test1()
Dim app As New Application
Set app = Nothing
MsgBox app Is Nothing
End Sub
Sub Test2()
Dim app As Application
Set app = New Application
Set app = Nothing
MsgBox app Is Nothing
End Sub
hình như là" cách viết theo kiểu Sub Test2 sẽ "an toàn" hơn thì phả
Tôi cũng nghĩ vậy (mới nghĩ)... Trước giờ dùng nhưng không để ý, hôm nay bạn hỏi tự dưng thí nghiệm mới phát hiện vấn đề. Chắc phải thay đổi cách viết code từ đâyCách viết dùng New sẽ nguy hiểm hơn, nhiều khi muốn nó về nothing mà nó không chịu về.
Chíng xác.Code đầu hiện là True, code thứ 2 hiện là False. Khi khai báo với toán tử New thì thực sự đối tượng chưa hề được tạo, chỉ khi ta truy cập mà nó đang là nothing thì nó mới chính thức được tạo. Ngược lại khi không có toàn tử New thì người dùng phải tự tạo đối tượng và gán cho nó. Còn về việc giải phóng thì chắc cứ gán nó thành nothing bình thương, nhưng không truy cập nó nữa là được.
Dim obj As myClass ' Object
Set obj = New myClass
Set obj = Nothing
MsgBox obj Is Nothing
Dim obj As New myClass
Set obj = Nothing
MsgBox obj Is Nothing
Dim obj As New myClass
obj.HoTen = "Nguyen Van A" ' (A)
Set obj = Nothing ' (B)
MsgBox obj Is Nothing ' (C)
Nó ngoan ngoãn về Nothing. Chỉ có điều sau khi Set ... = Nothing thì đừng truy cập tới nó nữa. Bởi nếu truy cập thì VBA lại tạo lại đối tượng, do đang là Nothing, để có thể thực hiện câu lệnh.Cách viết dùng New sẽ nguy hiểm hơn, nhiều khi muốn nó về nothing mà nó không chịu về.
Chỉ có điều sau khi Set ... = Nothing thì đừng truy cập tới nó nữa
Sự khác nhau giữa (1) và (2) thì liên hệ như nào với khái niệm kiểu khai báo kết nối sớm (1') và kiểu khai báo kết nối trễ (2') hả anh?Có sự khác nhau giữa (New + không có Set) (1) và (không có New + Set) (2)
Theo tôi thì thế này ... Theo tôi bởi tôi không dám cho là mình chắc chắn đúng.Sự khác nhau giữa (1) và (2) thì liên hệ như nào với khái niệm kiểu khai báo kết nối sớm (1') và kiểu khai báo kết nối trễ (2') hả anh?
Sub test1()
Dim dic As New Scripting.Dictionary
dic.Add "a", 1
MsgBox dic.Item("a")
Set dic = Nothing
MsgBox dic Is Nothing
End Sub
Sub test2()
Dim dic As Scripting.Dictionary
Set dic = CreateObject("Scripting.Dictionary") ' hoac New Scripting.Dictionary
dic.Add "a", 1
MsgBox dic.Item("a")
Set dic = Nothing
MsgBox dic Is Nothing
End Sub
Dim dic As New Scripting.Dictionary
...
Dim dic As Scripting.Dictionary
Sub test3()
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "Nguyen van A", 47
MsgBox dic.Item("Nguyen van A")
Set dic = Nothing
End Sub
Sub test4()
Dim obj As Object
Set obj = CreateObject("Scripting.Dictionary")
obj.Add "Nguyen van A", 47
MsgBox obj.Item("Nguyen van A")
Set obj = Nothing
Set obj = CreateObject("Scripting.FileSystemObject")
MsgBox obj.FileExists("C:\test.txt")
Set obj = Nothing
End Sub
Nếu bạn lấy ví dụ khác thì còn có lý, vì Show là hiển nhiên. Tại sao? Nếu UserForm1 đang chưa được Load mà không thể gọi Show để Load nó và Show nó thì bạn làm sao dùng được UserForm1? Bởi khi mở tập tin thì UserForm1 chưa được Load mà. Vậy bạn làm cách nào hiển thị UserForm1 để làm việc với nó? Thời điểm khi mở tập tin và thời điểm khi UserForm1 được hiển thị và sau đó Unload là hoàn toàn như nhau.Khi ta unload userform rồi, mà đột ngột ta gọi userform.show thì form lại tự động sống lại
Tôi cũng không biết có cùng cơ chế hay không. Nếu bạn kiểm tra thấy đúng như thế thì bạn tự kết luận cho mình thôi.Vậy cho em hỏi hai cái cơ chế này có liên quan gì tới nhau không?
Option Explicit
Private Sub UserForm_Initialize()
Debug.Print Me.Name & " initialize"
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Debug.Print Me.Name & " will be closed with Cancel = " & Str$(Cancel) & " and CloseMode = " & Str$(CloseMode)
End Sub
Private Sub UserForm_Terminate()
Debug.Print Me.Name & " terminate"
End Sub
Option Explicit
Sub TestForm()
Debug.Print "UserForm1 at address: 0x" & Hex$(VarPtr(UserForm1))
Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1))
UserForm1.Show
Debug.Print "UserForm1 at address: 0x" & Hex$(VarPtr(UserForm1))
Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1))
Unload UserForm1
Set UserForm1 = Nothing
Debug.Print "UserForm1 at address: 0x" & Hex$(VarPtr(UserForm1))
Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1))
End Sub
Nói chính xác thì khi Show được gọi mà UserForm chưa được Load thì VB sẽ Load nó. Cũng hiển nhiên thôi. Vì nếu không UserForm.Show được khi UserForm chưa được Load thì làm sao dùng UserForm được.Có nghĩa là phải có đối tượng, form phải được load thì mới gọi phương thức được. Em nghĩ show không hề load form mà do một bàn tay khác thực hiện, show chỉ làm nhiệm vụ hiển thị form. nothing-unload, new-userform,
Chắc chắn là giải phóng. Nhưng do sau đó lại truy cập tới UserForm1 nên VB lại tạo nó.Bắt ổng unload form, set nothing thì ông lại set ref count =1, không chịu set = 0 nên không giải phóng được.
Sub Button1_Click()
UserForm1.Show
End Sub
Private Sub CommandButton1_Click()
Unload Me
UserForm1.Show
End Sub
Private Sub CommandButton2_Click()
Me.Hide
End Sub
Private Sub CommandButton3_Click()
Unload Me
UserForm1.Width = 500
End Sub
Private Sub UserForm_Initialize()
MsgBox "Initialize"
End Sub
Private Sub UserForm_Terminate()
MsgBox "Terminate"
End Sub
Em chỉ biết nói nôm na, dân dã vầy:
Trong VB cũ, VB.NET, thì form phải load và show, unload, set nothing khi không cần (referent count = 0 => destroy tường minh trong VB và destroy = cơ chế dọn rác của .NET framework)
Còn trong MSForms của VBA thì ông VBA lanh chanh, làm dùm luôn, luôn set referent count to object = 1 khi khởi tạo, tham chiếu, read properties... lần đầu tiên.
Bắt ổng unload form, set nothing thì ông lại set ref count =1, không chịu set = 0 nên không giải phóng được.
Các object khai báo, khởi tạo bằng Dim xxx as New XXX cũng theo cách này.
Các bạn thử kiểm chứng = cách debug với 1 userform
Code của form
Code của macro:Mã:Option Explicit Private Sub UserForm_Initialize() Debug.Print Me.Name & " initialize" End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Debug.Print Me.Name & " will be closed with Cancel = " & Str$(Cancel) & " and CloseMode = " & Str$(CloseMode) End Sub Private Sub UserForm_Terminate() Debug.Print Me.Name & " terminate" End Sub
Mã:Option Explicit Sub TestForm() Debug.Print "UserForm1 at address: 0x" & Hex$(VarPtr(UserForm1)) Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1)) UserForm1.Show Debug.Print "UserForm1 at address: 0x" & Hex$(VarPtr(UserForm1)) Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1)) Unload UserForm1 Set UserForm1 = Nothing Debug.Print "UserForm1 at address: 0x" & Hex$(VarPtr(UserForm1)) Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1)) End Sub
Sub TestClass()
Dim UF As UserForm1
Set UF = UserForm1
Unload UserForm1
UserForm1.Caption = "Meo mun dang yeu"
MsgBox UF.Caption
End Sub
Sub TestForm()
Dim k As UserForm1, a As UserForm1
Unload UserForm1
Set k = UserForm1
Debug.Print "Dia chi cua k la: " & Hex(ObjPtr(k))
Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1))
Unload UserForm1
Set a = UserForm1
Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1))
Unload UserForm1
Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1))
Unload UserForm1
Debug.Print "UserForm1 pointer to address: 0x" & Hex$(ObjPtr(UserForm1))
End Sub
Giải phóng thì chắc chắn là đúng rồi anh. Chỉ là tại sao khi kiểm tra địa chỉ lại có lúc trùng, có lúc không trùng.Chắc chắn là giải phóng. Nhưng do sau đó lại truy cập tới UserForm1 nên VB lại tạo nó.
Dễ kiểm tra thôi.
Đặt Button1 trên Sheet1
Thêm UserForm1 với 3 CommandButtonMã:Sub Button1_Click() UserForm1.Show End Sub
1. Nhấn Button1. Ta thấy code UserForm_Initialize được thực hiện, tức VB tạo đối tượng. Tiếp theo nhấn CommandButton1. Ta thấy UserForm_Terminate được thực hiện (thủ phạm là Unload), tức đối tượng được giải phóng. Tiếp ngay theo UserForm_Initialize được thực hiện, tức VB lại tạo đối tượng - thủ phạm là gọi Show mà UserForm1 chưa được Load vào memory nên VB lại tạo đối tượng. Rõ ràng đối tượng thực sự được giải phóng. Nhưng được tạo lại do gọi Show. Nếu sau khi giải phóng mà không gọi Show thì đối tượng không được tạo. Bằng chứng là nếu bỏ UserForm1.Show thì sau khi nhấn Button1 thì UserForm_Initialize được thực hiện, tức chỉ tới thời điểm này UserForm1 mới được Load vào memory, đây là bằng chứng là sau Unload và trước khi nhấn Button1 thì trong memory không có UserForm1.Mã:Private Sub CommandButton1_Click() Unload Me UserForm1.Show End Sub Private Sub CommandButton2_Click() Me.Hide End Sub Private Sub CommandButton3_Click() Unload Me UserForm1.Width = 500 End Sub Private Sub UserForm_Initialize() MsgBox "Initialize" End Sub Private Sub UserForm_Terminate() MsgBox "Terminate" End Sub
2. Nhấn Button1. Ta thấy code UserForm_Initialize được thực hiện, tức VB tạo đối tượng. Tiếp theo nhấn CommandButton2. Ta thấy UserForm_Terminate không được thực hiện, bởi UserForm1 chỉ bị ẩn nhưng vẫn tồn tại trong memory, không được giải phóng. Chính vì nó vẫn tồn tại nên nếu lúc này nhấn Button1 thì VB không tạo, ta thấy rõ ràng là UserForm_Initialize không được thực hiện. Show lúc này chẳng qua là hiển thị UserForm1 đang bị ẩn nhưng luôn tồn tại trong memory.
3. Nhấn Button1. Ta thấy code UserForm_Initialize được thực hiện, tức VB tạo đối tượng. Tiếp theo nhấn CommandButton3. Ta thấy UserForm_Terminate được thực hiện (thủ phạm là Unload), tức đối tượng được giải phóng. Tiếp ngay theo UserForm_Initialize được thực hiện, tức VB lại tạo đối tượng - thủ phạm là do truy cập tới UserForm1 (UserForm1.Width = 300). Nhưng VB chỉ tạo đối tượng mà không hiển thị nó. Nếu sau đó nhấn Button1 thì thấy đúng là chiều rộng của UserForm1 đã thay đổi.
Không biết bạn kiểm tra gì, thế nào. Chỉ một câu mà không có code thì khó nói chuyện.Chỉ là tại sao khi kiểm tra địa chỉ lại có lúc trùng, có lúc không trùng.