[Funktion] _MathInColumn : Addiert oder Subtrahiert werte in einer Spalte in einem Array

  • Habs nicht weiter getestet, sollte aber funktionieren:

    Spoiler anzeigen
    [autoit]

    ; #Function# =================================================================================================================================================
    ; Function ......: _MathInColumn
    ; Description ...: Performs a mathematic operation in a Column from lowest to highest specified index
    ; Parameter(s) ..: $Array - Array to search in
    ; $iSubItem = 0 - Columnindex to operate in
    ; $iStart = 0 - Rowindex to start mathematic operation
    ; $iEnd = -1 - Rowindex to end mathematic operation
    ; $sAction = "+" - Mathematic operation to do (possible: "+","-")
    ; $sSearch = "" - If specified, operation is only performed in Rows where $sSearch appears
    ; $iSearch = 0 - Columnindex to search $sSearch in
    ; $iCase = 0 - Casesensitive (possible: 0,1)
    ; $iPartial = 0 - Partial search (possible: 0,1)
    ; Requirement ...: Array.au3
    ; Return values .: Success - Result of mathematic operation (if division by 0 an empty String!)
    ; Failure - Returns an empty string and sets @error:
    ; 0 - $Array is not an array
    ; 1 - $iSubItem is negative, not an integer or out of Bounds
    ; 2 - $iStart is negative, not an integer or out of Bounds
    ; 3 - $iEnd is negative, not an integer or out of Bounds
    ; 4 - $iStart is higher than $iEnd
    ; 5 - $sAction is invalid
    ; 6 - $iSearch is negative, not an integer or out of Bounds
    ; 7 - $sSearch not found
    ; User CallTip: .: ($Array[, $iSubItem = 0[, $iStart = 0[, $iEnd = -1[, $sAction = "+"[, $sSearch = ""[, $iSearch = 0[, $iCase = 0 [,$iPartial = 0]]]]]]]])
    ; Author(s) .....: Johannes Schirmer
    ; Date ..........: 08. July 2008
    ; Note(s) .......: Not testet yet *g*
    ; ============================================================================================================================================================
    Func _MathInColumn(ByRef $Array, $iSubItem = 0, $iStart = 0, $iEnd = -1, $sAction = "+", $sSearch = "", $iSearch = 0, $iCase = 0 ,$iPartial = 0)
    If Not IsArray($Array) Or UBound($Array,0) > 2 Then Return SetError(0)
    If (Not IsInt($iSubItem)) Or ($iSubItem < 0) Or ((UBound($Array,0) = 2) And ($iSubItem > UBound($Array,2) - 1)) Then Return SetError(1)
    If $iEnd = -1 Then $iEnd = UBound($Array) - 1
    If (Not IsInt($iStart)) Or ($iStart < 0) Or ($iStart > UBound($Array,1) - 1) Then Return SetError(2)
    If (Not IsInt($iEnd)) Or ($iEnd < 0) Or ($iEnd > UBound($Array,1) - 1) Then Return SetError(3)
    If $iStart > $iEnd Then Return SetError(4)
    If ($sAction <> "+") And ($sAction <> "-") Then Return SetError(5)
    If (Not IsInt($iSearch)) Or ($iSearch < 0) Or ((UBound($Array,0) = 2) And ($iSearch > UBound($Array,2) - 1)) Then Return SetError(6)
    Local $Value = 0
    If $sSearch <> "" Then
    If $iEnd = 0 Then
    If UBound($Array,0) = 1 Then
    If $iPartial = 1 Then
    If StringInStr($Array[0],$sSearch,$iCase) Then
    Return $Array[0]
    Else
    Return
    EndIf
    Else
    If $iCase = 1 Then
    If $Array[0] == $sSearch Then
    Return $Array[0]
    Else
    Return
    EndIf
    Else
    If $Array[0] = $sSearch Then
    Return $Array[0]
    Else
    Return
    EndIf
    EndIf
    EndIf
    Else
    If $iPartial = 1 Then
    If StringInStr($Array[0][$iSearch],$sSearch,$iCase) Then
    Return $Array[0][$iSubItem]
    Else
    Return 0
    EndIf
    Else
    If $iCase = 1 Then
    If $Array[0][$iSearch] == $sSearch Then
    Return $Array[0][$iSubItem]
    Else
    Return 0
    EndIf
    Else
    If $Array[0][$iSearch] = $sSearch Then
    Return $Array[0][$iSubItem]
    Else
    Return 0
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    Local $index = _ArrayFindAll($Array,$sSearch,$iStart,$iEnd,$iCase,$iPartial,$iSearch)
    If Not IsArray($index) Then Return SetError(7)
    If UBound($Array,0) = 1 Then
    For $i = 0 To UBound($index,1) - 1
    $Value = Execute($Value & $sAction & $Array[$index[$i]])
    Next
    Return $Value
    Else
    For $i = 0 To UBound($index,1) - 1
    $Value = Execute($Value & $sAction & $Array[$index[$i]][$iSubItem])
    Next
    Return $Value
    EndIf
    Else
    If UBound($Array,0) = 1 Then
    For $i = $iStart To $iEnd
    $Value = Execute($Value & $sAction & $Array[$i])
    Next
    Return $Value
    Else
    For $i = $iStart To $iEnd
    $Value = Execute($Value & $sAction & $Array[$i][$iSubItem])
    Next
    Return $Value
    EndIf
    EndIf
    EndFunc

    [/autoit]


    :D ist meine erste veröffentlichte Funktion, hab sie aber noch nicht weiter getestet...
    Edit1:
    Einige Anpassungen: Array wird per ByRef übergeben und weitere Anpassungen...

    2 Mal editiert, zuletzt von JoEtHeKiLlEr (9. Juli 2008 um 22:49)

    • Offizieller Beitrag

    Habs nicht getestet, aber folgende Hinweise:
    Im Funktionskopf bitte das Array als: ByRef $Array angeben. Somit wird auf das Originalarray (im Speicher) zugegriffen. Anderenfalls wird eine Arbeitskopie angelegt (Performanceverlust).
    Folgendes kannst du auch vereinfachen:

    [autoit]

    ; statt:
    If Not IsArray($Array) Then
    SetError(0)
    Return
    EndIf
    ; besser:
    If Not IsArray($Array) Then Return SetError(0)

    [/autoit]