[Hỏi đáp] Workbook_open() không chạy do lỗi timing?

Blue Softs Liên hệ QC

longtran295

Thành viên mới
Tham gia
21/1/15
Bài viết
15
Được thích
0
Chào cả nhà,
Mình viết 1 đoạn code ngắn để mở rộng ribbon khi mở file (code trong Thisworkbook):
Mã:
Private Sub Workbook_open()
If Application.CommandBars("Ribbon").Height<=100 Then
SendKeys "^{F1}", True
End If
End Sub
Nhưng code không chạy. Mình nghĩ do time file loading đoạn code không có tác dụng. Các bạn có giải pháp nào chờ file load xong rồi tiến hành chạy code trên không ạ.
Mình cảm ơn!
 

batman1

Thành viên gạo cội
Tham gia
8/9/14
Bài viết
4,717
Được thích
7,745
Chào cả nhà,
Mình viết 1 đoạn code ngắn để mở rộng ribbon khi mở file (code trong Thisworkbook):
Mã:
Private Sub Workbook_open()
If Application.CommandBars("Ribbon").Height<=100 Then
SendKeys "^{F1}", True
End If
End Sub
Nhưng code không chạy. Mình nghĩ do time file loading đoạn code không có tác dụng. Các bạn có giải pháp nào chờ file load xong rồi tiến hành chạy code trên không ạ.
Mình cảm ơn!
Trò chơi SendKeys luôn là trò chơi may rủi. Tại sao?

SendKeys là gửi phím tới cửa sổ đang hoạt động, bất luận đó là cửa sổ nào. Nếu ở thời điểm thực hiện SendKeys - thời điểm gửi phím, cửa sổ cần nhận phím không là cửa sổ hoạt động mà cửa sổ khác mới đang hoạt động, thì trò chơi kết thúc không có hậu.

Có thể thử thay vì Workbook_open thì dùng Workbook_WindowActivate. Tuy nhiên vì lý do ở trên tôi không hâm mộ SendKeys. Chỉ khi hết cách mới dùng SendKeys một cách miễn cưỡng.

Gọi phương thức của đối tượng bao giờ cũng chắc hơn. Ở đây không có chuyện may rủi, ta không tóm bừa một cửa sổ, một đối tượng đang active để thực hiện một hành vi trên nó. Code truy cập tới đối tượng cụ thể và gọi phương thức của nó. Đối tượng cụ thể ở đây là Application.CommandBars, và ExecuteMso là phương thức của nó.

Code cần thực hiện thay cho SendKeys
Mã:
Application.CommandBars.ExecuteMso "MinimizeRibbon"
Thực hiện lần 1 thì ribbon đang thu hẹp trở thành mở rộng, lần 2 thì đang mở rộng trở thành thu hẹp. Cứ "bật" tắt" luân phiên.
 
Upvote 0

longtran295

Thành viên mới
Tham gia
21/1/15
Bài viết
15
Được thích
0
@batman1 bác thử check Application.CommandBars, và ExecuteMso với Workbook_open xem có được ko, em check với Office 2016 thì không được, cả cái SendKeys cũng vậy. Nên em mới nghĩ do Workbook_open timing. Còn chuyển về Workbook_WindowActivate thì không đáp ứng yêu cầu của em rồi.
 
Upvote 0

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
@batman1 bác thử check Application.CommandBars, và ExecuteMso với Workbook_open xem có được ko, em check với Office 2016 thì không được, cả cái SendKeys cũng vậy. Nên em mới nghĩ do Workbook_open timing. Còn chuyển về Workbook_WindowActivate thì không đáp ứng yêu cầu của em rồi.
Bạn nên thử chứ không phải người hướng dẫn nên thử. Có khi thử xong thì câu kết luận "không đáp ứng" sẽ phải rút lại.
 
Upvote 0

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Cảm ơn bác quan tâm, ở trên e thử và có nói "em check với Office 2016 thì không được".
Bạn nói "chuyển về Workbook_WindowActivate thì không đáp ứng". Còn thử với 2016 là bạn thử "ExecuteMso với Workbook_open", chưa thử Activate
 
Upvote 0

longtran295

Thành viên mới
Tham gia
21/1/15
Bài viết
15
Được thích
0
Em muốn khi mở workbook là pin ribbon rồi ấy, còn activate phải khi chọn lại cửa sổ workbook thì code mới hoạt động. Cái Workbook_open nếu time load file delay thì code không hoạt động thì có cách nào check nếu file chưa load xong thì wait rồi loop cho đến khi file load xong không ấy bác.
 
Upvote 0

longtran295

Thành viên mới
Tham gia
21/1/15
Bài viết
15
Được thích
0
Em dùng custom ribbon, nên cần hiện ribbon, nhiều người nhận mail họ không đọc nội dung mail đâu chỉ đọc tiêu đề và mở file attact, nên nếu ẩn ribbon ko thấy gì họ lại hỏi ngược mình chứ ko đọc lại mail.
Bài đã được tự động gộp:

Không cứ gì ribbon, bác thử MsgBox vào Workbook_open xem cũng lúc được lúc không ấy.
 
