จะระงับคำเตือน Update Links ได้อย่างไร?


110

ฉันกำลังพยายามเขียนสคริปต์ที่เปิดไฟล์ Excel จำนวนมาก ฉันได้รับข้อความแจ้ง:

This workbook contains links to other data sources.

ฉันต้องการป้องกันไม่ให้ข้อความนี้ปรากฏขึ้นเพื่อให้สคริปต์ของฉันสามารถดูเวิร์กบุ๊กทั้งหมดได้โดยอัตโนมัติโดยที่ฉันไม่ต้องคลิกDon't Updateสำหรับแต่ละรายการ ขณะนี้ฉันใช้สิ่งต่อไปนี้:

function getWorkbook(bkPath as string) as workbook

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

end function

อย่างไรก็ตามข้อความดังกล่าวยังคงปรากฏอยู่ ฉันจะระงับมันได้อย่างไร?

แก้ไข: ดูเหมือนว่าข้อความนี้จะปรากฏขึ้นสำหรับสมุดงานที่มีลิงก์เสีย ฉันไม่เห็นThis workbook contains one or more links that cannot be updatedข้อความเพราะฉันตั้งค่าDisplayAlertsเป็นเท็จ สมุดงานเชื่อมโยงกับไฟล์ที่เทียบเท่าในโฟลเดอร์บนเซิร์ฟเวอร์ Windows ของเราดังนั้นเมื่อไฟล์ที่ตรงกันถูกลบออกจากโฟลเดอร์นั้น (ซึ่งเกิดขึ้นเป็นส่วนหนึ่งของกระบวนการทางธุรกิจของเรา) ลิงก์จะแตก เป็นไปได้หรือไม่ที่จะระงับการเตือนเมื่อลิงค์เสีย?

นอกจากนี้ฉันใช้ Excel 2010


1
จากการสนทนากับ @SiddharthRout เราพบว่าตอนนี้สาเหตุคือการตั้งค่าที่แตกต่างกันสำหรับ Excel เวอร์ชันต่างๆโดยส่วนใหญ่คุณจะใช้ Excel 2010 หรือใหม่กว่า (Siddharth Rout มี 2010 ด้วย) ในขณะที่ฉันใช้ 2007 และไม่เห็นคำเตือนใด ๆ เลยหากลิงก์ ไม่เป็นไร เราจะทำการตรวจสอบเพิ่มเติมและกลับไปพร้อมกับโซลูชันที่ใช้งานได้ - ฉันหวังว่าอย่างนั้น) ลองคำตอบของ Siddharth Rout
Peter L.

2
คะแนนโหวตของฉันสำหรับกรณีที่น่าสนใจมาก!
Peter L.

@PeterL. เนื่องจากคุณไม่ได้รับลิงค์อัปเดตแม้ว่าคุณจะเปิดไฟล์ด้วยตนเองฉันเดาว่ามีการตั้งค่าที่ฉันหายไปที่ไหนสักแห่ง ให้ฉันทดสอบใน Excel 2007 ก่อนที่จะยืนยันได้ :)
Siddharth Rout

คุณสามารถโพสต์ตัวอย่างไฟล์ปัญหาได้หรือไม่? จะเป็นการดีหากได้เห็นลักษณะของลิงก์
brettdj

@brettdj เป็นกรรมสิทธิ์ดังนั้นฉันจึงไม่สามารถโพสต์ทั้งไฟล์ได้ ฉันจะตรวจสอบลิงก์เพื่อดูว่ามีปัญหาหรือไม่
sigil

คำตอบ:


139

อัพเดท:

หลังจากที่รายละเอียดทั้งหมดสรุปและพูดคุยกันผมใช้เวลา 2 ชั่วโมงเป็นธรรมในการตรวจสอบตัวเลือกและการปรับปรุงนี้คือการจุดทั้งหมดis

การเตรียมการ

ก่อนอื่นฉันได้ทำการติดตั้ง Office 2010 x86 แบบใหม่ทั้งหมดบนเครื่องเสมือน Clean Win7 SP1 Ultimate x64 ที่ขับเคลื่อนโดย VMWare (นี่เป็นกิจวัตรปกติสำหรับงานทดสอบประจำวันของฉันดังนั้นฉันจึงมีการปรับใช้หลายอย่าง)

