Hỏi về viết Class Module trong VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

langtuchungtinh360

Thành viên đã dừng hoạt động
Tham gia
7/10/13
Bài viết
1,062
Được thích
334
chào mọi người
lời đầu em chúc mọi người một buổi sáng đầu tuần mạnh khỏe và tràn đầy niềm vui
vào thẳng vấn đề luôn he
chả là e đang tập tành viết Class
vấn đề là trên Sheet thì mình có hàm offset(x,y,a,b) để lấy 1 vùng a,b bắt đầu tại vị trí x,y
vậy trong VBA thì lại không thể áp dụng vào để lấy 1 vùng trong mảng với offset và resize
nên em muốn viết 1 Class để làm công việc này
ví dụ trong ClassModule1 có sub xOffset (Mảng, vị trí z, vị trí y)
thì code là
with New ClassModule1
.xOffset(Arr,x,y).??????
end with
làm sao để có thể "." tiếp ngay sau hàm Offset được?
có thể em chưa biết lệnh nào tương tự như hàm Offset nên nếu có lệnh như thế mong mọi người chỉ giúp để em đỡ viết lệnh làm chậm quá trình xử lý đi
tiện thể chỉ em cách làm được vấn đề trên để sau này em áp dụng công việc viết class.
 
bạn xem file mới tại #16 chưa, ý bạn trả lời mình đã giải quyết được rồi. file mới muốn hỏi tại sao khi đóng form đi thì có lênh add thêm Name vào thì code gọi sự kiện không hoạt động được.
vụ Add hay Xóa Name thì có ảnh hưởng gì đến lệnh gọi sự kiện trong class hay không? vậy có cách nào khắc phục không? cho dù có giải phóng biến thì khi đó gọi lại thì vẫn chạy được bình thường chứ nhỉ?

xem rồi, thấy các bước bạn nói trong file vẫn y như cũ có khác đâu?

và xem kỹ lại thì có thấy dòng code nào là
tại sao khi đóng form đi thì có lênh add thêm Name vào thì code gọi sự kiện không hoạt động được
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Taotextbox
End Sub
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
uhm file này thì khác
Nhưng vẫn tình trạng Lỗi chức năng chương trình khi bấm ADD dù có hay không có Add NAME - giống như cũ
lỗi thế nào bạn? mình thử chỉ có khi chạy code Add thêm Name cho file thì nó mới bị.
có cách nào khắc phục không bạn.
 
Upvote 0
lỗi thế nào bạn? mình thử chỉ có khi chạy code Add thêm Name cho file thì nó mới bị.
có cách nào khắc phục không bạn.

Lỗi là textbox không di chuyển theo sự kiện select..., dù có E1=0 (trường hợp down về mở file ngay) , và sau thì khi có name

KHẮC PHỤC:
Làm như sau:

- thay 2 sub Taotextbox Insert0, bởi 3 sub dưới đây
Mã:
 Sub Taotextbox()
    Insert0 ActiveSheet, "Forms.TextBox.1"
    Application.OnTime Now() + TimeValue("00:00:01"), "KhoiTaoGlobal"
    Application.Wait Now() + TimeValue("00:00:01")
End Sub

Sub Insert0(Optional ByVal Ws As Worksheet, Optional nID As String)
    Dim obj As OLEObject
    Application.EnableEvents = False
'XÓA DÒNG NÀY NHA
    For Each obj In Ws.OLEObjects
        If obj.progID = nID Then GoTo Thoat
    Next
    Set obj = Ws.OLEObjects.Add(ClassType:=nID, Link:=False, DisplayAsIcon:=False, _
            Left:=0, Top:=0, Width:=50, Height:=18)
Thoat:
    Application.EnableEvents = True
    Exit Sub
    
    If dim_clsTextbox Is Nothing Then
        Set dim_clsTextbox = New clsTextBox
        dim_clsTextbox.Wrap obj.Object
    End If
    If dim_WsChange Is Nothing Then
        Set dim_WsChange = New WsChange
        dim_WsChange.CreateApp Application
    End If
    'Set objtx = obj
   
    Application.EnableEvents = True
    
    Set Ws = Nothing
    Set obj = Nothing
End Sub