Upvote 0

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Em muốn khi mở workbook là pin ribbon rồi ấy, còn activate phải khi chọn lại cửa sổ workbook thì code mới hoạt động. Cái Workbook_open nếu time load file delay thì code không hoạt động thì có cách nào check nếu file chưa load xong thì wait rồi loop cho đến khi file load xong không ấy bác.
Sau cái "timing" bạn nói, sẽ là lần đầu tiên activate trong cuộc đời của em ấy. Bạn không hiểu chuyện này nên nhất định không thử.
Vẫn có giới hạn của activate ở chỗ bác @batman1 nói, luân phiên mở, đóng, mở với chỉ 1 lệnh
 
Upvote 0

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
12,460
Được thích
15,515
Upvote 0

longtran295

Thành viên mới
Tham gia
21/1/15
Bài viết
15
Được thích
0
Lúc nào cũng được ngon lành.
Bác thử add vào file nặng 1 chút xem, và thử cả trường hợp đang mở nhiều workbook khác nữa. Em thử các máy khác cũng Office 2016 10 lần thì vài lần không hiện msgbox là bình thường.
Bài đã được tự động gộp:

Bạn không hiểu chuyện này nên nhất định không thử.
Không thử này là không thử gì vậy bác.
Application.CommandBars.ExecuteMso "HideRibbon" x2; Application.ExecuteExcel4Macro "Show.ToolBar(""Ribbon"",True) 2 cách này e đều thử rồi.
 
Lần chỉnh sửa cuối:
Upvote 0

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Không thử này là không thử gì vậy bác.
Application.CommandBars.ExecuteMso "HideRibbon" x2; Application.ExecuteExcel4Macro "Show.ToolBar(""Ribbon"",True) 2 cách này e đều thử rồi.
Thử "lần đầu activate của em ấy". Mà thôi, chắc tôi sai, để tôi ngưng.
 
Upvote 0

longtran295

Thành viên mới
Tham gia
21/1/15
Bài viết
15
Được thích
0
Em ví dụ 1 file này về lỗi timing workbook_open của bro nào trong diễn đàn mình thì phải. Khi chạy đúng thì khi mở file sẽ hiện ra popup(user form) đăng nhập. Nhưng thử 10 lần thì sẽ có vài lần không hiện ra popup này.
 

File đính kèm

  • PHAN MEM BAN HANG - WPRO 2.0 DEMO.xlsm
    4.8 MB · Đọc: 3
Upvote 0

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
12,460
Được thích
15,515
Này thì ribbon .

TPOrny.gif
 
Upvote 0

longtran295

Thành viên mới
Tham gia
21/1/15
Bài viết
15
Được thích
0
Bác thử file nặng và trong trường hợp đang mở nhiều workbook xem, file e thao tác toàn trên chục MB thôi nên thời gian mở nó lâu bác ạ, chứ file nhẹ thì không nói làm gì. Em thử lúc được lúc không mới nói cách trên không được.
Bài đã được tự động gộp:

Bác thử add vào file nặng 1 chút xem, và thử cả trường hợp đang mở nhiều workbook khác nữa.
Bài đã được tự động gộp:

Bác thử mở sẵn 1 file 10MB, rồi mở thêm 1 file 10MB nữa (file này chứa macro), 10 lần như thế xem macro có chạy đc cả 10 ko. Không biết máy bác mạnh đến đâu khiến time load file nhanh như thế nào chứ máy em riêng mở 1 file em attact ví dụ ở trên đã có lúc hiện popup đăng nhập lúc không hiện rồi.
 
Lần chỉnh sửa cuối:
Upvote 0

batman1

Thành viên gạo cội
Tham gia
8/9/14
Bài viết
4,717
Được thích
7,745
@batman1 bác thử check Application.CommandBars, và ExecuteMso với Workbook_open xem có được ko, em check với Office 2016 thì không được, cả cái SendKeys cũng vậy. Nên em mới nghĩ do Workbook_open timing. Còn chuyển về Workbook_WindowActivate thì không đáp ứng yêu cầu của em rồi.
Nếu bạn thử rồi mà không được thì hãy đính kèm tập tin. Và nhất thiết phải hướng dẫn cụ thể, làm thế nào để "không được". Tức click tập tin ở desktop để mở hay mở Excel rồi chọn File -> Open. Hay trước đó mở tập tin khác rồi mới File -> Open tập tin đính kèm. Hay còn gì nữa. Hướng dẫn từng bước thao tác với tập tin đính kèm để "không được". Với tôi "không được" chưa chắc thuyết phục.
Và tại sao Workbook_WindowActivate thì không đáp ứng yêu cầu của bạn. Khi bạn mở tập tin thì phải chạy sự kiện đó chứ.
Bài đã được tự động gộp:

Vẫn có giới hạn của activate ở chỗ bác @batman1 nói, luân phiên mở, đóng, mở với chỉ 1 lệnh
Luân phiên có tác dụng như này anh ạ, nếu code không phải đặt ở Button_Click mà ở Workbook_WindowActivate.

Nếu phiên làm việc cuối cùng mà người dùng minimize ribbon thì bây giờ mở tập tin sẽ có ribbon thả rộng. Nếu phiên làm việc trước người dùng thả rộng ribbon thì bây giờ mở tập tin sẽ có ribbon thu hẹp.
 
Lần chỉnh sửa cuối:
Upvote 0
Top Bottom