Jump to content
Nighterfighter

Get value of "fake" checkbox inside Excel 2010

Recommended Posts

Nighterfighter

Hey guys, I am finishing up a script that will run a import a lof of VBA code, the .bas files, (more VBA code than can easily be ported into AutoIt. Thousands of lines...) to do some work on Excel spreadsheets.

 

However, Excel has a security setting where it blocks macros from being run/loaded, unless both the "Enable All Macros" setting is enabled, and the "Trust access to the VBA project object model" checkbox is enabled. However, that checkbox appears to be fake. Using the AutoIt WindowInfo tool, there is no control ID for that checkbox.

 

I have spent the last several hours trying to get this to work. Here is what I have so far, all of the control-send down/up etc are to get to the right menu options inside Excel.

 

#include <Excel.au3>
#include <FileConstants.au3>



Global $oExcel, $oWorkbook, $oCurrSheet, $sMsg
Global $sXLS = "C:\Users\SNIP\Downloads\test.xlsm"
Global $sWorkbook = @ScriptDir & "\test.xlsm"
Global $sBAS = @ScriptDir & "\Module1.bas", $sMacroName = "Main"

SelectExcelFile()
SelectBASFile()
$oExcel = _Excel_Open()
$sWorkbook = _Excel_BookOpen($oExcel, $sWorkbook);
WinWaitActive("Microsoft Excel - " & $sWorkbook)
;MsgBox($MB_OK,"Open","Workbook is open")

ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "!f");
Sleep(50)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "!t");
Sleep(50)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "!f");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " , "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " , "", "", "{TAB}");
Sleep(105)
ControlSend("Microsoft Excel - " , "", "", "{TAB}");
Sleep(105)
ControlSend("Microsoft Excel - " , "", "", "{TAB}");
Sleep(105)
ControlSend("Microsoft Excel - " , "", "", "{TAB}");
Sleep(105)
ControlSend("Microsoft Excel - " , "", "", "{TAB}");
Sleep(105)
ControlSend("Microsoft Excel - " , "", "", "{ENTER}");
Sleep(105)
ControlSend("Excel Options", "", "", "!t");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{UP}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{DOWN}");
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "!e")
Sleep(105)
ControlSend("Trust Center", "", "", "!v") ;This part is not working. It doesn't select the checkbox, even though alt+v does manually.
Sleep(100)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "{ENTER}")
Sleep(105)
ControlSend("Microsoft Excel - " & $sWorkbook, "", "", "!{F4}")
$oExcel.VBE.ActiveVBProject.VBComponents.Import($sBAS)
$oExcel.Application.Run("Main")

;These two functions are just to select the files.

Func SelectExcelFile()
    ; Create a constant variable in Local scope of the message to display in FileOpenDialog.
    Local Const $sMessage = "Select Excel File To Sort."

    ; Display an open dialog to select a list of file(s).
    Local $sFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "Excel Files (*.xlsx;*xlsm;*.xls;)|", $FD_FILEMUSTEXIST + $FD_MULTISELECT)
    If @error Then
        ; Display the error message.
        MsgBox($MB_SYSTEMMODAL, "", "No file(s) were selected.")

        ; Change the working directory (@WorkingDir) back to the location of the script directory as FileOpenDialog sets it to the last accessed folder.
        FileChangeDir(@ScriptDir)
    Else
        ; Change the working directory (@WorkingDir) back to the location of the script directory as FileOpenDialog sets it to the last accessed folder.
        FileChangeDir(@ScriptDir)

        ; Replace instances of "|" with @CRLF in the string returned by FileOpenDialog.
        $sFileOpenDialog = StringReplace($sFileOpenDialog, "|", @CRLF)

        ; Display the list of selected files.
        $sWorkbook = $sFileOpenDialog ;Assign the file selected to the workbook file
       ; MsgBox($MB_SYSTEMMODAL, "", "You chose the following files:" & @CRLF & $sFileOpenDialog)
    EndIf
 EndFunc   ;==>Example

 Func SelectBASFile()
    ; Create a constant variable in Local scope of the message to display in FileOpenDialog.
    Local Const $sMessage = "Select BAS Macro."

    ; Display an open dialog to select a list of file(s).
    Local $sFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "BAS Files (*.bas;)|", $FD_FILEMUSTEXIST + $FD_MULTISELECT)
    If @error Then
        ; Display the error message.
        MsgBox($MB_SYSTEMMODAL, "", "No file(s) were selected.")

        ; Change the working directory (@WorkingDir) back to the location of the script directory as FileOpenDialog sets it to the last accessed folder.
        FileChangeDir(@ScriptDir)
    Else
        ; Change the working directory (@WorkingDir) back to the location of the script directory as FileOpenDialog sets it to the last accessed folder.
        FileChangeDir(@ScriptDir)

        ; Replace instances of "|" with @CRLF in the string returned by FileOpenDialog.
        $sFileOpenDialog = StringReplace($sFileOpenDialog, "|", @CRLF)

        ; Display the list of selected files.
        $sBAS = $sFileOpenDialog ;Assign the file selected to the workbook file
        ;MsgBox($MB_SYSTEMMODAL, "", "You chose the following files:" & @CRLF & $sFileOpenDialog)
    EndIf
