Làm thế nào để ngăn chặn cảnh báo Cập nhật Liên kết?


109

Tôi đang cố gắng viết một tập lệnh để mở nhiều tệp Excel. Tôi tiếp tục nhận được lời nhắc:

This workbook contains links to other data sources.

Tôi muốn giữ thông báo này không xuất hiện để tập lệnh của tôi có thể tự động đi qua tất cả các sổ làm việc mà tôi không cần phải nhấp vào Don't Updatetừng sổ. Hiện tại tôi đang sử dụng những thứ sau:

function getWorkbook(bkPath as string) as workbook

Application.EnableEvents=False
Application.DisplayAlerts=False
getWorkbook=Workbooks.Open(bkPath,updatelinks:=0,readonly:=false)

end function

Tuy nhiên, thông báo vẫn xuất hiện. Làm thế nào tôi có thể ngăn chặn nó?

CHỈNH SỬA: Có vẻ như thông báo này sắp xuất hiện cho các sổ làm việc có liên kết bị hỏng; Tôi không thấy This workbook contains one or more links that cannot be updatedthông báo vì tôi đã đặt DisplayAlertsthành false. Các sổ làm việc được liên kết với các tệp tương đương trong một thư mục trên máy chủ Windows của chúng tôi, vì vậy khi tệp trùng khớp bị xóa khỏi thư mục đó (xảy ra như một phần của quy trình kinh doanh của chúng tôi), liên kết sẽ bị hỏng. Có thể ngăn chặn cảnh báo khi liên kết bị hỏng không?

Ngoài ra, tôi đang sử dụng Excel 2010.


1
Từ cuộc thảo luận với @SiddharthRout, bây giờ chúng ta thấy nguyên nhân là do các cài đặt khác nhau cho các phiên bản Excel khác nhau: rất có thể bạn sử dụng Excel 2010 trở lên (Siddharth Rout cũng có 2010), trong khi tôi đang sử dụng 2007 và không thấy cảnh báo nào nếu liên kết đều ổn. Chúng tôi sẽ thực hiện thêm một số cuộc điều tra và quay lại với giải pháp làm việc - tôi hy vọng là như vậy) Bây giờ hãy thử câu trả lời của Siddharth Rout.
Peter L.

2
Ủng hộ của tôi cho trường hợp rất thú vị!
Peter L.

@PeterL. vì bạn không nhận được liên kết cập nhật ngay cả khi bạn mở tệp theo cách thủ công, tôi đoán có một cài đặt mà tôi đang thiếu ở đâu đó. Hãy để tôi kiểm tra nó trong Excel 2007 trước khi tôi có thể xác nhận. :)
Siddharth Rout

Bạn có thể đăng một mẫu của một tập tin vấn đề? Nó sẽ là tốt để xem bản chất của liên kết
brettdj

@brettdj, nó thuộc quyền sở hữu nên tôi không thể đăng toàn bộ tệp. Tôi sẽ điều tra các liên kết để có thể xem liệu có vấn đề gì với chúng hay không.
sigil

Câu trả lời:


139

CẬP NHẬT:

Sau khi tất cả các chi tiết được tóm tắt và thảo luận, tôi đã dành 2 giờ công bằng để kiểm tra các tùy chọn và bản cập nhật này là để chấm tất cả các is.

Chuẩn bị

Trước hết, tôi đã thực hiện cài đặt Office 2010 x86 sạch trên máy ảo Clean Win7 SP1 Ultimate x64 được hỗ trợ bởi VMWare (đây là thói quen thông thường cho các tác vụ thử nghiệm hàng ngày của tôi, vì vậy tôi đã triển khai nhiều công việc trong số đó).

Sau đó, tôi chỉ thay đổi các tùy chọn Excel sau (nghĩa là tất cả các tùy chọn khác được giữ nguyên sau khi cài đặt):

  • Advanced > General > Ask to update automatic links đã kiểm tra :

Yêu cầu cập nhật liên kết tự động

  • Trust Center > Trust Center Settings... > External Content > Enable All... (mặc dù cái liên quan đến Kết nối dữ liệu rất có thể không quan trọng đối với trường hợp này):

Nội dung bên ngoài

Điều kiện tiên quyết

Tôi đã chuẩn bị và đặt vào C:\một sổ làm việc chính xác theo @Siddharth Routgợi ý trong câu trả lời cập nhật của anh ấy (được chia sẻ để thuận tiện cho bạn): https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx Sách được liên kết sau đó đã bị xóa vì vậy liên kết đó trong phần được chia sẻ sách không có sẵn (chắc chắn).

Mở thủ công

Tệp được chia sẻ ở trên hiển thị khi mở (có các tùy chọn Excel được liệt kê ở trên) 2 cảnh báo - theo thứ tự xuất hiện:

CẢNH BÁO # 1

Sổ làm việc này chứa các liên kết đến các nguồn dữ liệu khác

Sau khi nhấp vào Update tôi mong đợi nhận được một:

CẢNH BÁO # 2

Sổ làm việc này chứa một hoặc nhiều liên kết không thể cập nhật

Vì vậy, tôi cho rằng môi trường thử nghiệm của tôi bây giờ khá giống với OP 's) Cho đến nay rất tốt, cuối cùng chúng tôi đã đi đến

Khai mạc VBA

Bây giờ tôi sẽ thử tất cả các tùy chọn có thể từng bước để làm cho bức tranh rõ ràng. Tôi sẽ chỉ chia sẻ các dòng mã có liên quan để đơn giản hơn (tệp mẫu hoàn chỉnh với mã sẽ được chia sẻ cuối cùng).

1. Ứng dụng đơn giản.Workbooks.Open

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"

Không có gì ngạc nhiên - điều này tạo ra cảnh báo CẢ HAI, như đối với việc mở bằng tay ở trên.

2. Ứng dụng.DisplayAlerts = Sai

Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True

Mã này kết thúc bằng CẢNH BÁO # 1 và một trong hai tùy chọn được nhấp ( Update/ Don't Update) sẽ KHÔNG tạo ra cảnh báo nào khác, tức là sẽ Application.DisplayAlerts = Falseloại bỏ CẢNH BÁO # 2 .

3. Application.AskToUpdateLinks = Sai

Application.AskToUpdateLinks = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.AskToUpdateLinks = True

Ngược lại DisplayAlerts, mã này chỉ kết thúc với CẢNH BÁO # 2 , tức là Application.AskToUpdateLinks = Falseloại bỏ CẢNH BÁO # 1 .

4. Sai kép

Application.AskToUpdateLinks = False
Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True

Rõ ràng, mã này kết thúc với việc loại bỏ CẢ CẢNH BÁO .

5. UpdateLinks: = Sai

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=False

Cuối cùng, giải pháp 1 dòng này (được đề xuất ban đầu @brettdj) hoạt động giống như Double False: KHÔNG CÓ CẢNH BÁO nào được hiển thị!

Kết luận

Ngoại trừ một thực tiễn thử nghiệm tốt và trường hợp đã giải quyết rất quan trọng (tôi có thể gặp phải những vấn đề như vậy hàng ngày khi gửi sổ làm việc của mình cho bên thứ ba và bây giờ tôi đã chuẩn bị sẵn sàng), 2 điều nữa đã học được:

  1. Tùy chọn Excel CÓ vấn đề, bất kể phiên bản - đặc biệt là khi chúng ta đến với các giải pháp VBA.
  2. Mọi rắc rối đều có giải pháp ngắn gọn và thanh lịch - cùng với giải pháp không rõ ràng và phức tạp. Chỉ một bằng chứng nữa cho điều đó!)

Rất cảm ơn tất cả những người đã đóng góp cho giải pháp, và đặc biệt là OP đã đưa ra câu hỏi. Hy vọng điều tra của tôi và các bước thử nghiệm được mô tả kỹ lưỡng không chỉ hữu ích cho tôi)

File mẫu với các mẫu code trên được chia sẻ (nhiều dòng được comment cố ý): https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

Câu trả lời gốc (được thử nghiệm cho Excel 2007 với các tùy chọn nhất định):

Mã này hoạt động tốt đối với tôi - nó lặp qua TẤT CẢ các tệp Excel được chỉ định bằng ký tự đại diện trong InputFolder:

Sub WorkbookOpening2007()

Dim InputFolder As String
Dim LoopFileNameExt As String

InputFolder = "D:\DOCUMENTS\" 'Trailing "\" is required!

LoopFileNameExt = Dir(InputFolder & "*.xls?")
Do While LoopFileNameExt <> ""

Application.DisplayAlerts = False
Application.Workbooks.Open (InputFolder & LoopFileNameExt)
Application.DisplayAlerts = True

LoopFileNameExt = Dir
Loop

End Sub

Tôi đã thử nó với những cuốn sách có liên kết bên ngoài không khả dụng - không có cảnh báo.

Tệp mẫu: https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm


6
Application.DisplayAlerts = Falsesẽ không vô hiệu hóa những cảnh báo đó :)
Siddharth Rout

@SiddharthRout Sid Tôi thề là tôi không nhìn thấy chúng: Tôi có một tệp với các liên kết như vậy và thấy cảnh báo khi mở nó theo cách thủ công. Với script trên - không có cảnh báo) Có thể chia sẻ video cho bạn))) Excel 2007 - đề phòng.
Peter L.

