Lại báo lỗi VBA...

  • Thread starter levanduyet
  • Ngày gửi
L

levanduyet

Welcome
16/10/04
535
11
18
HCM
my.opera.com
#1
StonyHeartedMan nói:
Xử lý xong rồi còn xử lý lại làm gì nữa?????? :). Nói vậy thôi, Code của tớ bài trước là quá chuẩn & pro rồi (Chỉ việc Copy & Paste vào chương trình của mọi người thôi). Tớ test rồi, yên tâm đi. Ko phải nghĩ ra cách khác nữa đâu :)
Chào SHM,
Chắc có lẻ bạn chưa test !!! Vẫn có lỗi đấy thôi !!!
Dù sao về cấu trúc của bạn thì quá Pro rồi.
Thân,
Lê Văn Duyệt
PS: SHM, có tìm được e-book về ADO chưa? Giúp mình với, mình cần! Cám ơn bạn trước.
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#2
Tớ có 1 cái form trong đó có nhiều checkbox, tớ tạo 1 cái button gọi là reset Button và gán code sau:

Sub ResetButton_Click()
Dim C As CheckBox
For Each C In UserForm1
Set C.Value = False
Next C
End Sub

Mục đích là sau khi check nhiều checkbox, muốn bỏ chọn đi một lượt chỉ nhấn 1 nút Reset, nhưng nó cứ báo lỗi "Object doens't support this method..." làm thế nào để đáp ứng yêu cầu tương tự??? :wall:
 
L

levanduyet

Welcome
16/10/04
535
11
18
HCM
my.opera.com
#3
adam_tran nói:
Tớ có 1 cái form trong đó có nhiều checkbox, tớ tạo 1 cái button gọi là reset Button và gán code sau:

Sub ResetButton_Click()
Dim C As CheckBox
For Each C In UserForm1
Set C.Value = False
Next C
End Sub

Mục đích là sau khi check nhiều checkbox, muốn bỏ chọn đi một lượt chỉ nhấn 1 nút Reset, nhưng nó cứ báo lỗi "Object doens't support this method..." làm thế nào để đáp ứng yêu cầu tương tự??? :wall:
Hì hì hì,
Em phải khai báo là Control chứ không phải Checkbox. Sau đó em quét qua các control rồi xét nếu là Checkbox thì làm theo ý của em.
Thân,
Lê Văn Duyệt
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#4
levanduyet nói:
Hì hì hì,
Em phải khai báo là Control chứ không phải Checkbox. Sau đó em quét qua các control rồi xét nếu là Checkbox thì làm theo ý của em.
Thân,
Lê Văn Duyệt
Hey hey hey, em không biết code đâu, không sách không thầy, đang mò... Kiểm tra If Cotrol is checkbox thì làm gì.... :wall:
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#6
SA_DQ nói:
Sau khi tạo nút lệnh & viết tên thể hiện cho nó, VD "Test"; bây chừ vô Tool=>Macro để tạo mới 1 macro để không gạch dưới chữ T nữa mà viết hoa & gạch dưới chữ "e"; xong rồi xem cái thằng VB nó viết NTN mà bắt chưỡc, Thử đi, OK?! :atom:
Macro không ghi lại cái gì cả!
Tức là, gán Ancellerator không record lại được.
 
Sửa lần cuối:
S

SA_DQ

Thành viên thân thiết
29/6/05
435
38
28
61
HCM city
#7
adam_tran nói:
Macro không ghi lại cái gì cả!
Tạo nút lệnh ở đâu? Form, Sheet, hay toolbar...
=> View=>Toolbar=> chọn Form & vẽ 1 cái nút lệnh; Nhập lên nó cái tên, VT "Test" (nhớ là có gạch dưới chữ T);
Bây chừ mới mở NewMacro & ghi lại hành động bạn sửa lại là không gạch dưới chữ T nữa mà viết hoa & gạch dưới chữ "e";
Được nha!
 
S

StonyHeartedMan

Thành viên sơ cấp
2/10/04
306
2
0
Hà nội
www.vnuni.net
#8
Public Function SetAllCheckBoxValue(ByRef objForm As Form, ByVal blnValue As Boolean) As Boolean
On Error GoTo SetAllCheckBoxValue_ERR:
Dim objControl As Control '// or Object

'// Assume function fails
SetAllCheckBoxValue = False​

For Each objControl In objForm
'// Tớ viết "chay" đoạn code này vì lâu lắm ko viết code nên ko nhớ lệnh nữa :)
If TypeOf objControl Is CheckBox Then
'//If objControl.Enabled Then objControl.Value = Val(blnValue) '// Check if control is enabled before assigning property's value​
If objControl.Enabled Then objControl.Value = Abs(blnValue) '// Check if control is enabled before assigning property's value​

End If

Next objControl​

'// All's well done, return True
SetAllCheckBoxValue = True​

SetAllCheckBoxValue_DONE:
If Not objControl Is Nothing Then Set objControl = Nothing
Exit Function
SetAllCheckBoxValue_ERR:

'// Your Error Handle here such as rise error msgbox, log error,...
'// ...​
Resume SetAllCheckBoxValue_DONE​

End Function

-----------------------------
How to use this function
-----------------------------

Dim oForm as Form, iRet As Boolean

Set oForm = UserForm1 '// UserForm1 must loaded!
'// Nếu gọi hàm này từ 1 form và muốn áp dụng ngay cho form đó thì:
'// Set oForm = Me '// UserForm1 must loaded!

iRet = SetAllCheckBoxValue(oForm, True)
'// Nếu ko dùng oForm mà dùng ngay form hiện thời thì:
'// iRet = SetAllCheckBoxValue(Me, True) // Chú ý, ko thể viết code này lúc Form Load (Event) vì lúc đó Form chưa Loaded và tồn tại trong memory.

If not iRet then '// Goto Error Handle - Raise Error handle
....

Set oForm = Nothing
....


Hope this helps!

P/S: Tớ chưa test thử code trên đâu nhé, chỉ là code "chay" để các bạn lấy ý tưởng lập trình thôi.
 
Sửa lần cuối:
S

StonyHeartedMan

Thành viên sơ cấp
2/10/04
306
2
0
Hà nội
www.vnuni.net
#9
adam_tran nói:
Sub ResetButton_Click()
Dim C As CheckBox
For Each C In UserForm1 '// (1)
Set C.Value = False '// (2)​
Next C

End Sub
Có 4 cái lỗi ở đây:
1. Không phải control nào cũng có property là Value, vì thế phải kiểm tra kiểu của control object (nếu ko thì phải cho cái bẫy lỗi là On Error Resume Next :))
2. Set C.Value = False là sai vì người ta chỉ dùng lệnh Set với các object (ví dụ như font chẳng hạn, cũng là property nhưng lại là object), còn gán giá trị cho các property không phải dạng object thì chỉ là lệnh gán bình thường (=). Như vậy đúng ra phải là: C.Value = False
3. Bao giờ trong lập trình cũng phải cố gắng vét cạn hết các trường hợp xảy ra để xử lý hết các lỗi. Ví dụ trong trường hợp này, giả sử các CheckBox Controls trên form đã bị .Enable = False (hoặc .Visible = False) thì việc gán giá trị cho các thuộc tính của control sẽ ko thực hiện được (lỗi xảy ra). Vì vậy, các bạn phải kiểm tra nếu Enable = True (If theControl.Enable Then ...) trước khi gán giá trị cho thuộc tính. (Cũng giống như việc trước khi Delete (hay Move) File, Folder, Record... thì phải kiểm tra sự tồn tại, thuộc tính (Read, Write,...) của File, Folder hay Record đó rồi mới thực hiện lệnh Delete (Move)... (Dĩ nhiên là phải thực hiện sau khi đã nhắc nhở người dùng trước khi thực hiện lệnh)
4. Trong lập trình, nhất là lập trình C, Delphi trong windows, một khi đã sử dụng các resources của hệ thống thì phải giải phóng hết memory. Việc bạn sử dụng Object (Control, form, recordset, connection, v.v...) cũng vậy, phải Kill Object(s) sau khi đã dùng xong. Bạn cũng đừng tin là các chương trình viết bằng VB sau khi thoát khỏi chương trình sẽ tự động giải phóng resources. Hãy cứ lập trình theo phong cách chuyên nghiệp.
Ví dụ:
If Not objObject Is Nothing Then
'// Nếu có thể close được thì close object (ví dụ, object là recordset, connection, v.v...)
If objObject.Open Then objObject.Close '// Tùy theo loại object mà viết các phương thức tương ứng
If Not objObject Is Nothing Then Set objObject = Nothing
'// Chú ý: Tại sao lại cứ phải check các trang thái open, nothing trước khi thực hiện: Vì những lệnh check đó thường sẽ làm code chạy nhanh hơn (trong trường hợp phủ định của lệnh check, như ở trên, trường hợp đó là Object đang close hay là nothing sẵn rồi thì nó sẽ bỏ qua lệnh close hay set = nothing - những lệnh này thường chậm hơn lệnh kiểm tra). Ai đã từng viết object như activeX control... rồi thì thì sẽ hiểu cách giải thích (hơi dài dòng) trên :)).
End If

5. Suggestion: Trong mọi trường hợp nên viết Error handle, Comments phải đầy đủ cho từng dòng lệnh (nếu có thể) hoặc từng Code Block...
6. Nên "đóng gói" (viết thành object, thủ tục, hàm dùng chung,...) tất cả những gì bạn thấy có thể reuse lại được.
7. Tài liệu hóa nếu có thể

---------------------------
Trên đây chỉ là một vài chia sẻ kinh nghiệm viết code với các bạn. Hy vọng các bạn có thể viết nhiều chương trình với những dòng code thật "đẹp"
 
Sửa lần cuối:
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#10
To SA QD:
Vấn đề là các control nằm trên UserForm chứ không phải là 1 cái shape của sheet, tức là Parent của nó là Form, với các Method và Properties được định nghĩa sẳn.
To StonyHeartMan:
Cám ơn anh, cái mà em bí là ko biết diễn giải ý tưởng thành ngôn ngữ VB, không biết cái if cotrol is checkbox kìa.
Các lỗi:
1. Em đã khai báo là checkbox, nên em nghỉ checkbox có property Value
2. Đầu tiên em không dùng "Set", nhưng cũng cứ bị lỗi
3 - 7: Đây là những kiến thức về lập trình, em hiểu.
 
S

StonyHeartedMan

Thành viên sơ cấp
2/10/04
306
2
0
Hà nội
www.vnuni.net
#11
adam_tran nói:
Cái mà em bí là ko biết diễn giải ý tưởng thành ngôn ngữ VB, không biết cái if typeof control is checkbox then kìa
--> Stony cũng ko nhớ chính xác :), nhưng stony biết cách vào MSDN để search ra cái lệnh này :) (Ví dụ: Search: "Check Control Type in Visual Basic", vậy cái này có cần kinh nghiệm ko hay chỉ là biết tiếng anh thôi?). Nhớ tất cả những cái đó vào đầu làm gì cho mệt.

