Jump to content

Openning an Excel Workbook without updating links


willichan
 Share

Recommended Posts

I have seen some threads where others have been looking for the ability to open an Excel workbook, and not be prompted about updating the linked data.  I had need of this myself, so below is a modified version of _Excel_BookOpen() from the Excel UDF that will not prompt, and will allow you script to continue unimpeeded by linked data.  You will still need to #Include <Excel.udf> to use this

; #FUNCTION# ====================================================================================================================
; Author ........: SEO <locodarwin at yahoo dot com>
; Modified.......: litlmike, water, GMK, willichan
; ===============================================================================================================================
Func _Excel_BookOpen_NoUpdate($oExcel, $sFilePath, $bReadOnly = Default, $bVisible = Default, $sPassword = Default, $sWritePassword = Default)
    If Not IsObj($oExcel) Or ObjName($oExcel, 1) <> "_Application" Then Return SetError(1, @error, 0)
    If Not FileExists($sFilePath) Then Return SetError(2, 0, 0)
    If $bReadOnly = Default Then $bReadOnly = False
    If $bVisible = Default Then $bVisible = True
    ;; changing the second parameter on the following line to a 0 tells Excel not to update any links.
    Local $oWorkbook = $oExcel.Workbooks.Open($sFilePath, 0, $bReadOnly, Default, $sPassword, $sWritePassword)
    If @error Then Return SetError(3, @error, 0)
    $oExcel.Windows($oWorkbook.Name).Visible = $bVisible
    ; If a read-write workbook was opened read-only then return an error
    If $bReadOnly = False And $oWorkbook.Readonly = True Then Return SetError(4, 0, $oWorkbook)
    Return $oWorkbook
EndFunc   ;==>_Excel_BookOpen_NoUpdate

Valid alternate values are:

0: Don't update any references

1: Update external references, but not remote references

2: Update remote references, but not external references

3: Update both remote and external references

 

Link to comment
Share on other sites

I will add this to the official Excel UDF.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

Valid alternate values are:

 

0: Don't update any references

1: Update external references, but not remote references

2: Update remote references, but not external references

3: Update both remote and external references

Where did you find this values?

MSDN only shows 0 and 3.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

Where did you find this values?

MSDN only shows 0 and 3.

I got them from here.  I haven't validated values 1 and 2, but they make sense.

Link to comment
Share on other sites

so with this - i can have a script automatically update the all links in the workbook when opened?

I am not sure you can open a workbook to be updated without Excel prompting you (depends on your settings in Excel).  But with this, you can open without updates, ensuring that your script will not be held up by an update prompt.

Link to comment
Share on other sites

Function _Excel_BookOpen will be modified like this (parameter $iUpdateLinks has been added):

#include <excel.au3>
$oExcel = _Excel_Open()
$oWrokbook = _Excel_BookOpenex($oExcel, @ScriptDir & "\test1.xlsx", Default, Default, Default, Default)
Exit

; #FUNCTION# ====================================================================================================================
; Author ........: SEO <locodarwin at yahoo dot com>
; Modified.......: litlmike, water, GMK, willichan
; Value         Effect
; (omitted)     Excel prompts the user to decide how to update links.
; 0             Excel doesn't update links.
; 1             Excel updates external links but not remote links. (doesn't seem to work with Excel 2010)
; 2             Excel updates remote links but not external links. (doesn't seem to work with Excel 2010)
; 3             Excel updates all links.
; ===============================================================================================================================
Func _Excel_BookOpenEx($oExcel, $sFilePath, $bReadOnly = Default, $bVisible = Default, $sPassword = Default, $sWritePassword = Default, $iUpdateLinks = Default)
    ; Error handler, automatic cleanup at end of function
    Local $oError = ObjEvent("AutoIt.Error", "__Excel_COMErrFunc")
    #forceref $oError
    If Not IsObj($oExcel) Or ObjName($oExcel, 1) <> "_Application" Then Return SetError(1, @error, 0)
    If Not FileExists($sFilePath) Then Return SetError(2, 0, 0)
    If $bReadOnly = Default Then $bReadOnly = False
    If $bVisible = Default Then $bVisible = True
    Local $oWorkbook = $oExcel.Workbooks.Open($sFilePath, $iUpdateLinks, $bReadOnly, Default, $sPassword, $sWritePassword)
    If @error Then Return SetError(3, @error, 0)
    $oExcel.Windows($oWorkbook.Name).Visible = $bVisible
    ; If a read-write workbook was opened read-only then set @extended = 1
    If $bReadOnly = False And $oWorkbook.Readonly = True Then Return SetError(0, 1, $oWorkbook)
    Return $oWorkbook
EndFunc   ;==>_Excel_BookOpenEx

I have been testing with Excel 2010 and got the following result

Defautl displays a selection Window where the user has to decide how to handle links

0 doesn't update links

1 is ignored

2 is ignored

3 updates all links.

_Excel_Open parameter $bDisplayAlerts = False has no effect when $iUpdateLinks = Default.

Could you please test and tell me if the function meets your expectations? If yes, it will become part of the Excel UDF.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

so with this - i can have a script automatically update the all links in the workbook when opened?

With my modified version you set the parameter to 3 and all links are updated.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

  • 2 years later...

Hi All, I am getting that error Variable must be of type "object"

here is my code where did I go wrong. The code work for awhile now all my version  are getting the same error on win7

$STORENUM = IniRead(@ScriptDir & "\config.ini", "data", "STORENUM", "")
                $Calculator = IniRead(@ScriptDir & "\config.ini", "data", "Calculator", "")
                
                
                ;$oExcel = _Excel_Open(False, Default, Default, Default, True) ; always create new instance will not close excel on destop
                $oExcel = _Excel_Open(False)
                $datawb = _Excel_BookOpen($oExcel, $STORENUM, True)
                $datawb.worksheets("Black").select
                $datawb.ActiveWorksheet.RefreshAll
                $LastRow = $datawb.ActiveSheet.UsedRange.Rows.Count
                $mydata = _Excel_RangeRead($datawb, Default, "A1:AI" & $LastRow)
                _Excel_BookClose($datawb, False)
                ;_ArrayDisplay($mydata)

                
                sorry for the spamming here is the answer on the help file
                
                Use $oExcel.Windows($oWorkbook.Name).Visible = True to make the Workbook visible again.
            Else the Workbook will not be shown when you manually open it using Excel.
            Most of the time this parameter is not needed. Using $bVisible = False in _Excel_Open is the preferred way.

 

Captureexcelerror.JPG

Edited by antonioj84
Link to comment
Share on other sites

sorry for the spamming from the help file

Use $oExcel.Windows($oWorkbook.Name).Visible = True to make the Workbook visible again.
Else the Workbook will not be shown when you manually open it using Excel.
Most of the time this parameter is not needed. Using $bVisible = False in _Excel_Open is the preferred way.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...