Run-time error 381

Liên hệ QC

HoangHacVT

Thành viên chính thức
Tham gia
3/6/09
Bài viết
82
Được thích
41
Nghề nghiệp
Marketing và bất cứ thứ gì người đẹp nhờ
Chào các anh em nhà GPE,

Mình có một userform nhập dữ liệu. Combobox1 dùng để lấy mã công ty từ danh sách. Tuy nhiên mỗi lần đánh mã mới ( chưa có trong danh sách) thì bảng báo lỗi hiện ra. ( Các anh em xem file đính kèm)

Mình đã thử như thế này ( hihi, dân tay ngang đọc xong đừng cười nhe):

Private Sub ComboBox1_Change()
If IsError(me.combobox1.value) then
Me.TextBox1.Value = ""
UserForm2.show
Unload Me
Else
Me.TextBox1.Value = Me.ComboBox1.Column(1)
Me.Label2.Caption = Me.ComboBox1.Column(2)
End If

Nghĩa là khi nhập một mã mới ở Combobox1 mà chưa có trong danh sách, VBE sẽ tự động đóng form nhập dữ liệu này lại và mở form thêm danh sách để thêm mã mới vào.

Nhờ các bạn giúp với_ giúp xong cười cũng được.

Chân thành cảm ơn,
Hạc
 

File đính kèm

Tạo code để sortlist không được

Chào nhà GPE,

Mình muốn tạo một combo để tự động sort danh sách mà không được.

Thực ra mình không biết vụ này, nên record 1 macro để copy cách viết code. Thế nhưng khi copy y chang ( chỉ đổi vùng cần sort (A3:C7) thành vùng định trước (dsct) - 2 vùng y chang nhau _ vẫn là A3:C7) thì nó không chạy được.

Nhờ anh em giúp dùm (file đính kèm) ( sheet "Sort")

Cảm ơn nhiều nhé,
Hạc
 

File đính kèm

Upvote 0
1. Error 1004:

Name "dsct" đặt sai sheet, hoặc đứng sheet này mà muốn select range của sheet khác.
Ngoài ra, sortkey nếu sửa chỉ là 1 cột, không phải nguyên range, thì không lỗi:

PHP:
Private Sub CommandButton1_Click()
Sheets("Runtime error 381").Select
 
    ActiveWorkbook.Worksheets("Sort").Sort.SortFields.Clear
    Worksheets("Sort").Sort.SortFields.Add Key:=Range("dsct").Resize(, 1), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With Worksheets("Sort").Sort
        .SetRange Range("dsct")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
   End With

End Sub


2. Error 381:

PHP:
Private Sub ComboBox1_Change()
On Error GoTo Cancels
Me.TextBox1.Value = Me.ComboBox1.Column(1)
Me.Label2.Caption = Me.ComboBox1.Column(2)
Cancels:
Me.TextBox1.Value = ""
       Unload Me
       UserForm2.Show
End Sub
 
Upvote 0
Gởi bạn Ptm0412:

Mình thử code bạn cho vẫn không được: khi chạy thì dù nhập bất cứ mã nào nó cũng chuyển ngay sang userform2 ngay. sau đó thì báo lỗi: Run-time eror: Automation eror: the object invoked há disconnect to ít clients.

Nhờ bạn chỉ giáo tiếp nhé.

Cám ơn rất nhiều,

Hạc
 
Upvote 0
Gởi bạn Ptm0412:

Mình thử code bạn cho vẫn không được: khi chạy thì dù nhập bất cứ mã nào nó cũng chuyển ngay sang userform2 ngay. sau đó thì báo lỗi: Run-time eror: Automation eror: the object invoked há disconnect to ít clients.

Nhờ bạn chỉ giáo tiếp nhé.

Cám ơn rất nhiều,

Hạc
Code ấy sư phụ quên Exit Sub ấy mà
Sửa lại:
PHP:
Private Sub ComboBox1_Change()
  On Error GoTo Cancels
  Me.TextBox1.Value = Me.ComboBox1.Column(1)
  Me.Label2.Caption = Me.ComboBox1.Column(2)
  Exit Sub
Cancels:
  Me.TextBox1.Value = ""
  Unload Me
  UserForm2.Show
End Sub
Mà đã chuyển sang Show UserForm2 rồi thì đoạn Me.TextBox1.Value = "" là thừa (có thể bỏ)
 