จากนั้นฉันเปลี่ยนเฉพาะตัวเลือก Excel ต่อไปนี้ (กล่าวคือตัวเลือกอื่น ๆ ทั้งหมดจะเหลืออยู่หลังการติดตั้ง):

  • Advanced > General > Ask to update automatic links ตรวจสอบ :

ขอให้อัปเดตลิงก์อัตโนมัติ

  • Trust Center > Trust Center Settings... > External Content > Enable All... (แม้ว่าสิ่งที่เกี่ยวข้องกับการเชื่อมต่อข้อมูลมักไม่สำคัญสำหรับกรณีนี้):

เนื้อหาภายนอก

เงื่อนไขเบื้องต้น

ฉันเตรียมและวางลงในC:\สมุดงานตรงตาม@Siddharth Routคำแนะนำในคำตอบที่อัปเดตของเขา (แชร์เพื่อความสะดวกของคุณ): https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsxหนังสือที่เชื่อมโยงจึงถูกลบออกดังนั้นลิงก์ในแชร์ หนังสือไม่พร้อมใช้งาน (แน่นอน)

การเปิดด้วยตนเอง

ไฟล์ที่แชร์ด้านบนแสดงเมื่อเปิด (มีตัวเลือก Excel ในรายการด้านบน) คำเตือน 2 รายการ - ตามลำดับที่ปรากฏ:

คำเตือน # 1

เวิร์กบุ๊กนี้มีลิงก์ไปยังแหล่งข้อมูลอื่น

หลังจากคลิกที่Updateฉันคาดว่าจะได้รับอีก:

คำเตือน # 2

สมุดงานนี้มีลิงก์อย่างน้อยหนึ่งลิงก์ที่ไม่สามารถอัปเดตได้

ดังนั้นฉันคิดว่าสภาพแวดล้อมการทดสอบของฉันตอนนี้ค่อนข้างคล้ายกับOP's) จนถึงตอนนี้ดีมากในที่สุดเราก็ไปที่

การเปิด VBA

ตอนนี้ฉันจะลองตัวเลือกที่เป็นไปได้ทั้งหมดทีละขั้นตอนเพื่อให้ภาพชัดเจน ฉันจะแชร์เฉพาะบรรทัดของโค้ดที่เกี่ยวข้องเพื่อความเรียบง่าย (ไฟล์ตัวอย่างที่สมบูรณ์พร้อมโค้ดจะถูกแชร์ในตอนท้าย)

1. แอปพลิเคชั่นง่ายๆสมุดงานเปิด

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

ไม่แปลกใจ - สิ่งนี้ก่อให้เกิดคำเตือนทั้งสองแบบเช่นเดียวกับการเปิดด้วยตนเองด้านบน

2. Application.DisplayAlerts = เท็จ

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

รหัสนี้จบลงด้วยคำเตือน # 1และตัวเลือกอย่างใดอย่างหนึ่งคลิก ( Update/ Don't Update) ผลิตคำเตือนต่อไปไม่คือApplication.DisplayAlerts = Falseไม่ใส่คำเตือน # 2

3. Application.AskToUpdateLinks = False

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

ตรงข้ามกับDisplayAlertsรหัสนี้จบลงด้วยคำเตือน # 2เท่านั้นคือApplication.AskToUpdateLinks = Falseไม่ใส่คำเตือน # 1

4. ดับเบิ้ลเท็จ

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

เห็นได้ชัดว่ารหัสนี้จบลงด้วยการปราบปรามคำเตือนทั้งสอง

5. UpdateLinks: = เท็จ

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

สุดท้ายนี้โซลูชัน 1 บรรทัด (เสนอโดยเดิม@brettdj) ทำงานในลักษณะเดียวกับ Double False: ไม่มีคำเตือนปรากฏขึ้น!

ข้อสรุป