Ok, hãy thử cái này :) Mở hai sổ làm việc mới. Lưu chúng dưới dạng book1.xlsx và book2.xlsx. Trong Ô A1 của book1, nhập "=" và trỏ nó đến ô A1 của Book2. Nhập một cái gì đó vào ô A1 của Book2 nếu bạn muốn và sau đó đóng cả hai sổ làm việc. Bây giờ mở Book1 sử dụng mã của bạn và bạn sẽ thấy rằng bạn vẫn nhận được :) nhắc
Siddharth rout

Ngoài ra trước khi bạn chạy bài tập trên, hãy kiểm tra ?Application.AskToUpdateLinkstrong cửa sổ Ngay lập tức. Là nó đã được thiết lập là false hoặc là nó đúng ...
Siddharth rout

2
+1 tới brettdj. Khách hàng của bạn phải rất vui nếu tất cả các báo cáo của bạn đều giống nhau)
Ksenia

22

Mở VBA Editor của Excel và nhập vào cửa sổ ngay lập tức (Xem ảnh chụp màn hình)

Application.AskToUpdateLinks = False 

Đóng Excel rồi mở Tệp của bạn. Nó sẽ không nhắc bạn một lần nữa. Hãy nhớ đặt lại nó khi bạn đóng sổ làm việc nếu không nó cũng sẽ không hoạt động với các sổ làm việc khác.

ScreenShot :

nhập mô tả hình ảnh ở đây

BIÊN TẬP

Vì vậy, áp dụng nó vào mã của bạn, mã của bạn sẽ trông như thế này

Function getWorkbook(bkPath As String) As Workbook
    Application.AskToUpdateLinks = False
    Set getWorkbook = Workbooks.Open(bkPath, False)
    Application.AskToUpdateLinks = True
End Function

THEO SÁT

Sigil, Đoạn mã dưới đây cũng hoạt động trên các tệp có liên kết bị hỏng. Đây là mã thử nghiệm của tôi.

Điều kiện kiểm tra

  1. Tạo 2 tệp mới. Đặt tên cho chúng Sample1.xlsxSample2.xlsxvà lưu chúng trênC:\
  2. Trong ô A1của Sample1.xlsx, hãy nhập công thức này='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. Lưu và đóng cả hai tệp
  4. Xóa Sample2.xlsx !!!
  5. Mở sổ làm việc Mới và mô-đun của nó dán mã này và chạy Sample. Bạn sẽ nhận thấy rằng bạn sẽ không nhận được lời nhắc.

Option Explicit

Sub Sample()
    getWorkbook "c:\Sample1.xlsx"
End Sub

Function getWorkbook(bkPath As String) As Workbook
    Application.AskToUpdateLinks = False
    Set getWorkbook = Workbooks.Open(bkPath, False)
    Application.AskToUpdateLinks = True
End Function

