2009-02-23 17 views

Trả lời

59

Không chắc chắn nếu bạn có thể mở chúng vô hình trong hiện tại xuất sắc dụ

Bạn có thể mở một trường hợp mới của excel mặc dù, che giấu nó và sau đó mở workbook

Dim app as New Excel.Application 
app.Visible = False 'Visible is False by default, so this isn't necessary 
Dim book As Excel.Workbook 
Set book = app.Workbooks.Add(fileName) 
' 
' Do what you have to do 
' 
book.Close SaveChanges:=False 
app.Quit 
Set app = Nothing 

Như những người khác đã được đăng, đảm bảo bạn dọn dẹp sau khi bạn hoàn tất bất kỳ sổ làm việc nào đã mở

+0

Nó dừng nhấp nháy trên thanh tác vụ nhưng gây ra nhấp nháy trong con trỏ. Ngay cả Application.Cursor không giúp (trong Office 2010 x64). – sevenkul

+4

tôi khuyên bạn khóa xuống phiên ứng dụng trước khi mở bảng tính mục tiêu: 'App.AutomationSecurity = msoAutomationSecurityForceDisable' 'App.EnableEvents = False' 'App.Calculation = xlCalculationManual' - Và bạn có thể xem xét liệt kê bộ sưu tập AddIns và tắt chúng cũng vậy: ** các phần khởi động bổ trợ chậm sẽ trì hoãn việc khởi chạy phiên ứng dụng **. –

+0

@Nile Tất cả đều nghe như ý tưởng tuyệt vời –

0

Làm nổi bật, ẩn sổ làm việc và lưu chúng dưới dạng ẩn. Khi ứng dụng của bạn tải chúng, chúng sẽ không được hiển thị.

Chỉnh sửa: khi đọc lại, nó trở nên rõ ràng rằng các sổ làm việc này không phải là một phần của ứng dụng của bạn. Giải pháp như vậy sẽ không phù hợp với sổ làm việc của người dùng.

1

Mở chúng từ phiên bản Excel mới.

Sub Test() 

    Dim xl As Excel.Application 
    Set xl = CreateObject("Excel.Application") 

    Dim w As Workbook 
    Set w = xl.Workbooks.Add() 

    MsgBox "Not visible yet..." 
    xl.Visible = True 

    w.Close False 
    Set xl = Nothing 

End Sub 

Bạn cần phải nhớ dọn dẹp sau khi hoàn tất.

+2

Chỉ cần nhấn mạnh, bạn phải dọn dẹp sau khi bạn đang thực hiện với một trường hợp vô hình. Nếu bạn không người dùng không thể mở tệp excel bằng cách nhấp đúp hoặc khởi chạy từ các ứng dụng khác trừ khi họ đăng xuất hoặc biết cách giết các quy trình (vì các tệp được mở trong cửa sổ ẩn). – David

23

Nếu phù hợp với nhu cầu của bạn, tôi sẽ chỉ cần sử dụng

Application.ScreenUpdating = False 

với lợi ích bổ sung tăng tốc mã của bạn, chứ không chậm nó xuống bằng cách sử dụng một trường hợp thứ hai của Excel.

9

Mặc dù bạn có câu trả lời cho những người tìm thấy câu hỏi này, bạn cũng có thể mở bảng tính Excel dưới dạng kho dữ liệu JET. Mượn chuỗi kết nối từ một dự án tôi đã sử dụng nó trên, nó sẽ trông giống như thế này:

strExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & objFile.Path & ";Extended Properties=""Excel 8.0;HDR=Yes""" 
strSQL = "SELECT * FROM [RegistrationList$] ORDER BY DateToRegister DESC" 

Lưu ý rằng "RegistrationList" là tên của tab trong sổ làm việc. Có một vài hướng dẫn nổi trên web với các thông tin cụ thể về những gì bạn có thể và không thể truy cập một trang tính theo cách này.

Chỉ nghĩ rằng tôi muốn thêm. :)

+0

Thật tuyệt vời !!!! –

+0

có phù hợp với bạn không? có vẻ như không hoạt động ở excel 2003 –

+0