ยกเว้นการทดสอบที่ดีและกรณีแก้ไขที่สำคัญมาก (ฉันอาจประสบปัญหาดังกล่าวทุกวันในขณะที่ส่งสมุดงานของฉันไปยังบุคคลที่สามและตอนนี้ฉันเตรียมพร้อมแล้ว) เรียนรู้อีก 2 สิ่ง:

  1. ตัวเลือกของ Excel ไม่ว่าจะเป็นเวอร์ชันใดก็ตามโดยเฉพาะอย่างยิ่งเมื่อเราใช้โซลูชัน VBA
  2. ทุกปัญหามีวิธีแก้ปัญหาที่สั้นและสวยงาม - ร่วมกับปัญหาที่ไม่ชัดเจนและซับซ้อน อีกหนึ่งข้อพิสูจน์!)

ขอบคุณมากสำหรับทุกคนที่มีส่วนร่วมในการแก้ปัญหาและโดยเฉพาะ OP ที่ตั้งคำถาม หวังว่าการตรวจสอบของฉันและขั้นตอนการทดสอบที่อธิบายไว้อย่างละเอียดจะเป็นประโยชน์ไม่เพียง แต่สำหรับฉัน)

มีการแชร์ไฟล์ตัวอย่างที่มีตัวอย่างโค้ดด้านบน (หลายบรรทัดแสดงความคิดเห็นโดยเจตนา): https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

คำตอบเดิม (ทดสอบสำหรับExcel 2007พร้อมตัวเลือกบางอย่าง):

รหัสนี้ใช้งานได้ดีสำหรับฉัน - มันวนซ้ำผ่านไฟล์ Excel ทั้งหมดที่ระบุโดยใช้สัญลักษณ์แทนใน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

ฉันลองใช้กับหนังสือที่มีลิงก์ภายนอกที่ใช้งานไม่ได้ - ไม่มีคำเตือน

ไฟล์ตัวอย่าง: https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm


6
Application.DisplayAlerts = Falseจะไม่ปิดการใช้งานคำเตือนเหล่านั้น :)
Siddharth Rout

@SiddharthRout Sid ฉันสาบานว่าฉันไม่เห็นพวกเขา: ฉันมีไฟล์ที่มีลิงก์ดังกล่าวและเห็นคำเตือนขณะเปิดด้วยตนเอง ด้วยสคริปต์ด้านบน - ไม่มีคำเตือน) อาจแชร์วิดีโอให้คุณ))) Excel 2007 - ในกรณีนี้
Peter L.

โอเคลองดู :) เปิดสมุดงานใหม่สองเล่ม บันทึกเป็น book1.xlsx และ book2.xlsx ในเซลล์ A1 ของ book1 พิมพ์ "=" แล้วชี้ไปที่เซลล์ A1 ของ Book2 พิมพ์บางอย่างในเซลล์ A1 ของ Book2 หากคุณต้องการจากนั้นปิดสมุดงานทั้งสอง ตอนนี้เปิด book1 โดยใช้รหัสของคุณและคุณจะเห็นว่าคุณยังได้รับข้อความแจ้ง :)
Siddharth Rout

นอกจากนี้ก่อนที่คุณจะเรียกใช้การออกกำลังกายข้างต้นโปรดตรวจสอบ?Application.AskToUpdateLinksในหน้าต่างทันที ตั้งค่าเป็นเท็จแล้วหรือเป็นจริง ...
Siddharth Rout

2
+1 ถึง brettdj ลูกค้าของคุณจะต้องพอใจหากรายงานทั้งหมดของคุณคล้ายกัน)
Ksenia

23

เปิด VBA Editor ของ Excel แล้วพิมพ์ลงในหน้าต่างทันที (ดูภาพหน้าจอ)

Application.AskToUpdateLinks = False 

ปิด Excel แล้วเปิดไฟล์ของคุณ จะไม่แจ้งให้คุณทราบอีก อย่าลืมรีเซ็ตเมื่อคุณปิดสมุดงานมิฉะนั้นจะใช้ไม่ได้กับสมุดงานอื่นเช่นกัน

ภาพหน้าจอ :

ป้อนคำอธิบายภาพที่นี่

แก้ไข

ดังนั้นการนำไปใช้กับรหัสของคุณรหัสของคุณจะมีลักษณะเช่นนี้

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

ติดตาม

Sigil รหัสด้านล่างนี้ใช้งานได้กับไฟล์ที่มีลิงก์เสียเช่นกัน นี่คือรหัสทดสอบของฉัน

