2011-08-05 40 views
11

Tôi đang cố gắng để có được VBA để bắn các lệnhExcel không hoàn Macro sau khi mở cửa Một Workbook

sImportFilePath = Application.GetOpenFilename(FileFilter:= _ 
"Excel Files (*.xls), *.xls", Title:="Choose The Source File") 
Application.Workbooks.Open (sImportFilePath) 
sImportFileName = FunctionGetFileName(sImportFilePath) 

Và họ làm việc khi tôi bước qua chức năng, nhưng khi tôi sử dụng phím nóng Ctrl + Shift + F hoặc bất kỳ phím nóng nào khác, lệnh Application.Workbooks.Open hoạt động nhưng nó điều hướng tài liệu Excel mới, sau đó không làm bất cứ điều gì. Tuy nhiên, khi tôi mở "Macro" trong tab nhà phát triển, hãy chọn macro của tôi và nhấp vào "Chạy" mọi thứ đều chạy tốt.

+0

Bạn nói rằng nó không "làm bất cứ điều gì" - bạn đang mong đợi điều gì? Có lẽ có nhiều mã hơn sau mẫu đã đăng của bạn. FunctionGetFileName là gì? –

+0

Kết quả mong đợi sẽ được thực thi của dòng tiếp theo, FunctionGetFileName và tiếp tục thực thi thông qua tài liệu. FunctionGetFileName là một hàm tôi đã viết ở đâu đó trong chương trình tìm FileName từ FilePath, nhưng có nhiều mã sau đó cũng không thực thi. Tuy nhiên, từ thử nghiệm hơn nữa, tôi đã thu hẹp vấn đề và sửa đổi câu hỏi cho phù hợp. – soytsauce

+0

Phiên bản Excel nào? Làm việc cho tôi vào năm 2007 với Ctrl + Shift + F. –

Trả lời

18

Tôi thực sự đã gặp phải vấn đề chính xác này và cuối cùng đã tìm ra giải pháp cho vấn đề của mình.

Đây là nút Shift trong lối tắt bàn phím bạn đang sử dụng để gọi mã của bạn. Có vẻ như có một tính năng trong Excel được thiết kế đặc biệt để ngăn mã chạy khi sổ làm việc được mở và phím Shift được nhấn, nhưng không may điều này cũng ảnh hưởng đến việc mở sổ làm việc với phương pháp Workbook.Open qua VBA. Điều này đã được đề cập trong KB Article 555263, áp dụng cho Excel 2000 & 2003, nhưng tôi gặp phải cùng một vấn đề trong Excel 2010, vì vậy tôi tưởng tượng nó cũng ảnh hưởng đến năm 2007 là tốt.

Điều này xảy ra đặc biệt khi bạn cố mở một sổ làm việc qua mã rất sớm trong chương trình. Nếu cuộc gọi Workbook.Open đạt đến mã trước khi bạn có đủ thời gian để thực sự rời khỏi nút Shift, Excel giải thích rằng đó là một nỗ lực để chặn mã chạy và hủy quá trình. Và không có thông báo lỗi hoặc bất cứ điều gì mà tôi đã tìm thấy. Nó dừng lại đột ngột.

Giải pháp khắc phục sự cố/khắc phục sự cố là buộc mã phải chờ phím Shift được phát hành trước khi phát hành lệnh Workbook.Open.

mỗi bài báo, chỉ cần thêm mã này vào macro của bạn và rằng nên làm điều đó:

'Declare API 
Declare Function GetKeyState Lib "User32" (ByVal vKey As Integer) As Integer 
Const SHIFT_KEY = 16 

Function ShiftPressed() As Boolean 
'Returns True if shift key is pressed 
    ShiftPressed = GetKeyState(SHIFT_KEY) < 0 
End Function 

Sub Demo() 
    Do While ShiftPressed() 
     DoEvents 
    Loop 
    Workbooks.Open Filename:="C:\MyPath\MyFile.xlsx" 
End Sub 

(Chú ý: Mã này là dành cho phiên bản 32-bit của Excel phiên bản 64-bit sẽ cần phải sử dụng. thuộc tính PtrSafe trên tuyên bố Declare).

Nếu bạn không muốn thêm mã thêm, sau đó chỉ tùy chọn khác của bạn đang không sử dụng Ctrl +phím Shift +Một số văn để khởi động một vĩ mô, hoặc đặt lệnh Workbook.Open sau này trong macro (không phải ngay từ đầu) để cho bạn thời gian nhả nút Shift sau khi bắt đầu.

0

Một cách giải quyết đơn giản đã làm điều đó cho tôi là gán VBA cho một phím tắt mà không cần thay đổi. Tôi không phải là một fan hâm mộ lớn làm như vậy bởi vì có nhiều xung đột hơn với các phím tắt dafault Excel. Nhưng có một số tính năng có sẵn của Excel 2010 dựa trên this article: Ctrl + e, Ctrl + j, Ctrl + m, Ctrl + q.

+1

Chào mừng đến với SO! Câu trả lời này thêm bất kỳ giá trị nào? Đã có [câu trả lời] (http://stackoverflow.com/a/19712974/923794) mô tả vấn đề chính xác này chi tiết hơn với cách giải quyết khác. Nếu bạn muốn trả lời các câu hỏi cũ, hãy đảm bảo bạn đang cung cấp thêm giá trị. – cfi

1

Chỉ cần thêm một cuộc gọi duy nhất vào "DoEvents" trước khi gọi Workbooks.Open sẽ thực hiện thủ thuật. Vì vậy, đoạn folloiwng sẽ làm việc:

DoEvents 
Workbooks.Open Filename:="C:\MyPath\MyFile.xlsx" 
0

Giải pháp tạm thời được tìm thấy trên một diễn đàn Pháp: sử dụng dưới đây ForEachWinDoEvents trước khi kích hoạt bảng tính bạn đã chọn.

Sub Test() 
    Application.ScreenUpdating = False 
    Set w1 = Workbooks.Add(xlWBATWorksheet) 
    Set w2 = Workbooks.Add(xlWBATWorksheet) 
    Set w3 = Workbooks.Add(xlWBATWorksheet) 
    Application.ScreenUpdating = True 
    ForEachWinDoEvents 
    w2.Activate 
End Sub 

Sub ForEachWinDoEvents() 
Dim win As Window 
    For Each win In Application.Windows 
    DoEvents 
    Next win 
End Sub 
0

Câu hỏi bạn có một dòng mã chọn nhiều tab bất kỳ lúc nào trước dòng mã này? Tôi đã tìm thấy rằng đây là loại giống như giữ trong phím shift toàn bộ thời gian họ đang chọn. Để giải quyết điều này tôi đã có macro ungroup (chọn một) một tab và macro bắt đầu làm việc sau đó.

+0

Chào mừng bạn đến với SO. Vui lòng đọc [cách trả lời] này. – thewaywewere

Các vấn đề liên quan