alien4u Posted April 16, 2016 Share Posted April 16, 2016 11 hours ago, water said: I'm on vacation right now. Will answer at the end of next week. OK water thank you, in the mean time I will try and read to see if I can do it. Thanks you again. Regards Alien. Link to comment Share on other sites More sharing options...
alien4u Posted April 18, 2016 Share Posted April 18, 2016 (edited) Hi again @antmar904 Thanks to @water for the suggestion and to @Jfish for the help I found a better way to achieve what you request using native Excel Objects and Methods so is more efficient and you don't need to read the entire Worksheet to an array and then parse that array, the fact is no array is needed. The final code is like this: #include<Excel.au3> Local $oAppl = _Excel_Open() Local $oWorkbook = _Excel_BookOpen($oAppl,@ScriptDir&"\Excel1.xlsx") ; your workbook here Global Const $xlUp = -4162 Global Const $xlToLeft = -4159 ; This will give you the Number of Used Rows in Column A that u will use like a base for finding last used cell per each row With $oWorkbook.ActiveSheet $countRow = .Cells(.Rows.Count, "A").End($xlUp).row EndWith ; With a For loop from Row 1 to the final used Row in Column A For $i = 1 To $countRow ; Number of Columns in each Row and we need that last used column number With $oWorkbook.ActiveSheet $countCol = .Cells($i, .Columns.Count).End($xlToLeft).Column EndWith ; We need to translate Colunm Number to Letter to use that in RangeRead() $ColLetter = _Excel_ColumnToLetter($countCol) $aResult = _Excel_RangeRead($oWorkbook, Default,$ColLetter&$i , 1) MsgBox(0,"",$aResult) Next And here you have @Jfish last code: #include <Excel.au3> Local $oAppl = _Excel_Open() Local $oWorkbook = _Excel_BookOpen($oAppl,@ScriptDir&"\Excel1.xlsx") ; your workbook here Global Const $xlUp = -4162 Global Const $xlToLeft = -4159 ;Number of Rows With $oWorkbook.ActiveSheet $countRow = .Cells(.Rows.Count, "A").End($xlUp).row EndWith For $i = 1 To $countRow ; Number of Columns in 1 Row With $oWorkbook.ActiveSheet $LastUsedCellInRow = .Range("IV"&$i).End($xlToLeft).Address $LastUsedCellInRow = StringReplace($LastUsedCellInRow,"$","") $aResult = _Excel_RangeRead($oWorkbook, Default,$LastUsedCellInRow , 1) EndWith MsgBox("","",$aResult) Next Regards Alien. Edited April 18, 2016 by alien4u Link to comment Share on other sites More sharing options...
alien4u Posted April 18, 2016 Share Posted April 18, 2016 The Shortest way so far without the need of calling _Excel_RangeRead(): #include<Excel.au3> Local $oAppl = _Excel_Open() Local $oWorkbook = _Excel_BookOpen($oAppl,@ScriptDir&"\Excel1.xlsx") ; your workbook here Global Const $xlUp = -4162 Global Const $xlToLeft = -4159 With $oWorkbook.ActiveSheet $countRow = .Cells(.Rows.Count, "A").End($xlUp).row EndWith For $i = 1 To $countRow With $oWorkbook.ActiveSheet $lastColvalue = .Cells($i, .Columns.Count).End($xlToLeft).value EndWith MsgBox(0,"",$lastColvalue) Next Regards Alien. water 1 Link to comment Share on other sites More sharing options...
Trong Posted April 19, 2016 Share Posted April 19, 2016 I think no need "AutoIt" to generate the report. With this request can easily with itself (Excel)! Regards, Link to comment Share on other sites More sharing options...
alien4u Posted April 19, 2016 Share Posted April 19, 2016 2 hours ago, VIP said: I think no need "AutoIt" to generate the report. With this request can easily with itself (Excel)! Obviously is not about the report is about get that data from Excel and do something more with AutoIT base on that data. Regards Alien. Link to comment Share on other sites More sharing options...
Trong Posted April 19, 2016 Share Posted April 19, 2016 On 15/4/2016 at 11:15 PM, antmar904 said: Hi All, I am trying to get the value of the last cell used in every row (shown in red). Exp: Output I need: Try This: expandcollapse popup#include <Array.au3> #include <Excel.au3> #include <MsgBoxConstants.au3> Global $ExcelFile = @ScriptDir & "\LNExport.xlsx" Local $oExcel = _Excel_Open() If @error Then MsgBox(0, "Error", "Error creating Excel object") _Excel_Close($oExcel) Exit EndIf Local $oWorkbook = _Excel_BookOpen($oExcel, $ExcelFile, Default, Default) If @error Then MsgBox(0, "Error", "Error opening the workbook") _Excel_Close($oExcel) Exit EndIf Local $aResult = _Excel_RangeRead($oWorkbook, Default, Default, 1) If @error Then MsgBox(0, "Error", "Unable to read workbook") _Excel_BookClose($oWorkbook) Exit EndIf ;~ _ArrayDisplay($aResult, "Data", "") ;~ _Excel_BookClose($oWorkbook) Local $aArray_2D[UBound($aResult, 1) - 1][2] Local $LastCOL, $zResult For $i = 1 To UBound($aResult, 1) - 1 $FristROW = $aResult[$i][0] For $j = 0 To UBound($aResult, 2) - 1 If $aResult[$i][$j] <> "" Then $LastCOL = $aResult[$i][$j] Next $aArray_2D[$i - 1][0] = $aResult[$i][0] $aArray_2D[$i - 1][1] = $LastCOL Next _ArrayDisplay($aArray_2D, "Data", "") _Excel_BookClose($oWorkbook) ;~ WinClose("Microsoft Excel") Exit Regards, Link to comment Share on other sites More sharing options...
water Posted April 24, 2016 Share Posted April 24, 2016 To me it seems the solution posted in #23 is the most elegant way to retrieve the last cell of each row. Jfish and alien4u 2 My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.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 (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 More sharing options...
water Posted April 24, 2016 Share Posted April 24, 2016 On 16.4.2016 at 6:10 AM, alien4u said: Also try to use _Excel_RangeFind() but none of the examples on the Help File works. Error with all of them: "C:\Program Files (x86)\AutoIt3\Include\Excel.au3" (656) : ==> The requested action with this object has failed.: $aResult[$iIndex][1] = $oMatch.Name.Name $aResult[$iIndex][1] = $oMatch^ ERROR Regards Alien. This is a bug in the 3.3.14.0 implementation of COM error handling. Use 3.3.12.0 to fix this problem. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.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 (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 More sharing options...
antmar904 Posted April 26, 2016 Author Share Posted April 26, 2016 I am also still working on this, ill post what I have a little later on. Thanks again for all your help. Link to comment Share on other sites More sharing options...
water Posted April 26, 2016 Share Posted April 26, 2016 On 18.4.2016 at 1:50 AM, alien4u said: The Shortest way so far without the need of calling _Excel_RangeRead(): #include<Excel.au3> Local $oAppl = _Excel_Open() Local $oWorkbook = _Excel_BookOpen($oAppl,@ScriptDir&"\Excel1.xlsx") ; your workbook here Global Const $xlUp = -4162 Global Const $xlToLeft = -4159 With $oWorkbook.ActiveSheet $countRow = .Cells(.Rows.Count, "A").End($xlUp).row EndWith For $i = 1 To $countRow With $oWorkbook.ActiveSheet $lastColvalue = .Cells($i, .Columns.Count).End($xlToLeft).value EndWith MsgBox(0,"",$lastColvalue) Next Regards Alien. Added an example how to get the last cell of a column to the wiki. nicdev007 and alien4u 2 My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.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 (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 More sharing options...
antmar904 Posted April 26, 2016 Author Share Posted April 26, 2016 @water That worked great, thank you. Link to comment Share on other sites More sharing options...
water Posted April 26, 2016 Share Posted April 26, 2016 My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.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 (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 More sharing options...
antmar904 Posted May 12, 2016 Author Share Posted May 12, 2016 Hello again. So I'm still not getting the results that I wanted. Basically what I am doing is exporting our Lotus Notes Global Address book which I can then look up a user and get their computer name. But, the LN export will show all of the users computers old and new but I just want the new computer name which is usually the last computer name in the "Client Machine" column. Computer names are seperated by a ",". I would like write the last computer name to a new column called "Primary Computer". Again, any help is very much appriciated. Here is an example of a LN export: Link to comment Share on other sites More sharing options...
BrewManNH Posted May 12, 2016 Share Posted May 12, 2016 What do you get back using the code supplied? If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
antmar904 Posted May 12, 2016 Author Share Posted May 12, 2016 I'm getting the correct data returned from the org exp I posted however that was in the wrong format. So with the exp I just posted which is the correct format I am getting a message box with value listed in column C. What I would like is to write the last computer name in the new column labled "Primary Comptuer", exp: Link to comment Share on other sites More sharing options...
BrewManNH Posted May 12, 2016 Share Posted May 12, 2016 Well, you'll need to find the last occurrence of a computer name from the returned value, the easiest way would be to use stringsplit and find the last entry in the array using UBound. Maybe something like this (untested) #include <Excel.au3> Local $oAppl = _Excel_Open() Local $oWorkbook = _Excel_BookOpen($oAppl, @ScriptDir & "\Excel1.xlsx") ; your workbook here Global Const $xlUp = -4162 Global Const $xlToLeft = -4159 With $oWorkbook.ActiveSheet $countRow = .Cells(.Rows.Count, "A").End($xlUp).row EndWith For $i = 1 To $countRow With $oWorkbook.ActiveSheet $lastColvalue = .Cells($i, .Columns.Count).End($xlToLeft).value EndWith MsgBox(0, "", $lastColvalue) $aLastComputer = StringSplit($lastColvalue, ",") $sLastComputer = $aLastComputer[UBound($aLastComputer) - 1] MsgBox(0, "", $sLastComputer) Next If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
antmar904 Posted May 12, 2016 Author Share Posted May 12, 2016 @BrewManNH This worked well if I comment out ;MsgBox(0, "", $lastColvalue) so the msgbox just gives me the last computer name. How can I then write $aLastComptuer to the "Primary Computer" column? Thanks again. Link to comment Share on other sites More sharing options...
BrewManNH Posted May 12, 2016 Share Posted May 12, 2016 I'm not writing the script for you, you'll have to start doing the work yourself on how to put a value into an Excel sheet. Look in the help file for the Excel functions. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
antmar904 Posted May 12, 2016 Author Share Posted May 12, 2016 @BrewManNH Thanks again for your help. #include <Excel.au3> Local $oAppl = _Excel_Open() Local $oWorkbook = _Excel_BookOpen($oAppl, @ScriptDir & "\Test.xlsx") ; your workbook here Global Const $xlUp = -4162 Global Const $xlToLeft = -4159 With $oWorkbook.ActiveSheet $countRow = .Cells(.Rows.Count, "A").End($xlUp).row EndWith For $i = 1 To $countRow With $oWorkbook.ActiveSheet $lastColvalue = .Cells($i, .Columns.Count).End($xlToLeft).value ;MsgBox(0, "", $lastColvalue) $aLastComputer = StringSplit($lastColvalue, ",") $sLastComputer = $aLastComputer[UBound($aLastComputer) - 1] ;MsgBox(0, "", $sLastComputer) _Excel_RangeWrite($oWorkbook, $oWorkbook.ActiveSheet, $sLastComputer, "D"&$i, "", "") EndWith Next Link to comment Share on other sites More sharing options...
antmar904 Posted May 12, 2016 Author Share Posted May 12, 2016 So my workbook has about 11,500 rows but my script stops entering the last computer name @ row 1138. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now