เงื่อนไขการทดสอบ

  1. สร้างไฟล์ใหม่ 2 ไฟล์ ชื่อพวกเขาSample1.xlsxและSample2.xlsxและบันทึกไว้ในC:\
  2. ในเซลล์A1ของSample1.xlsxพิมพ์สูตรนี้='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. บันทึกและปิดทั้งสองไฟล์
  4. ลบ Sample2.xlsx !!!
  5. Sampleเปิดสมุดงานใหม่และโมดูลมันวางโค้ดนี้และเรียกใช้ คุณจะสังเกตเห็นว่าคุณจะไม่ได้รับข้อความแจ้ง

รหัส

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
รหัสนั้นใช้งานได้สำหรับฉัน Sid ( ใน xl2010 ) เนื่องจากปิดใช้งานข้อความ แต่อัปเดตลิงก์ในพื้นหลัง การใช้ `` Set getWorkbook = Workbooks.Open (bkPath, False) 'จะระงับคำเตือนและไม่ขับเคลื่อนการอัปเดต ในการทดสอบxl03และxl10
brettdj

1
ขอบคุณเดฟ :) BTW ฉันเดาว่าคุณหมายถึง xl03 และ xl2007: P นอกจากนี้ฉันยังแก้ไขโพสต์ด้านบนเพื่อให้สอดคล้องกับคำแนะนำของคุณ
Siddharth Rout

1
@brettdj ขอบคุณมาก! เราใช้เวลาหนึ่งชั่วโมงกับซิดในเช้าวันนั้นเพื่อพยายามคิดหาคดี ดังนั้นโค้ดด้านบนจะระงับคำเตือนทั้งหมดสำหรับ Excel เวอร์ชันใด ๆ และทำให้ลิงก์อัปเดตโดยไม่โต้ตอบหรือไม่ และจะแก้ไขโค้ดเป็น AVOID update ได้อย่างไร? ขออภัยฉันหลงทางในตัวเลือกเล็กน้อย แต่หวังว่าฉันจะอธิบายถูกต้องทั้งหมด)
Peter L.

@brettdj แล้วจะเป็นยังไงถ้าApplication.DisplayAlerts = Falseเพิ่มด้วย?
Peter L.

1
@sigil: หากไม่เห็นสมุดงานของคุณฉันจะไม่สามารถแสดงความคิดเห็นเพิ่มเติมได้ ฉันได้ทดสอบโค้ดของฉันด้วยเงื่อนไขที่แตกต่างกันและทำงานได้อย่างไม่มีที่ติ อันที่จริงมันเป็นวิธีที่ถูกต้องในการระงับการแจ้งเตือนเหล่านั้น ...
Siddharth Rout

7

Excel 2016 ฉันมีปัญหาคล้ายกันเมื่อฉันสร้างสมุดงาน / ไฟล์จากนั้นฉันก็เปลี่ยนชื่อ แต่ยังคงชื่อสมุดงานเก่าไว้ หลังจาก Googling มาหลายครั้ง ... ดีไม่พบคำตอบสุดท้ายที่นั่น ...

ไปที่ DATA -> Edit Link -> Startup Prompt (ที่ด้านล่าง) จากนั้นเลือกตัวเลือกที่ดีที่สุดสำหรับคุณ


4
นี่คือทางออกที่ดีที่สุด มีผลเฉพาะกับสมุดงานที่ทำตัวเลือกนี้และไม่ต้องใช้ VBA ใด ๆ
Gaia

5

ฉันต้องการระงับการแจ้งเตือนที่ถามว่าคุณต้องการอัปเดตลิงก์ไปยังเวิร์กบุ๊กอื่นหรือไม่เมื่อเวิร์กบุ๊กของฉันเปิดด้วยตนเองใน Excel (ซึ่งต่างจากการเปิดโดยใช้โปรแกรมผ่าน VBA) ฉันลองรวมถึง: Application.AskToUpdateLinks = Falseเป็นบรรทัดแรกในAuto_Open()มาโคร แต่ไม่ได้ผล อย่างไรก็ตามฉันค้นพบว่าถ้าคุณใส่มันแทนในWorkbook_Open()ฟังก์ชันในThisWorkbookโมดูลมันจะทำงานได้อย่างยอดเยี่ยม - กล่องโต้ตอบถูกระงับ แต่การอัปเดตยังคงเกิดขึ้นอย่างเงียบ ๆ ในพื้นหลัง

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

