Valnurat Posted May 4, 2016 Posted May 4, 2016 My goal is to have some info I got in a comma CVS file merged with a excel doc. In the excel.doc the search column is B and I need to do it from row 8, because 1-7 is locked. I really hope someone can help me. This is what I have tried: #include <Excel.au3> #include <FileConstants.au3> #include <MsgBoxConstants.au3> ; Create a constant variable in Local scope of the message to display in FileOpenDialog. Local Const $sMessage = "Select a single file of any type." ; Display an open dialog to select a file. Local $sFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "All (*.*)", $FD_FILEMUSTEXIST) If @error Then ; Display the error message. MsgBox($MB_SYSTEMMODAL, "", "No file was 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) Exit 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) ; Create application object and open an example workbook Local $oExcel = _Excel_Open() If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $oWorkbook = _Excel_BookOpen($oExcel, $sFileOpenDialog) If @error Then MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error opening workbook '" & @ScriptDir & "\Extras\_Excel1.xls'." & @CRLF & "@error = " & @error & ", @extended = " & @extended) _Excel_Close($oExcel) Exit EndIf ; ***************************************************************************** ; Find all occurrences of string "=C10*10" in the formulas, exact match ; ***************************************************************************** Local $aResult = _Excel_RangeFind($oWorkbook, "Maskprov 7", "B8:B1739", Default, $xlWhole) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example 2", "Error searching the range." & @CRLF & "@error = " & @error & ", @extended = " & @extended) MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example 2", "Find all occurrences of string '=C10*10' in the formulas, exact match." & @CRLF & "Data successfully searched.") _ArrayDisplay($aResult, "Excel UDF: _Excel_RangeFind Example 2", "", 0, "|", "Sheet|Name|Cell|Value|Formula|Comment") EndIf This is my result: Row|Sheet|Name|Cell|Value [0]|Consultant OU - Questions - EME|$B$1573|Maskprov 7|Maskprov 7 But how do I use this info to add text into the excel doc? Yours sincerely Kenneth.
alien4u Posted May 4, 2016 Posted May 4, 2016 Hello @Valnurat Quote In the excel.doc the search column is B and I need to do it from row 8, because 1-7 is locked. If is an excel file it must be excel.xls or .xlsx file. Local $oWorkbook = _Excel_BookOpen($oExcel, $sFileOpenDialog) This line is not right you _Excel_BookOpen expect an excel file. Should be something like this: Local $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & "\Excel.xlsx", Default, Default) Finally if you are going to Write the info in the CVS file to the Excel file you don't need _ExcelRangeFind at all... Anyways is not very clear for me if you want to write to the Excel File some data read from the CVS file or you want to write to the CVS file some data read from the excel file. Regards Alien.
Valnurat Posted May 4, 2016 Author Posted May 4, 2016 Yes, sorry. It was old code. I have changed it a little. expandcollapse popup#include <ExcelModify.au3> #include <FileConstants.au3> #include <MsgBoxConstants.au3> #include <File.au3> Global $aCSVfile[0][12] ;_ArrayDisplay($aCSVfile,"") ; Create a constant variable in Local scope of the message to display in FileOpenDialog. Local Const $sMessage = "Select a single file of any type." ; Display an open dialog to select a file. Local $sCVSFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "All (*.*)", $FD_FILEMUSTEXIST) If @error Then ; Display the error message. MsgBox($MB_SYSTEMMODAL, "", "No file was 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) Exit 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. $sCVSFileOpenDialog = StringReplace($sCVSFileOpenDialog, "|", @CRLF) _FileReadToArray($sCVSFileOpenDialog, $aCSVfile, Default, ";") _ArrayDisplay($aCSVfile, "2D array - count", Default, 8) EndIf Local $sExcelFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "All (*.*)", $FD_FILEMUSTEXIST) If @error Then ; Display the error message. MsgBox($MB_SYSTEMMODAL, "", "No file was 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) Exit 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. $sExcelFileOpenDialog = StringReplace($sExcelFileOpenDialog, "|", @CRLF) ; Create application object and open an example workbook Local $oExcel = _Excel_Open() If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $oWorkbook = _Excel_BookOpen($oExcel, $sExcelFileOpenDialog) If @error Then MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error opening workbook '" & @ScriptDir & "\Extras\_Excel1.xls'." & @CRLF & "@error = " & @error & ", @extended = " & @extended) _Excel_Close($oExcel) Exit EndIf ; ***************************************************************************** ; Find all occurrences of string "=C10*10" in the formulas, exact match ; ***************************************************************************** For $i = 1 to $aCSVfile[0][0] MsgBox(0,"",$aCSVfile[$i][7]) Local $aResult = __Excel_RangeFind($oWorkbook, $aCSVfile[$i][7], "B:B", Default, Default) If Not @error And IsArray($aResult) Then Switch UBound($aResult) Case 0 MsgBox(0,"0","Empty") Case 1 _ArrayDisplay($aResult, "Excel UDF: _Excel_RangeFind Example 2", "", 0, "|", "Sheet|Name|Cell|Value|Formula|Comment") MsgBox(0,"1",$aResult[0][2]) Case Else MsgBox(0,"2","More than 1") EndSwitch EndIf Next EndIf but I would like to insert text into the excel in column "K" e.g. Yours sincerely Kenneth.
alien4u Posted May 4, 2016 Posted May 4, 2016 You need to clear you goals, you lost me. You want to Write to the Excel file the data you read from the CVS file? If the answer is YES, then again: you don't need RangeFind you need _Excel_RangeWrite() Regards Alien.
Valnurat Posted May 4, 2016 Author Posted May 4, 2016 But I need to search for a name in the excel. When I have found it, then I need to put in data I have in my CVS file. Yours sincerely Kenneth.
water Posted May 4, 2016 Posted May 4, 2016 Valnurat, I think I understand what you need. I stripped down your script as far as possible because you are overcomplicating things. With this script I try to make it work. To make it work on your side simply process those lines marked with " ; >> Replace with above line". expandcollapse popup; #include <ExcelModify.au3> #include <Excel.au3> ; >> Replace with above line #include <FileConstants.au3> #include <MsgBoxConstants.au3> #include <File.au3> Global $aCSVfile[0][12] ; Create a constant variable in Local scope of the title to display in FileOpenDialog. Local Const $sTitle = "Select a single input file (CSV format)." Local Const $sTitleExcel = "Select a single Excel file as output." ; Display an open dialog to select a file. Local $sCVSFileOpenDialog = FileOpenDialog($sTitle, @WindowsDir & "\", "All (*.*)", $FD_FILEMUSTEXIST) ; Display the error message. If @error Then Exit MsgBox($MB_SYSTEMMODAL, "", "No file was selected.") _FileReadToArray($sCVSFileOpenDialog, $aCSVfile, Default, ";") If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Error", "Error reading CSV input file: " & $sCVSFileOpenDialog & @CRLF & "@error = " & @error) _ArrayDisplay($aCSVfile, "2D array - count", Default, 8) Local $sExcelFileOpenDialog = FileOpenDialog($sTitleExcel, @WindowsDir & "\", "Excel files (*.xls*)", $FD_FILEMUSTEXIST) ; Display the error message. If @error Then Exit MsgBox($MB_SYSTEMMODAL, "", "No file was selected.") ; Create application object and open the workbook Local $oExcel = _Excel_Open() If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $oWorkbook = _Excel_BookOpen($oExcel, $sExcelFileOpenDialog) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF", "Error opening workbook '" & $sExcelFileOpenDialog & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended) ; ***************************************************************************** ; Find all occurrences of string "=C10*10" in the formulas, exact match ; ***************************************************************************** For $i = 1 To $aCSVfile[0][0] MsgBox(0, "", $aCSVfile[$i][7]) ; Local $aResult = __Excel_RangeFind($oWorkbook, $aCSVfile[$i][7], "B:B", Default, Default) Local $aResult = _Excel_RangeFind($oWorkbook, $aCSVfile[$i][7], "B:B", Default, Default) ; >> Replace with above line If Not @error And IsArray($aResult) Then Switch UBound($aResult) Case 0 MsgBox(0, "0", "Empty") Case 1 _ArrayDisplay($aResult, "Excel UDF", "", 0, "|", "Sheet|Name|Cell|Value|Formula|Comment") MsgBox(0, "1", $aResult[0][2]) Case Else MsgBox(0, "2", "More than 1") EndSwitch EndIf Next 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
alien4u Posted May 4, 2016 Posted May 4, 2016 (edited) Ok then you need _Excel_RangeFind() and you need _Excel_RangeWrite() Anyways in order to help you more and need more info: -Example CVS file or example data you will read from that file -Example Excel file or example data you will have on that Excel File. To Search on the entire Workbook you could use simple as this: Local $aResult = _Excel_RangeFind($oWorkbook, "value to find") Then Based on that result you use _Excel_RangeWrite() to write the values you read from the CVS file. Regards Alien. Edited May 4, 2016 by alien4u
water Posted May 4, 2016 Posted May 4, 2016 You need something like this: expandcollapse popup; #include <ExcelModify.au3> #include <Excel.au3> ; >> Replace with above line #include <FileConstants.au3> #include <MsgBoxConstants.au3> #include <File.au3> Global $aCSVfile[0][12] ; Create a constant variable in Local scope of the title to display in FileOpenDialog. Local Const $sTitle = "Select a single input file (CSV format)." Local Const $sTitleExcel = "Select a single Excel file as output." ; Display an open dialog to select a file. Local $sCVSFileOpenDialog = FileOpenDialog($sTitle, @WindowsDir & "\", "All (*.*)", $FD_FILEMUSTEXIST) ; Display the error message. If @error Then Exit MsgBox($MB_SYSTEMMODAL, "", "No file was selected.") _FileReadToArray($sCVSFileOpenDialog, $aCSVfile, Default, ";") If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Error", "Error reading CSV input file: " & $sCVSFileOpenDialog & @CRLF & "@error = " & @error) Local $sExcelFileOpenDialog = FileOpenDialog($sTitleExcel, @WindowsDir & "\", "Excel files (*.xls*)", $FD_FILEMUSTEXIST) ; Display the error message. If @error Then Exit MsgBox($MB_SYSTEMMODAL, "", "No file was selected.") ; Create application object and open the workbook Local $oExcel = _Excel_Open() If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $oWorkbook = _Excel_BookOpen($oExcel, $sExcelFileOpenDialog) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF", "Error opening workbook '" & $sExcelFileOpenDialog & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended) For $i = 1 To $aCSVfile[0][0] ; Local $aResult = __Excel_RangeFind($oWorkbook, $aCSVfile[$i][7], "B:B", Default, Default) Local $aResult = _Excel_RangeFind($oWorkbook, $aCSVfile[$i][7], "B:B", Default, Default) ; >> Replace with above line If Not @error And IsArray($aResult) Then Switch UBound($aResult, 1) Case 0 MsgBox(0, "0", "Empty") Case 1 ; Write the second column of the CSV file to the right of column "B" _Excel_RangeWrite($oWorkbook, Default, $aCSVfile[$i][1], $oWorkbook.ActiveSheet.Range($aResult[0][2]).Offset(0, 1)) Case Else MsgBox(0, "2", "More than 1") EndSwitch EndIf Next 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
Valnurat Posted May 4, 2016 Author Posted May 4, 2016 Yes, there was alot of stuff. I get this error: (41) : ==> The requested action with this object has failed.: _Excel_RangeWrite($oWorkbook, Default, $aCSVfile[$i][1], $oWorkbook.ActiveSheet.Range($aResult[0][2]).Offset(0, 1)) _Excel_RangeWrite($oWorkbook, Default, $aCSVfile[$i][1], $oWorkbook.ActiveSheet^ ERROR Yours sincerely Kenneth.
water Posted May 4, 2016 Posted May 4, 2016 Please post the value of $aResult[0][2] and $aCSVfile[$i][1] 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
Valnurat Posted May 4, 2016 Author Posted May 4, 2016 (edited) $aResult[0][2] = Paulina $aCSVfile[$i][1] =03/10/2016 09:30:06 But I think I need to hand pick the info from my CVS file. I tried this: _Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet, "Yes","C"& StringTrimLeft($aResult[0][1],3)) and I could see it was added to the same row in column 'C' $aResult[0][1]=$B$1573 Edited May 4, 2016 by Valnurat Yours sincerely Kenneth.
water Posted May 4, 2016 Posted May 4, 2016 "Paulina" is wrong. Should be the cell address returned by _Excel_RangeFind. 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
Valnurat Posted May 4, 2016 Author Posted May 4, 2016 aha. _Excel_RangeWrite($oWorkbook, Default, $aCSVfile[$i][1], $oWorkbook.ActiveSheet.Range($aResult[0][1]).Offset(0, 1)) But what if I wanted $aCSVfile[$i][1] on cell 'K'? Yours sincerely Kenneth.
water Posted May 4, 2016 Posted May 4, 2016 Offset (in this case) defines how far to the right of the cell in column B you want to write the data to. K would be 9. _Excel_RangeWrite($oWorkbook, Default, $aCSVfile[$i][1], $oWorkbook.ActiveSheet.Range($aResult[0][1]).Offset(0, 9)) 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
alien4u Posted May 4, 2016 Posted May 4, 2016 (edited) 1 hour ago, Valnurat said: aha. _Excel_RangeWrite($oWorkbook, Default, $aCSVfile[$i][1], $oWorkbook.ActiveSheet.Range($aResult[0][1]).Offset(0, 1)) But what if I wanted $aCSVfile[$i][1] on cell 'K'? Search the entire Workbook: Local $aResult = _Excel_RangeFind($oWorkbook, "value to find") And as @water said you will have in $aResult[2] the Address of the cell then just increment that to find the next cell to the right(I assume) and write there with _Excel_RangeWrite(). I suppose that this is the same that .Offset(0,1) do(the best way to do it I think) Sorry water I don't see your previous post. Regards Alien. Edited May 4, 2016 by alien4u
Valnurat Posted May 4, 2016 Author Posted May 4, 2016 Perfect. Thank you both of you. Yours sincerely Kenneth.
water Posted May 4, 2016 Posted May 4, 2016 Quote 11 minutes ago, Valnurat said: aha. _Excel_RangeWrite($oWorkbook, Default, $aCSVfile[$i][1], $oWorkbook.ActiveSheet.Range($aResult[0][1]).Offset(0, 1)) But what if I wanted $aCSVfile[$i][1] on cell 'K'? Search the entire Workbook: Why search the whole workbook? He just wants to WRITE the data to another column (at least that's how I understand his post). 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
alien4u Posted May 4, 2016 Posted May 4, 2016 1 hour ago, water said: Why search the whole workbook? He just wants to WRITE the data to another column (at least that's how I understand his post). Because I don't know where he search for a match, if he only search for a match on a single Column where there will be for example Names then you are completely right. But if he search for a match that could be on any column then he need to search in the entire Workbook. Regards Alien.
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