Sub KhoiTaoGlobal()    
    If dim_WsChange Is Nothing Then
        'MsgBox "xay ra 1 dim_WsChange Is Nothing "
        Set dim_WsChange = New WsChange
        dim_WsChange.CreateApp Application
    End If
    If dim_clsTextbox Is Nothing Then
        'MsgBox "xay ra 2 dim_clsTextbox Is Nothing "
        Set dim_clsTextbox = New clsTextBox
        dim_clsTextbox.Wrap ActiveSheet.TextBox1
    End If
End Sub

Bạn thử sẽ kết quả như ý, dù có name, hay không có add name

---------tìm nguyên nhân
tất nhiên từ sau đoạn
Exit Sub
của sub Insert0 thì các dòng code cũ đó có thể xóa đi, để lại cho bạn có thể thử tìm ra nguyên nhân, thử bằng cách
- bật 2 dòng chi chú MSGBOX trong sub KhoiTaoGlobal
- tạm tắt dòng Exit sub ở sub Insert0 trên đi
sẽ thấy là sao các biến obj từ các class dù đã gán ở insert0 (sau exit sub) nhưng sang khoitaoglobal nó vẫn là nothing (???) - sự mất phương hướng là ở chỗ này
==> bạn xem code và tự rút ra nguyên nhân tại sao,
Tôi chỉ tạm làm code chữa tình huống vậy thui, chắc còn nhiều cách khác hay hơn
 
Lần chỉnh sửa cuối:
Upvote 0
sẽ thấy là sao các biến obj từ các class dù đã gán ở insert0 (sau exit sub) nhưng sang khoitaoglobal nó vẫn là nothing (???) - sự mất phương hướng là ở chỗ này
==> bạn xem code và tự rút ra nguyên nhân tại sao,
Tôi chỉ tạm làm code chữa tình huống vậy thui, chắc còn nhiều cách khác hay hơn
xem mà cũng chả hiểu tại sao nữa bác ạ, code toàn mò chỉnh sửa lại không à nên không hiểu nguyên nhân.
rất mong được sự giải thích
trước kia mình nghĩ chắc là do code chạy nhanh quá nó tạo không kịp, phải dừng lại một thời gian mới được
nhưng sau khi thử thì chả có gì khác, tương tự như vậy, code bạn cho cũng có Wait


rồi ban đầu xem code bạn cho mình cũng lại nghĩ là do nguyên nhân trên hoặc do giải phóng biến Worksheet hay Object chăng.
đã thử cho code Application.Wait Now() + TimeValue("00:00:01") vào trước khi gọi class và không giải phóng biến thì class cũng chả chạy
=> bó tay. dân nghiệp dư ko có kiến thức cơ bản nên không hiểu nguyên do rồi bác ạ


với lại rất ít khi mình thấy code này xuất hiện
Application.Wait Now() + TimeValue("00:00:01")
lần duy nhất mình thấy là để xử lý file nén vì khi nén file không kịp mà code đã chạy tiếp nên phải chờ 1 thwofi gian để nó xử lý xong mới chạy code
có phải nguyên nhân cũng là đây
hay là do gọi sự kiện trước sau có khác nhau chăng


ps: rất mong được sự giải thích từ bác để mở rộng thêm
 
Upvote 0
Sử dụng được chưa?, nếu kết quả tốt rui thì dùng thui

trước kia mình nghĩ chắc là do code chạy nhanh quá nó tạo không kịp, phải dừng lại một thời gian mới được

Đúng 1 nửa rồi,

Không phải code chạy nhanh quá, mà là ngược lại

- vì code của bạn nhét vào sự kiện Form_QueryClose -- nên nó chưa kịp focus vào textbox được,
- nên cần 1 thời gian để thực hiện

(thử bỏ ra ngoài Form xem, tực là nút ADD trực tiếp TaoTextbox - thì sẽ không cần phải chờ gì cả)

Lý do đơn giản vậy thui
 
Upvote 0
Sử dụng được chưa?, nếu kết quả tốt rui thì dùng thui



Đúng 1 nửa rồi,

Không phải code chạy nhanh quá, mà là ngược lại

- vì code của bạn nhét vào sự kiện Form_QueryClose -- nên nó chưa kịp focus vào textbox được,
- nên cần 1 thời gian để thực hiện

(thử bỏ ra ngoài Form xem, tực là nút ADD trực tiếp TaoTextbox - thì sẽ không cần phải chờ gì cả)

Lý do đơn giản vậy thui
ok, cảm ơn bác, để thử lại các kiểu tìm nguyên nhân xem sao.
 
Upvote 0
Web KT

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

Back
Top Bottom