ความคิดที่ดี; น่าเสียดายที่โครงการนี้ต้องการให้ฉันเปิดชุดสมุดงานที่มีเนื้อหาที่ฉันไม่สามารถแก้ไขได้ ดังนั้นจะไม่มีวิธีตั้งค่าWorkbook_Open()เหตุการณ์สำหรับแต่ละสมุดงานในชุดเป้าหมายของฉัน
sigil

3

(ฉันมีคะแนนตัวแทนไม่เพียงพอที่จะเพิ่มความคิดเห็น แต่ฉันต้องการเพิ่มความชัดเจนให้กับคำตอบที่นี่)

Application.AskToUpdateLinks = False อาจไม่ใช่สิ่งที่คุณต้องการ

หากตั้งค่าเป็น False MS Excel จะพยายามอัปเดตลิงก์โดยอัตโนมัติ แต่จะไม่แจ้งให้ผู้ใช้ทราบล่วงหน้า sorta counter-ง่าย

วิธีแก้ไขที่ถูกต้องหากคุณต้องการเปิดไฟล์โดยไม่ต้องอัปเดตลิงก์ควรเป็น:

สมุดงานเปิด (UpdateLinks: = 0)

ลิงค์ที่เกี่ยวข้อง: ความแตกต่างใน AskToUpdateLinks = False และ UpdateLinks: = 0


2

ฉันพบวิธีแก้ปัญหาชั่วคราวที่อย่างน้อยก็ให้ฉันดำเนินการกับงานนี้ ฉันเขียนสคริปต์ AutoIt สั้น ๆ ที่รอให้หน้าต่าง "อัปเดตลิงก์" ปรากฏขึ้นจากนั้นคลิกปุ่ม "ไม่อัปเดต" รหัสมีดังนี้:

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

จนถึงตอนนี้ดูเหมือนจะใช้งานได้ ฉันต้องการหาวิธีแก้ปัญหาที่เป็น VBA ทั้งหมดจริงๆเพื่อที่ฉันจะได้ทำให้แอปนี้เป็นแอปพลิเคชันแบบสแตนด์อโลน


2

หวังว่าจะให้ข้อมูลเพิ่มเติมในการแก้คำถามนี้ (หรือบางส่วน)

วิธีนี้จะใช้ได้กับการเปิดExcelไฟล์จากไฟล์อื่น บรรทัดรหัสจากMr. Peter L.สำหรับการเปลี่ยนแปลงให้ใช้ดังต่อไปนี้:

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

นี่คือในMSDS. เอฟเฟกต์คือมันอัปเดตทุกอย่าง (ใช่ทุกอย่าง) โดยไม่มีคำเตือน นอกจากนี้ยังสามารถตรวจสอบได้หากคุณบันทึกมาโคร

ในMSDSนั้นหมายถึงสิ่งนี้MS EXCEL 2010และ2013. ฉันคิดว่าMS EXCEL 2016ได้รับการคุ้มครองนี้เช่นกัน

ฉันมีMS EXCEL 2013และมีสถานการณ์เหมือนกันกับหัวข้อนี้ ดังนั้นผมจึงมีแฟ้ม (เรียกว่าA) มีWorkbook_Openรหัสเหตุการณ์ที่มักจะได้รับของที่ติดอยู่ในการเชื่อมโยงการปรับปรุงพรอมต์ ฉันมีไฟล์อื่น (เรียกว่าB) เชื่อมต่อกับไฟล์นี้และPivot Tablesบังคับให้ฉันเปิดไฟล์Aเพื่อให้สามารถโหลดโมเดลข้อมูลได้ เนื่องจากฉันต้องการเปิดAไฟล์แบบเงียบ ๆ ในพื้นหลังฉันจึงใช้บรรทัดที่ฉันเขียนไว้ข้างต้นกับ a Windows("A.xlsx").visible = falseและนอกเหนือจากเวลาในการโหลดที่มากขึ้นฉันจึงเปิดAไฟล์จากBไฟล์โดยไม่มีปัญหาหรือคำเตือนและอัปเดตอย่างสมบูรณ์ .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.