User Tools

Site Tools


vba:functions:arrayshift

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
vba:functions:arrayshift [03.07.2014 11:36:42]
yaslaw created
vba:functions:arrayshift [08.07.2014 11:54:43] (current)
yaslaw [[VBA] arrayShift()]
Line 2: Line 2:
 Analog zu array_shift() aus PHP. Der erste Wert wird zurückgegeben und aus dem Array entfernt Analog zu array_shift() aus PHP. Der erste Wert wird zurückgegeben und aus dem Array entfernt
  
 +Liefert den ersten Wert von array , verschiebt die anderen Werte hinunter, und verkürzt array um ein Element.
 +Alle numerischen Schlüssel werden so modifiziert,​ dass bei null zu zählen begonnen wird.
 +Ist array leer (oder kein Array), wird NULL zurückgegeben.
 +
 +Wenn man den Returnwert als 2ten Paramater abgreift, muss man sich nicht mehr darum kümmern, ob er ein Objekt ist oder nicht.
 +Will man das nicht, kann auch der Boolean-Parameter um den IndexReset zu steuern an 2ter Stelle mitgeben. Ist als oValue mit einem
 +Boolean belegt, dann wird das als iIndexReset intepretiert
 +
 +{{:​vba:​functions:​udf_arrayshift.bas|Download udf_arrayshift.bas}}
 ===== Definition ===== ===== Definition =====
 +<​code>​value = arrayShift(array [,​value][,​indexReset])
 +arrayShift array [,​value][,​indexReset]</​code>​
 <code vb>​Public Function arrayShift( _ <code vb>​Public Function arrayShift( _
         ByRef ioArray As Variant, _         ByRef ioArray As Variant, _
Line 15: Line 26:
 ==== Rückgabewerte ==== ==== Rückgabewerte ====
 Des erste Element Des erste Element
 +
 +===== Beispiele =====
 +> Für die Ausgabe der Resultate verwendete ich die Funktion [[vba:​functions:​print_r:​index]]
 +
 +<code vb>value = arrayShift(values) ​         '​Einfach erste rausnehmen
 +arrayShift values, value            'dito
 +value = arrayShift(values,​ false) ​  '​Index wird nicht zurückgesetzt
 +arrayShift(values,​ value, false) ​   'dito
 +arrayShift values ​                  '​Erster wird entfernt und weggeworfen,​ Index zurückgesetzt
 +arrayShift values, false            '​Erster wird entfernt und weggeworfen,​ Index bleibt erhalten</​code>​
 +
 +==== Normale anwendung ====
 +<code vb>​Public Sub testArrayShift()
 +    Dim a As Variant: a = Array("​a",​ "​b",​ "​c",​ "​d"​)
 +    Dim first As String: first = arrayShift(a)
 +    ​
 +    print_rm first, a
 +End Sub</​code>​
 +<​code><​String>​ a
 +<​Variant()> ​ (
 +    [0] => <​String>​ b
 +    [1] => <​String>​ c
 +    [2] => <​String>​ d
 +)</​code>​
 +
 +==== Mit referenzierter Out-Variable,​ ohne rücksetzen des Index ====
 +<code vb>​Public Sub testArrayShift()
 +    Dim a As Variant: a = Array(New regExp, New FileSystemObject,​ New Field)
 +    Dim first As Object
 +    ​
 +    arrayShift a, first, False
 +    ​
 +    print_rm first, a
 +End Sub</​code>​
 +<​code><​IRegExp2> ​ (
 +    [Pattern] => <​String> ​
 +    [Global] => <​Boolean>​ False
 +    [IgnoreCase] => <​Boolean>​ False
 +    [Multiline] => <​Boolean>​ False
 +)
 +<​Variant()> ​ (
 +    [1] => <​FileSystemObject> ​
 +    [2] => <​Field2> ​ (
 +        [OrdinalPosition] => <​Integer>​ 0
 +        [name] => <​String> ​
 +
 +        [type] => <​Integer>​ 0
 +    )
 +)</​code>​
 +===== Code =====
 +<code vb udf_arrayshift.bas>'​-------------------------------------------------------------------------------
 +'​File ​        : udf_arrayShift.bas
 +' ​              ​Copyright mpl by ERB software
 +' ​              All rights reserved
 +' ​              ​http://​wiki.yaslaw.info/​dokuwiki/​doku.php/​vba
 +'​Environment ​ : VBA 2010 +
 +'​Version ​     : 1.1.1
 +'​Name ​        : list
 +'​Author ​      : Stefan Erb (ERS)
 +'​History ​     : 23.06.2014 - ERS - Creation
 +' ​              ​23.06.2014 - ERS - Parametervielfalt eingeführt
 +'​-------------------------------------------------------------------------------
 +Option Explicit
 +
 +'/**
 +' * analog zu array_shift aus PHP
 +' * liefert den ersten Wert von array , verschiebt die anderen Werte hinunter, und verkürzt array um ein Element.
 +' * Alle numerischen Schlüssel werden so modifiziert,​ dass bei null zu zählen begonnen wird.
 +' * Ist array leer (oder kein Array), wird NULL zurückgegeben.
 +' * Wenn man den Returnwert als 2ten Paramater abgreift, muss man sich nicht mehr darum kümmern, ob er ein Objekt ist oder nicht.
 +' * Will man das nicht, kann auch der Boolean-Parameter um den IndexReset zu steuern an 2ter Stelle mitgeben. Ist als oValue mit einem
 +' * Boolean belegt, dann wird das als iIndexReset intepretiert
 +' *
 +' *     value = arrayShift(array [,​value][,​indexReset])
 +' *     ​arrayShift array [,​value][,​indexReset]
 +' *
 +' * @example ​   value = arrayShift(values) ​         '​Einfach erste rausnehmen
 +' * @example ​   arrayShift values, value            'dito
 +' * @example ​   value = arrayShift(values,​ false) ​  '​Index wird nicht zurückgesetzt
 +' * @example ​   arrayShift(values,​ value, false) ​   'dito
 +' * @example ​   arrayShift values ​                  '​Erster wird entfernt und weggeworfen,​ Index zurückgesetzt
 +' * @example ​   arrayShift values, false            '​Erster wird entfernt und weggeworfen,​ Index bleibt erhalten
 +' *
 +' * @param ​ Array<​Variant> ​ Array, der die Daten enthält
 +' * @param ​ Variant ​        ​Return-Wert / indexReset
 +' * @param ​ Variant ​        ​Angabe,​ ob der Index beim reduzierten Array zurückgesetzt werden soll
 +' * @retrun Varaint
 +' */
 +Public Function arrayShift(ByRef ioArray As Variant, _
 +        Optional ByRef oValue As Variant = Null, _
 +        Optional ByVal iIndexReset As Variant = True _
 +) As Variant
 +On Error GoTo Err_Handler
 +    '​Erster Wert auslesen
 +    ref arrayShift, ioArray(LBound(ioArray)) ​   '​Erster Wert ermitteln
 +    If VarType(oValue) = vbBoolean Then
 +        iIndexReset = oValue ​                   '​oValue ist nicht oValue, sondern iIndexReset
 +    Else
 +        ref oValue, arrayShift ​                 '​oValue abfüllen
 +    End If
 +    ​
 +    'Alle anderen Werte um eins nach oben schieben
 +    Dim retArr() As Variant
 +    Dim idx As Integer
 +    If iIndexReset Then
 +        Dim delta As Integer: delta = LBound(ioArray) + 1
 +        ReDim retArr(0 To UBound(ioArray) - delta)
 +        For idx = delta To UBound(ioArray):​ ref retArr(idx - delta), ioArray(idx):​ Next idx
 +    Else
 +        ReDim retArr(LBound(ioArray) + 1 To UBound(ioArray))
 +        For idx = LBound(retArr) To UBound(retArr):​ ref retArr(idx),​ ioArray(idx):​ Next idx
 +    End If
 +    ioArray = retArr
 +
 +Exit_Handler:​
 +    Exit Function
 +Err_Handler:​
 +    arrayShift = Null
 +End Function
 +
 +'/**
 +' * Bei einer Variablenübergabe muss immer unterscheiden werden, ob es ein Objekt ist oder nicht.
 +' * Diese Sub nimmt einem die Arbeit ab
 +' * ref(oNode, iNode)
 +' * @param ​ Variant ​    ​Variable,​ die den Wert bekommen soll
 +' * @param ​ Variant ​    Ret Wert selber
 +' */
 +Private Sub ref(ByRef oNode As Variant, ByRef iNode As Variant)
 +    If IsObject(iNode) Then
 +        '​Objekte als referenz übergeben
 +        Set oNode = iNode
 +    Else
 +        'Je nach Datentyp der erwartet wird handeln.
 +        Select Case TypeName(oNode)
 +            Case "​String": ​     oNode = CStr(Nz(iNode))
 +            Case "​Integer": ​    oNode = CInt(Nz(iNode))
 +            Case "​Long": ​       oNode = CLng(Nz(iNode))
 +            Case "​Double": ​     oNode = CDbl(Nz(iNode))
 +            Case "​Byte": ​       oNode = CByte(Nz(iNode))
 +            Case "​Decimal": ​    oNode = CDec(Nz(iNode))
 +            Case "​Currency": ​   oNode = CCur(Nz(iNode))
 +            Case "​Date": ​       oNode = CDate(Nz(iNode))
 +            Case "​Nothing":​
 +            Case Else:          oNode = iNode
 +        End Select
 +    End If
 +End Sub</​code>​
vba/functions/arrayshift.1404380202.txt.gz · Last modified: 03.07.2014 11:36:42 by yaslaw