EndFunc   ;==>Example

 

What's the best way to get the value of that imaginary checkbox, and if it isn't checked, check it? Or if it is checked, leave it alone? I tried doing a PixelSearch but that didn't work.

 

 

And I can't manually enable the developer settings. This program will go to a few other users who won't know how to do that, and I can't remote in.

Share this post


Link to post
Share on other sites
spudw2k

Those values should be set in the registry.  You could just apply the settings there...but it's not recommended (security risk).  Have you explored a solution that uses Trusted Locations?

Share this post


Link to post
Share on other sites
Nighterfighter

Thanks for that link, but that won't work for what I am trying to do. 

 

I was able to get it working after a few more hours. I ended up checking the pixel value of the checkbox, and if it was already checked, skip over it. Else, click it.

Share this post


Link to post
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

  • Similar Content

    • AzgarD
      By AzgarD
      Hi guys. I know this is a newbie topic, very newbie, but i've read a lot of stuff and still don't get it. I just need to copy something from Excel cell, paste this in other program, copy something in this program and paste in other Excel cell. Something like...
      Copy A2 Use some WindowActivate and MouseMove stuff and CTRL+C (not a problem) Go back to the Excel sheet Paste that content in C2 Then Copy A3 Use some WindowActivate and MouseMove stuff and CTRL+C (not a problem) Go back to the Excel sheet Paste that content in C3 ... And it goes on The problem is, how can i "communicate" with Excel and do this row change? Like A2 to C2 and A3 to C3 ... In a efficient way that can be done like hundreds of times.
      Very newbie question but still not understanding this.
       
      Ty guys.
    • b9k
      By b9k
      Hi, I am stuck on a GUI problem and would like your help to solve it.
      I am trying to automate the SoundWire Server app to match my current system volume level while it is minimized to the notification area (so no clicking or stealing focus),
      I can already get the handle and alter the tracker position by sending a WM_SETPOS message, but somehow the actual volume is not changed: I think I need to do something else to trigger the event handler for the value change and propagate it correctly.
      This is the control summary from Au3 info:
      >>>> Window <<<< Title: SoundWire Server Class: #32770 Position: 441, 218 Size: 566, 429 Style: 0x94CA00C4 ExStyle: 0x00050101 Handle: 0x0000000000510E12 >>>> Control <<<< Class: msctls_trackbar32 Instance: 4 ClassnameNN: msctls_trackbar324 Name: Advanced (Class): [CLASS:msctls_trackbar32; INSTANCE:4] ID: 6002 Text: Position: 51, 222 Size: 47, 126 ControlClick Coords: 1, 101 Style: 0x5001000A ExStyle: 0x00000000 Handle: 0x00000000001234C8 >>>> Mouse <<<< Position: 496, 567 Cursor ID: 2 Color: 0xF0F0F0 >>>> StatusBar <<<< >>>> ToolsBar <<<< >>>> Visible Text <<<< Default multimedia device Tray on Start Static Server Address: 192.168.1.8 Status: Connected to B9K~OP3 Audio Output Audio Input Level Record to File Input Select: 44.1 kHz Minimize to Master Volume Mute >>>> Hidden Text <<<< Slider2 Mute OK Cancel Label Balance Slider1 Volume Front L/R Fr C/LFE Side L/R Back L/R
      I am attaching the program in question so you don't have to install it (i don't know if it is portable enough, tough): 

      SoundWire Server_files.zip

      Thanks in advance and I hope I didn't post in the wrong section
    • Gowrisankar
      By Gowrisankar
      Dear members of the forum,
      I need to open excel files that may or may not need a password and finally move the files that needs password to manual queue.
      Is there a fastest way to do this?
       
      PS: I have a huge respect for the rules of this forum. I am not asking assistance to override any security measure. I just need to segregate the files that needs passwords.
    • MrCheese
      By MrCheese
      Hi guys,
      without including everything (unless you want it)
      I am copying data from a table in chrome and wanting to paste it into excel.
      Copying in Chrome works.
      I can paste it into the field i want by emulating goto -> ctrl V:
      WinActivate($dataload) WinWaitActive($dataload) Sleep(500) $oWorkbook1.Sheets("ItemReturn").Activate Sleep(500) $msg = "Measuring Sheet" conwrite() ttips2() Local Const $xlUp = -4162 With $oWorkbook1.ActiveSheet ; process active sheet $oRangeLast = .UsedRange.SpecialCells($xlCellTypeLastCell) ; get a Range that contains the last used cells $iRowCount = .Range(.Cells(1, 1), .Cells($oRangeLast.Row, "B")).Rows.Count ; get the the row count for the range starting in row/column 1 and ending at the last used row/column $iLastCell = .Cells($iRowCount + 1, "B").End($xlUp).Row ; start in the row following the last used row and move up to the first used cell in column "B" and grab this row number EndWith $NewStartCell = $iLastCell + 2 $msg = "moving to location" conwrite() ttips2() Sleep(250) Send("^g") WinWait("Go To") Sleep(100) Send("B" & $NewStartCell) Sleep(100) Send("{ENTER}") Sleep(500) Send("^v")  
      But, I want to use _excel_rangecopypaste, pasting from the clipboard
      _Excel_RangeCopyPaste($oWorkbook1.ActiveSheet, default, "B" & $NewStartCell,default,$xlPasteValuesAndNumberFormats) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeCopy Example 2", "Error pasting cells." & @CRLF & "@error = " & @error & ", @extended = " & @extended) however, this gives me error 4 , extended@:  -2147352567
      How can i fix this or find out how to debug this error?
       
      Thanks
    • Simpel
      By Simpel
      Hi.
      I try to figure out who is using a excel workbook which I can only open "read only". I use this code:
      #include <Array.au3> #include <Excel.au3> Local $sFile = ; excel file with path on a network drive Local $oExcel = _Excel_Open(True, True) Local $oTabelle = _Excel_BookOpen($oExcel, $sFile) Local $aUsers If IsObj($oTabelle) Then $aUsers = $oTabelle.UserStatus _ArrayDisplay($aUsers) EndIf If I am the one allowed to write to the excel file (I'm the first one who opened it) then I will get an array with myself:

      If my collegue opened the excel file first and I run the code I get the following error message:
      "H:\_Conrad lokal\Downloads\AutoIt3\_COX\Tests\test.au3" (9) : ==> The requested action with this object has failed.: $aUsers = $oTabelle.UserStatus $aUsers = $oTabelle^ ERROR The excel file is on a network drive. Is that's the problem?
      Regards, Conrad
×