Upvote 0
Đúng ra nên đưa code vào sự kiện BeforeUpdate. Vì trong sự kiện change, nếu gõ mới 1 ký tự đã bị nhảy rồi. Ngoài ra thêm 1 option là hỏi muốn thêm mã hay không, rồi mới mở form khác. Ngoài ra, không unload mà để đó, tiếp tực xài.
PHP:
Private Sub ComboBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsEmpty(ComboBox1) Or ComboBox1 = "" Then Exit Sub
On Error GoTo Cancels
Me.TextBox1.Value = Me.ComboBox1.Column(1)
Me.Label2.Caption = Me.ComboBox1.Column(2)
Exit Sub
Cancels:
    Cancel = True
    ComboBox1 = "": TextBox1 = ""
Add = MsgBox("Not in List, Do you want to add new Item?", vbYesNo)
If Add = vbYes Then
    UserForm2.Show
End If
End Sub

Còn code sort thì rút gọn như ri:

PHP:
Private Sub CommandButton1_Click()
Sheets("sort").activate
        Range("dsct").Sort Key1:=Range("dsct").Resize(1, 1), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End Sub
 

File đính kèm

Upvote 0
Đúng ra nên đưa code vào sự kiện BeforeUpdate. Vì trong sự kiện change, nếu gõ mới 1 ký tự đã bị nhảy rồi. Ngoài ra thêm 1 option là hỏi muốn thêm mã hay không, rồi mới mở form khác. Ngoài ra, không unload mà để đó, tiếp tực xài.
PHP:
Private Sub ComboBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsEmpty(ComboBox1) Or ComboBox1 = "" Then Exit Sub
On Error GoTo Cancels
Me.TextBox1.Value = Me.ComboBox1.Column(1)
Me.Label2.Caption = Me.ComboBox1.Column(2)
Exit Sub
Cancels:
    Cancel = True
    ComboBox1 = "": TextBox1 = ""
Add = MsgBox("Not in List, Do you want to add new Item?", vbYesNo)
If Add = vbYes Then
    UserForm2.Show
End If
End Sub

Còn code sort thì rút gọn như ri:

PHP:
Private Sub CommandButton1_Click()
Sheets("sort").activate
        Range("dsct").Sort Key1:=Range("dsct").Resize(1, 1), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End Sub

Ồ, thực ra là mình xài afterupdate, nhưng nó vẫn báo lỗi automation error... hehehe.

Lý do mình muốn unload cái form đó luôn là vì sau khi mở userform2 để add thêm danh sách, khi quay trở lại userform1 thì sử dụng userform1.show không được.

Sau khi add thêm cái Exit sub thì nó chạy OK rồi, cám ơn 2 bác Du và Ptm0412 nhiều nhé.
Hạc
 
Upvote 0
Ồ, thực ra là mình xài afterupdate, nhưng nó vẫn báo lỗi automation error... hehehe.
Lý do mình muốn unload cái form đó luôn là vì sau khi mở userform2 để add thêm danh sách, khi quay trở lại userform1 thì sử dụng userform1.show không được.
Sau khi add thêm cái Exit sub thì nó chạy OK rồi, cám ơn 2 bác Du và Ptm0412 nhiều nhé.
Hạc

1. Lý do xài Before Update là để có thể cancel khi cần thiết: Khi gõ vào 1 mã không có trong DS, có 2 trường hợp:
- Gõ nhầm, cancel để làm lại.
- Cố tình gõ sai, để add thêm mã.

Phải lường trước tình huống gõ nhầm để có thể làm lại, do đó tôi mới xoá combobox để gõ lần 2.

2. Không unload form1, là để sau khi add mã, ta có thể tiếp tục nhập liệu ngay. Vấn đề chỉ là update lại Data source của combobox1 cho nó add thêm mã mới thôi. Dùng một câu lệnh là OK, còn hơn là phải mở form lên lại.

Nếu để nguyên code Change (dù có bổ sung câu lệnh Exit) mà dùng, tôi đã test, rất bất tiện nếu chỉ gõ sai dù chỉ 1 ký tự. Vế phương diện người dùng thì chán chết, ai mà chẳng có khi nhỡ, mà nhỡ, không cho làm lại, mất toi công sức nhập liệu các control trước đó, tức lắm.

3. Dùng AfterUpdate: Cũng tương tự Before Update, nhưng focus đã nhảy sang control kế tiếp rồi, mất công quay lại cái combobox1. Dùng code thì tôi chưa có lần nào set focus lại thành công.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom