Jump to content

Array variable has incorrect number of subscripts


 Share

Recommended Posts

Hi Virtual People,

My array works perfectly fine. However, what is the best practice if the line in the array doesn't have the correct amount of columns and if I can add a placeholder?

 

For $count = 1 To _FileCountLines($FileRead1) Step 1
    $string = FileReadLine($FileRead1, $count)
    $input = StringSplit($string, ",", 1)
    $value1 = $input[1]
    $value2 = $input[2]
    $value3 = $input[3]

    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value2, "A1")
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value1, "B1")
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value3, "C1")
Next

 

Kind Regards
Skeletor

"Coffee: my defense against going postal."

Microsoft Office Splash Screen | Basic Notepad Program (Beginner) | Transparent Splash Screen | Full Screen UI

Link to comment
Share on other sites

Try that : 

 

Local $MyVar[3] = ["element 1", "element 2", "element 3"]


MsgBox (0, "", $MyVar)
MsgBox (0, "", $MyVar[0])
MsgBox (0, "", $MyVar[1])
MsgBox (0, "", $MyVar[2]) ;This is equal to $iRow amount (3) - 1 = 2 

$iRow = UBound ($MyVar)
MsgBox (0, "", $iRow)

If $iRow > 3 Then ; With that you dodged the fact to trying to access an non accessible $Variable. in this case it was $MyVar[3]
    MsgBox (0, "", $MyVar[$iRow-4]);$MyVar[3]
    MsgBox (0, "", $MyVar[$iRow-3]);$MyVar[2]
    MsgBox (0, "", $MyVar[$iRow-2]);$MyVar[1]
    MsgBox (0, "", $MyVar[$iRow-1]);$MyVar[0]
EndIf
If $iRow > 2 Then 
    MsgBox (0, "", $MyVar[$iRow-3]);$MyVar[2]
    MsgBox (0, "", $MyVar[$iRow-2]);$MyVar[1]
    MsgBox (0, "", $MyVar[$iRow-1]);$MyVar[0]
EndIf
If $iRow > 1 Then
    MsgBox (0, "", $MyVar[$iRow-2]);$MyVar[1]
    MsgBox (0, "", $MyVar[$iRow-1]);$MyVar[0]
EndIF
If $iRow > 0 Then
    MsgBox (0, "", $MyVar[$iRow-1]) ;$MyVar[0]
EndIf

 

Read help file about : 

UBound
IsArray

 

Edited by caramen

My video tutorials : ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Link to comment
Share on other sites

@Skeletor
If you allow me, IsArray() doesn't tell you if you have less elements in your array and/or you array has some blank elements.
So, if you want to see if your array has less elements than the "normal", or has some blank elements, then you should do something like this:

#include <Array.au3>

Global $strIsArray = "Element1,Element2,ElementN", _
       $strLessElements = "Element1,Element2", _
       $strBlankElement = "Element1,,ElementN", _
       $arrIsArray = StringSplit($strIsArray, ",", $STR_NOCOUNT), _
       $arrLessElements = StringSplit($strLessElements, ",", $STR_NOCOUNT), _
       $arrBlankElements = StringSplit($strBlankElement, ",", $STR_NOCOUNT), _
       $varNotAnArray

_ArrayDisplay($arrIsArray)
_ArrayDisplay($arrLessElements)
_ArrayDisplay($arrBlankElements)

; To detect if the array has less elements than normal, use UBound()
If UBound($arrIsArray) < UBound($arrLessElements) Then
    ConsoleWrite("$arrLessElements has elements than $arrIsArray." & @CRLF)
EndIf

; To detect if the array has a blank element
For $i = 0 To UBound($arrBlankElements) - 1 Step 1
    If $arrBlankElements[$i] = "" Then ConsoleWrite("Detected a blank element at the index '" & $i & "'." & @CRLF)
Next

; As you can see from here, only $varNotAnArray, which is not an array, displays "False" as a result of IsArray() function
ConsoleWrite("Is $arrIsArray an array? " & (IsArray($arrIsArray) ? "True" : "False") & @CRLF & _             ; True
             "Is $arrLessElements an array? " & (IsArray($arrLessElements) ? "True" : "False") & @CRLF & _   ; True
             "Is $arrBlankElements an array? " & (IsArray($arrBlankElements) ? "True" : "False") & @CRLF & _ ; True
             "Is $varNotAnArray an array? " & (IsArray($varNotAnArray) ? "True" : "False") & @CRLF)          ; False

 

Edited by FrancescoDiMuro

Click here to see my signature:

Spoiler

ALWAYS GOOD TO READ:

 

Link to comment
Share on other sites

@FrancescoDiMuro 

Résultat de recherche d'images pour "smiley love" 

 

Loved that one. 

Edited by caramen

My video tutorials : ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Link to comment
Share on other sites

StringSplit always returns an array, even if you use a blank line, see example below, personally I would just use the line count like in the example below or use Ubound as FrancescoDiMuro used.

#include <Array.au3>
Local $aArray, $aString[] = ["One,Two,Three", "", "Four,Five,Six,Seven,Eight","Nine,Ten"]
For $i = 0 To UBound($aString) - 1
    $aArray = StringSplit($aString[$i], ",")
    ;~ Check string has been split into three or more items
    If $aArray[0] >= 3 Then
        MsgBox(4096, "Success", "String has successfully been split into " & $aArray[0] & " line items.")
    Else
        MsgBox(16, "Failure", "String has been split into " & $aArray[0] & " line items.")
    EndIf
    _ArrayDisplay($aArray)
Next

 

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...