@ShawnZhang Hầu hết các tệp Excel mà chúng tôi đã đọc đều được xuất ở định dạng 2000/2003 vì đó là những gì chương trình của người gửi phát ra. Có một biến thể của chuỗi kết nối mà chúng tôi đã thử nghiệm cho các tệp 2007/2010 hoạt động tốt. – AnonJr

8

Để mở một bảng tính như ẩn trong trường hợp hiện tại của Excel, sử dụng như sau:

Application.ScreenUpdating = False 
    Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True 
    ActiveWindow.Visible = False 
    ThisWorkbook.Activate 
    Application.ScreenUpdating = True 
+0

Cảm ơn, nó làm việc khi tôi sử dụng như thế này: 'ThisWorkbook.Activate: ActiveWindow.Visible = False: Application.ScreenUpdating = false' TẤT CẢ MÃ KHÁC ĐÂY 'Application.ScreenUpdating = True: ThisWorkbook.Activate: ActiveWindow.Visible = True' Không phải thanh tác vụ hay con trỏ. – sevenkul

1

Mở workbook như ẩn và sau đó đặt nó là "lưu" để người dùng không được nhắc nhở khi họ đóng cửa.

Dim w As Workbooks 

Private Sub Workbook_Open() 
    Application.ScreenUpdating = False 
    Set w = Workbooks 
    w.Open Filename:="\\server\PriceList.xlsx", UpdateLinks:=False, ReadOnly:=True 'this is the data file were going to be opening 
    ActiveWindow.Visible = False 
    ThisWorkbook.Activate 
    Application.ScreenUpdating = True 
End Sub 

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    w.Item(2).Saved = True 'this will suppress the safe prompt for the data file only 
End Sub 

Điều này phần nào dẫn xuất câu trả lời do Ashok đăng.

Bằng cách thực hiện theo cách này, bạn sẽ không được nhắc lưu thay đổi vào tệp Excel mà bạn đọc. Điều này thật tuyệt vời nếu tệp Excel mà bạn đọc được dự định là nguồn dữ liệu để xác thực. Ví dụ: nếu sổ làm việc chứa tên sản phẩm và dữ liệu giá, nó có thể bị ẩn và bạn có thể hiển thị tệp Excel đại diện cho hóa đơn có các trình đơn thả xuống cho sản phẩm xác thực từ danh sách giá đó.

Sau đó, bạn có thể lưu trữ danh sách giá trên một vị trí được chia sẻ trên mạng ở đâu đó và đặt ở chế độ chỉ đọc.

2

Vấn đề với cả câu trả lời của iDevlop và Ashok là vấn đề cơ bản là lỗ hổng thiết kế Excel (rõ ràng) trong đó phương thức Open không tuân theo cài đặt Application.ScreenUpdating của False. Do đó, đặt nó thành False là không có lợi cho vấn đề này.

Nếu giải pháp Patrick McDonald quá nặng nề do phí bắt đầu phiên bản Excel thứ hai, thì giải pháp tốt nhất tôi tìm được là giảm thiểu thời gian mở sổ làm việc bằng cách kích hoạt lại cửa sổ gốc nhanh càng tốt:

Dim TempWkBk As Workbook 
Dim CurrentWin As Window 

Set CurrentWin = ActiveWindow 
Set TempWkBk = Workbooks.Open(SomeFilePath) 
CurrentWin.Activate  'Allows only a VERY brief flash of the opened workbook 
TempWkBk.Windows(1).Visible = False 'Only necessary if you also need to prevent 
            'the user from manually accessing the opened 
            'workbook before it is closed. 

'Operate on the new workbook, which is not visible to the user, then close it... 
+0

Tại sao bạn cần hành động với 'ActiveWindow'? Tôi nghĩ rằng chỉ cần ẩn cửa sổ bảng tính sau khi nó được mở ra có tác dụng tương tự – Winand

3

Một cách tiếp cận đơn giản hơn nhiều mà không liên quan đến thao tác cửa sổ đang hoạt động:

Dim wb As Workbook 
Set wb = Workbooks.Open("workbook.xlsx") 
wb.Windows(1).Visible = False 

Từ những gì tôi có thể nói chỉ số windows trên bảng tính nên luôn luôn 1. Nếu bất cứ ai biết về bất kỳ điều kiện chủng tộc nào có thể làm cho điều này không đúng sự thật, hãy cho tôi biết.

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