Jump to content
Sign in to follow this  
SorryButImaNewbie

AutoIt script turns off, because of array is out of bound

Recommended Posts

SorryButImaNewbie

Hello all!

I wrote a little script to automate some of my work (for which I'm greatfull).

I have little problem now. My script get data of currency values from specified time period. The problem, if XY day is a holiday or something, then the bank doesn't have new values for that day, thus my script can ask for "till that date" if there is only data for "till that date-1".

I should be done with this for tomorrow and I should learn for my test paper tomorrow, make a genetic algorhytm homework, and at least look at a ppt...

So here is my code, pleas ask if you need more information!

InternetRead2() ;Creating Date and Arfolyam arrays, using DateInterval read from above (_ArraysDisplayed and function is "tested")
;Calculate and write HUF*OSSZEG
Do
    Local $SZAMLATELJOlvaso = _Excel_RangeRead($ExcelObject, Default, $SZAMLATELJoszlop & $CellaOlvasoSzamlalo)
    Local $Time = StringTrimRight($SZAMLATELJOlvaso, 6)
    $DateArrayTimeIndex = _ArraySearch($DateArray, $Time, 0, 0, 0, 0, 1)
    ;MsgBox(64, "Értesítés", $DateArrayTimeIndex)

        If @error = 6 Then
            $DateArrayTimeIndex = _ArraySearch($DateArray, $Time-1, 0, 0, 0, 0, 1)
            ;MsgBox(64, "Értesítés", $DateArrayTimeIndex)
        EndIf
        If @error = 6 Then
            $DateArrayTimeIndex = _ArraySearch($DateArray, $Time-2, 0, 0, 0, 0, 1)
            ;MsgBox(64, "Értesítés", $DateArrayTimeIndex)
        EndIf
        If @error = 6 Then
            $DateArrayTimeIndex = _ArraySearch($DateArray, $Time-3, 0, 0, 0, 0, 1)
            ;MsgBox(64, "Értesítés", $DateArrayTimeIndex)
        EndIf
        If @error = 6 Then
            $DateArrayTimeIndex = _ArraySearch($DateArray, $Time-4, 0, 0, 0, 0, 1)
            ;MsgBox(64, "Értesítés", $DateArrayTimeIndex)
        EndIf

    $DateArrayTimeIndex = $DateArrayTimeIndex+1 ;Egyébként arraysearch -1et ad vissza, 0nál. Passz
    Sleep(200)

    If Not $SZAMLATELJOlvaso = "" Then
    _Excel_RangeWrite($ExcelObject, $ExcelObject.Activesheet, "=" & $OSSZEGoszlop & $CellaOlvasoSzamlalo & "*" & String($ArfolyamArray[$DateArrayTimeIndex]) & "", String($sHUFBeszurOszlop) & $CellaOlvasoSzamlalo)
        If @error Then
            _Excel_RangeWrite($ExcelObject, $ExcelObject.Activesheet, "=" & $OSSZEGoszlop & $CellaOlvasoSzamlalo & "*" & String($ArfolyamArray[$oXML_Node.Length]) & "", String($sHUFBeszurOszlop) & $CellaOlvasoSzamlalo)
            MsgBox(64, "Értesítés", "Valamilyen okból, nem találok az adott dátumhoz árfolyamot, a keresési idők közül a legutolsó árfolyammal töltöttem ki!" & @CRLF & Number($oXML_Node_Datum))
        EndIf
    EndIf


    $CellaOlvasoSzamlalo = $CellaOlvasoSzamlalo + 1

    Until $SZAMLATELJOlvaso = ""

also my internetread2 function :

Func InternetRead2() ;ezt használja az excelmove
;-----------------------------------
;Original Source: https://www.autoitscript.com/forum/topic/184884-solved-basic-com-help-working-on-string-returned-from-api-mi-doing-this-okey/
;by Genius257

;TO DO: Some error handling maybe: what if there is no $MinTime/$MaxTime?
;Read the returns in to array for future use --> Right now, 2 arrays one with the dates and one with the exchangerates
;-----------------------------------
    ;Globals decleared to avoid warnings
    Global $MinTime ;20160601000000
    Global $MaxTime ;20160610000000
    Global $MinTimeFormated = StringTrimRight($MinTime, 6)
    Global $MaxTimeFormated = StringTrimRight($MaxTime, 6)


    $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
    If $MaxTimeFormated = "" and $MinTimeFormated = "" Then
        MsgBox(64, "Értesítés", "Nincsenek beolvasott dátumok a memóriában, dummy dátumokat adok meg!" & @CRLF & "20160901, 20160910")
        $MinTimeFormated = "20160901"
        $MaxTimeFormated = "20160905"
    EndIf
    $oHTTP.Open("GET", "http://api.napiarfolyam.hu/?bank=mnb&valuta=eur&datum="&$MinTimeFormated&"&datumend="&$MaxTimeFormated&"", False)
    $oHTTP.Send()
    $sXML = $oHTTP.responseText
    Global $oXML = ObjCreate("Microsoft.XMLDOM")
    $oXML.loadXML( $sXML )
    $oXML_Nodes = $oXML.SelectNodes("./arfolyamok/deviza/item")

    Global $ArfolyamArray[$oXML_Nodes.Length]
    ;MsgBox(64, "Title", "" & $oXML_Nodes.Length & "")
    ;_ArrayDisplay($ArfolyamArray)
    Global $DateArray[$oXML_Nodes.Length]

For $i=0 To $oXML_Nodes.Length-1

    Global $oXML_Node = $oXML_Nodes.Item($i)
    $oXML_Node_Bank = $oXML_Node.SelectNodes("./bank")
    $oXML_Node_Bank = $oXML_Node_Bank.Length>0?$oXML_Node_Bank.Item(0).text:""
    Global $oXML_Node_Datum = $oXML_Node.SelectNodes("./datum")
    $oXML_Node_Datum = $oXML_Node_Datum.Length>0?$oXML_Node_Datum.Item(0).text:""
    $oXML_Node_Penznem = $oXML_Node.SelectNodes("./penznem")
    $oXML_Node_Penznem = $oXML_Node_Penznem.Length>0?$oXML_Node_Penznem.Item(0).text:""
    $oXML_Node_Kozeps = $oXML_Node.SelectNodes("./kozep")
    $oXML_Node_Kozep01 = $oXML_Node_Kozeps.Length>0?$oXML_Node_Kozeps.Item(0).text:""
    $oXML_Node_Kozep02 = $oXML_Node_Kozeps.Length>1?$oXML_Node_Kozeps.Item(1).text:""

    $ArfolyamArray[$i] = $oXML_Node_Kozep01
    $DateArray[$i] = StringTrimRight(StringReplace($oXML_Node_Datum, "-", ""), 8)

    ConsoleWrite( "Match [" & StringFormat("%02i", $i+1) & "]:"&@CRLF& _
        @TAB&"Bank: "&@TAB&$oXML_Node_Bank&@CRLF& _
        @TAB&"Datum: "&@TAB&$oXML_Node_Datum&@CRLF& _
        @TAB&"Penznem: "&@TAB&$oXML_Node_Penznem&@CRLF& _
        @TAB&"Kozep01: "&@TAB&$oXML_Node_Kozep01&@CRLF& _
        @TAB&"Kozep02: "&@TAB&$oXML_Node_Kozep02&@CRLF _
    )
Next
;_ArrayDisplay($ArfolyamArray)
;_ArrayDisplay($DateArray)
EndFunc

My problem is that I have dates in my excel till 2016.10.30, but I only have dates till 28.

(see the api, according to aoutit console, I have the same data: http://api.napiarfolyam.hu/?bank=mnb&valuta=eur&datum=20161001&datumend=20161030 )

My idea/goal (with the If @error then... after @SZAMLATELJolvaso part) is that if this happens, I want it to automaticly jump to the last date of the array (I will be able to write something more elaborate, but for now thats my goal, to save the sinking ship :D )

Thank yu for your help and insight!

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
Sign in to follow this  

  • Similar Content

    • smud
      By smud
      Currently, I'm working on a program that will display Dialog boxes with either Yes or No.
      For each dialog, I reward the user with X amount of Credits.
      I'm hoping to output the amount of credits to a cell in a column (there will be 20 different columns).
      It will only post to a row that is equal to today's date (first column). If no row exists yet with the current date, it will start a new row.
      Any suggestions?
      Thank you
    • nooneclose
      By nooneclose
      How do I properly convert this to Autoit? This is a VBA macro that I recorded in Excel.
       ActiveSheet.Outline.ShowLevels RowLevels:=2 I need this to close my subtotal once it is finished. 
      any help will be greatly appreciated. 
    • Skeletor
      By Skeletor
      Hi All,
      While creating a few excel spreadsheets using AutoIt, I came across something which to my limiting time to research the forums I don't anyone has mentioned. 
      The color pallettes are reversed. 
      Huge shock to me.
       
      I wanted to produce a red row but kept on getting blue. 
      Seems like 0xFF0000 was red on the charts but when running the script, I got blue. 
      I then played around with the colors, and after a few tries, I finally got Red. 
      Reversed the FF0000 and the result is 0000FF.
       
      So for Excel compared to Html
      0000FF (Red) - Excel
      0000FF (Blue) - Html

      FFFF00 (Cyan) - Excel
      FFFF00(Yellow) - Html
       
    • Dzenan03
      By Dzenan03
      I want to make a while loop, that creates variables based on a array. For thist I created the array $iDsO with the number and the name of folders in an other folder. Every folder has a different name an I want to create variables(arrays) for each folder that show me all the files in that folder. For example: I have the Folder \Folder1. In it there are the Folders \1, \2, \3. In 1, 2 and 3 there are some files(.png). The array for Folder1 is $iDsO and now I want to crate the arrays $iDsO1, $iDsO2 and $iDsO3 with the files in them can I make something like this:
      While $iDs > 0 ;$iDs is the number of files in Folder1>> $iDsO[0] $iDs#here should come the Foldername for example '1'# = _FileListtoArray(@ProgramFilesDir&"\Folder1\"&$iDsO[$iDs]) $iDs = $iDs - 1 Wend So that in the End I have three variabels ($iDs1, $iDs2 and $iDs3)
       
      Is this posible or if not what could I do instead ( I don´t know the number of folders in Folder1 in the begining).
    • Jemboy
      By Jemboy
      Yesterday I had to make some little changes to an old Autoit program we use at my work.
      The program reads some data and convert it to Excel.
      Before writing the cell, it is changed to text and later on I slap the column with an autofitwidth.
      Furthermore weI execute a conditional format on the sheet, to make the data more readable.
      I quickly found out that because of the breaking changes Excel.udf had starting from AutoIt 3.3.12.0,
      a lot of things had to been changed.
      The changes I had to do, only took 10 minutes.
      After trying to adjust the script for over 5 hours, to get it working with the new Excel.udf, I gave up.
      I stopped changing the script, uninstalled the my Autoit and went looking for an older version.
      Luckilly I was able to find Autoit v3.3.8.1 (with corresponding Scite) in my software repository.
      Installing Autoit V3.3.8.1 and compiling the file, now took me  10 minutes .
       
      So why did I not get the old script working with the new Excel.udf?
      There are several reasons I failed getting the old script working with the new Excel UDF.
       I had some pressure from management to fix it ASAP (and got a little anxious)  Most all resources on the internet point to the working of the old EXcel.UDF And offcourse there were thosing "breaking changes",
      with new functions using diffrent parameters or using parameters in different order. One of the column's on the sheet is used to store EAN13 (barcode) and was formatted like 1,23E12.
      I couldn't change the cell to text, also autofitwidt was not working and using conditional formatting was also a no-no.
      So in the end I could use the new Excel UDF, but not desapointed management.
       
      What would I like to ask?
      I understand that sometimes you want to rewrite a program to make it better. I even understand that one has to make breaking changes sometimes.
      But in this case because of lacking examples/resources my day went completely down the drain.
      I would like to ask the Excel.udf developpers to:
      Make more functions available to do things like changing cell properties easily, changing cell color, do an autofit columnwidth, format data conditionally. 
        Or write an Example using the (new) Excel UDF, making examples how to format a cell, do conditional format, changing cell colors etc.
        I probably am more of an example guy.
      Having a good Excel.UDF Example showing a lot of common things normally makes, programming things easy for me.
      Because I can keep tweaking snippets until I get it working the way I want it.
       
      So dear developpers, could you help me and other future user out?
       
       
       
       
       
       
       
       
       
       
       
       
       
       
×