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?