3
Mã đó phù hợp với tôi Sid ( trong xl2010 ) ở chỗ nó đã vô hiệu hóa thông báo, nhưng nó đã cập nhật liên kết trong nền. Sử dụng `Set getWorkbook = Workbooks.Open (bkPath, False) 'sẽ ngăn cảnh báo và không thúc đẩy cập nhật. Đang thử nghiệm xl03xl10
brettdj

1
Cảm ơn Dave. :) BTW, tôi đoán ý bạn là xl03 và xl2007: P Ngoài ra, tôi đã chỉnh sửa bài đăng trên để phản ánh đề xuất của bạn.
Siddharth Rout

1
@brettdj cảm ơn rất nhiều! Chúng tôi đã dành một giờ vui vẻ với Sid vào buổi sáng hôm đó để tìm hiểu vụ việc. Vì vậy, đoạn mã trên có ngăn chặn tất cả các cảnh báo cho bất kỳ phiên bản Excel nào và làm cho các liên kết được cập nhật một cách âm thầm không? Và tôi nên sửa đổi mã như thế nào để TRÁNH cập nhật? Xin lỗi, tôi là một chút mất trong các tùy chọn, nhưng hy vọng tôi đã giải thích tất cả một cách chính xác)
Peter L.

@brettdj và nếu Application.DisplayAlerts = Falsecũng được thêm vào thì sẽ như thế nào?
Peter L.

1
@sigil: Nếu không nhìn thấy sổ làm việc của bạn, tôi sẽ không thể nhận xét thêm. Tôi đã thử nghiệm mã của mình với các điều kiện khác nhau và nó hoạt động hoàn hảo. Trong thực tế nó là đúng cách để ngăn chặn những cảnh báo ...
Siddharth rout

6

Excel 2016 Tôi đã gặp sự cố tương tự khi tôi tạo một sổ làm việc / tệp và sau đó tôi đã thay đổi tên nhưng bằng cách nào đó tên sổ làm việc cũ vẫn được giữ lại. Sau rất nhiều googling ... à, không tìm thấy câu trả lời cuối cùng nào ở đó ...

Vào DATA -> Edit Link -> Startup Prompt (ở dưới cùng) Sau đó chọn tùy chọn tốt nhất cho bạn.


3
Đây là giải pháp tốt nhất. Nó chỉ ảnh hưởng đến sổ làm việc mà lựa chọn này được thực hiện và nó không yêu cầu bất kỳ VBA nào.
Gaia

5

Tôi muốn loại bỏ lời nhắc hỏi bạn có muốn cập nhật liên kết đến một sổ làm việc khác khi sổ làm việc của tôi được mở theo cách thủ công trong Excel (trái ngược với việc mở nó theo chương trình thông qua VBA). Tôi đã thử bao gồm: Application.AskToUpdateLinks = Falsenhư dòng đầu tiên trong Auto_Open()macro của mình nhưng điều đó không hoạt động. Tuy nhiên, tôi đã phát hiện ra rằng nếu bạn đặt nó thay thế vào Workbook_Open()chức năng trong ThisWorkbookmô-đun, nó hoạt động tuyệt vời - hộp thoại bị chặn nhưng cập nhật vẫn diễn ra âm thầm trong nền.

 Private Sub Workbook_Open()
    ' Suppress dialog & update automatically without asking
    Application.AskToUpdateLinks = False
End Sub

Ý tưởng tốt; thật không may, dự án này yêu cầu tôi phải mở một bộ sổ làm việc có nội dung mà tôi không thể sửa đổi. Vì vậy, sẽ không có cách nào để đặt Workbook_Open()sự kiện cho từng sổ làm việc trong tập mục tiêu của tôi.
sigil

3

(Tôi không có đủ điểm đại diện để thêm nhận xét, nhưng tôi muốn thêm một số câu trả lời rõ ràng ở đây)

Application.AskToUpdateLinks = Sai có thể không phải là điều bạn muốn.

Nếu được đặt thành Sai, thì MS Excel sẽ cố gắng cập nhật liên kết tự động, nó sẽ không nhắc người dùng trước, sắp xếp phản trực quan.

Giải pháp chính xác, nếu bạn đang tìm cách mở tệp mà không có cập nhật liên kết nên là:

Workbook.Open (UpdateLinks: = 0)

Liên kết liên quan: Sự khác biệt trong AskToUpdateLinks = False và UpdateLinks: = 0


2

Tôi đã tìm thấy một giải pháp tạm thời ít nhất sẽ cho phép tôi xử lý công việc này. Tôi đã viết một đoạn mã AutoIt ngắn chờ cửa sổ "Cập nhật liên kết" xuất hiện, sau đó nhấp vào nút "Không cập nhật". Mã như sau:

while 1
if winexists("Microsoft Excel","This workbook contains links to other data sources.") Then
   controlclick("Microsoft Excel","This workbook contains links to other data sources.",2)
EndIf
WEnd

Cho đến nay điều này dường như đang hoạt động. Tuy nhiên, tôi thực sự muốn tìm một giải pháp hoàn toàn là VBA để tôi có thể làm cho ứng dụng này trở thành một ứng dụng độc lập.


2

Hy vọng sẽ cung cấp thêm một số đầu vào trong việc giải quyết câu hỏi này (hoặc một phần của nó).

Điều này sẽ hoạt động để mở một Exceltệp từ một tệp khác. Một dòng mã từ ông Peter L. , để thay đổi, hãy sử dụng như sau:

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=3

Đây là trong MSDS. Hiệu quả là nó chỉ cập nhật mọi thứ (vâng, mọi thứ) mà không có cảnh báo. Điều này cũng có thể được kiểm tra nếu bạn ghi macro.

Trong MSDS, nó đề cập đến điều này MS EXCEL 20102013. Tôi nghĩ rằng MS EXCEL 2016điều này cũng được bảo hiểm.

Tôi có MS EXCEL 2013, và có một tình huống khá giống với chủ đề này. Vì vậy, tôi có một tệp (gọi nó A) với Workbook_Openmã sự kiện luôn bị kẹt trên dấu nhắc liên kết cập nhật . Tôi có một tệp khác (gọi nó B) được kết nối với tệp này và Pivot Table buộc tôi phải mở tệp Ađể có thể tải mô hình dữ liệu. Vì tôi muốn mở Atệp âm thầm trong nền, tôi chỉ cần sử dụng dòng mà tôi đã viết ở trên, với a Windows("A.xlsx").visible = false, và ngoài thời gian tải lớn hơn, tôi mở Atệp từB tệp mà không gặp sự cố hoặc cảnh báo nào và được cập nhật đầy đủ .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.