adam_tran nói:
1. Em đã khai báo là checkbox, nên em nghỉ checkbox có property Value
--> Nghĩ thế (Dim C As CheckBox) ... vẫn sai. Trong trường hợp adam_tran thử xóa hết (các) checkbox control(s) trong Form đi sẽ thấy lỗi nó như thế nào. (Đây là cách nghĩ vét cạn nhé (trong trường hợp viết tổng quát áp dụng cho mọi form), ko nên nói là biết chắc form đó có checkbox rồi thì mới viết thế :). Nếu ko có control nào là checkbox trên form thì nó báo lỗi ngay từ cái dòng For Each...

adam_tran nói:
2. Đầu tiên em không dùng "Set", nhưng cũng cứ bị lỗi
--> Đấy, phải hiểu "Set" nghĩa là gì, dùng nó khi nào... mới đem ra dùng, chắc giờ đã hiểu rồi nhỉ? :)

adam_tran nói:
3 - 7: Đây là những kiến thức về lập trình, em hiểu.
--> Tuyệt quá! vì ko phải ai cũng biết là cách viết code "đẹp" có ý nghĩa như thế nào đâu. Nào là coding conventions, nào là change requests mgnt, bug fixes, v.v...
 
Sửa lần cuối:
W

workman

Thành viên sơ cấp
22/7/05
372
0
0
46
Ho Chi Minh
#12
Cái này mình chịu. Xài đỡ cách củ chuối của mình xem sao.

Tôi assume là Adam sử dụng tên default của VB, tức là CheckBox1, CheckBox2...

Xài đỡ cái này: for each control in userform1

if control.name like "CheckBox*" then control.value=false

next control

Đừng cười cách làm thô thiển, trình độ của tôi chỉ đến thế.

Thế nhé. Chúc bạn vui.
 
S

StonyHeartedMan

Thành viên sơ cấp
2/10/04
306
2
0
Hà nội
www.vnuni.net
#13
Xử lý xong rồi còn xử lý lại làm gì nữa?????? :). Nói vậy thôi, Code của tớ bài trước là quá chuẩn & pro rồi (Chỉ việc Copy & Paste vào chương trình của mọi người thôi). Tớ test rồi, yên tâm đi. Ko phải nghĩ ra cách khác nữa đâu :)
 
W

workman

Thành viên sơ cấp
22/7/05
372
0
0
46
Ho Chi Minh
#14
Ờ, tôi overlook thôi. Đúng là dân lập trình chuyên nghiệp có khác, nhìn code là thấy mê rồi, có cả đoạn xử lý lỗi nữa.

Cám ơn bạn nhiều về bài viết hướng dẫn rất chi tiết.
 
S

StonyHeartedMan

Thành viên sơ cấp
2/10/04
306
2
0
Hà nội
www.vnuni.net
#15
levanduyet nói:
Chào SHM,
Chắc có lẻ bạn chưa test !!! Vẫn có lỗi đấy thôi !!!
Dù sao về cấu trúc của bạn thì quá Pro rồi.
YES! :biggrin:

Here is the code: (just a small amendment: "Go to" --> "Goto", ".Enable" --> ".Enabled", "Val" --> "Abs") SetCheckBoxValue SourceCode

levanduyet nói:
PS: SHM, có tìm được e-book về ADO chưa? Giúp mình với, mình cần! Cám ơn bạn trước.
Cài MSDN của bộ Visual Studio 6 lên :) (Hoặc là vào www.microsoft.com/msdn mà search)
 
Sửa lần cuối:

Thành viên trực tuyến

Không có thành viên trực tuyến.

Xem nhiều