User Tools

Site Tools


vba:functions:increment

[VBA] Increment/Decrement (i++ etc)

Simuliert ein i++ oder ++i für VBA.

Version 1.1.0 - 11.01.2016

Download lib_increment.bas (V-1.1.0)

In vielen Sprachen kennt man PostIncrement und PreIncrement. Also ++i und i++. Leider kennt VBA das nicht. Somit muss bei einer Manuellen Schleife dies immer von Hand mittels i = i+1 durchgeführt werden.
Mit den folgenden Funktionen kann amn das umgehen.

Beispiele

Für die Ausgabe der Resultate verwendete ich die Funktion [VBA] print_r().

Ich nehme 2 mal dieselbe Funktion. Es wird i jeweils um 1 hochgezählt. Das Quadrat davon muss < als 30 sein. Somit wissen wir am Anfang noch nicht wieviele Einträge da kommen - ergo muss laufend hochgezählt werden und der Ausgabearray vergrössert werden.

PreIncrement ++i

Ohne Incement-Funktion sieht meine Lösung so aus

Public Sub withoutPreIncrement()
    Dim i       As Integer
    Dim arr()   As Integer
 
    i = -1
    Do While (i + 1) ^ 2 < 30
        i = i + 1
        ReDim Preserve arr(i)
        arr(i) = i ^ 2
    Loop
 
    print_r arr
End Sub

Mit inc() oder preInc() vereinfacht sich das ganze

Public Sub withPreIncrement()
    Dim i       As Integer
    Dim arr()   As Integer
 
    i = -1
    Do While inc(i) ^ 2 < 30
        ReDim Preserve arr(i)
        arr(i) = i ^ 2
    Loop
 
    print_r arr
End Sub

PostIncrement i++

Umsetzung ohne meine Funktion

Public Sub withoutPostIncrement()
    Dim i       As Integer
    Dim arr()   As Integer
 
    Do While (i) ^ 2 < 30
        ReDim Preserve arr(i)
        arr(i) = i ^ 2
        i = i + 1
    Loop
 
    print_r arr
End Sub

umsetzung mit postInc() oder inc(#,itPostIncrement)

Public Sub withPostIncrement()
    Dim i       As Integer
    Dim arr()   As Integer
 
    Do While i ^ 2 < 30
        ReDim Preserve arr(i)
        'Die Formel wird zuerst ausgeführt. Dann erst kommt der Teil vor dem =
        'Darum ist postInc() vor dem =
        arr(postInc(i)) = i ^ 2
    Loop
 
    print_r arr
End Sub

Resultat

Achja, alle Test haben natürlich dieselbe Ausgabe:

<Integer()>  (
    [0] => <Integer> 0
    [1] => <Integer> 1
    [2] => <Integer> 4
    [3] => <Integer> 9
    [4] => <Integer> 16
    [5] => <Integer> 25
)

Code

lib_increment.bas
Attribute VB_Name = "lib_increment"
'-------------------------------------------------------------------------------
'File         : lib_increment.bas
'               Copyright mpl by ERB software
'               All rights reserved
'               http://wiki.yaslaw.info/dokuwiki/doku.php/vba/functions/increment
'Environment  : VBA 2007 +
'Version      : 1.1.0
'Name         : lib_increment
'Author       : Stefan Erb (ERS)
'History      : 25.11.2014 - ERS - Creation
'               11.01.2016 - ERS - inc() verkürzt
'-------------------------------------------------------------------------------
Option Explicit
 
Public Enum incType
    itPreIncrement = 0    '++1
    itPostIncrement = 1   'i++
    itPreDecrement = 2    '--i
    itPostDecrement = 3   'i--
End Enum
 
'/**
' * @param  Number
' * @param  incType     Type der Encrementation. Default ist i++
' * @retrun Number
'*/
Public Function inc(ByRef i As Variant, Optional ByVal iIncType As incType = itPreIncrement) As Variant
    Select Case iIncType
        Case itPreIncrement:    i = i + 1:  inc = i     '++i
        Case itPostIncrement:   inc = i:    i = i + 1   'i++
        Case itPreDecrement:    i = i - 1:  inc = i     '--i
        Case itPostDecrement:   inc = i:    i = i - 1   'i--
    End Select
End Function
 
'/**
' * PreIncrement    ++i
' * Zählt i eins hoch und gibt den Wert zurück
' * @param  Number
' * @retrun Number
'*/
Public Function preInc(ByRef i As Variant) As Variant:  preInc = inc(i, itPreIncrement):    End Function
 
'/**
' * PostIncrement   i++
' * Gibt den Wert zurück und zählt dann i eins hoch
' * @param  Number
' * @retrun Number
'*/
Public Function postInc(ByRef i As Variant) As Variant: postInc = inc(i, itPostIncrement):  End Function
 
'/**
' * PreDecrement    --i
' * Zählt i eins hoch und gibt den Wert zurück
' * @param  Number
' * @retrun Number
'*/
Public Function preDec(ByRef i As Variant) As Variant: preDec = inc(i, itPreDecrement):     End Function
 
'/**
' * PostDecrement   i--
' * Gibt den Wert zurück und zählt dann i eins hoch
' * @param  Number
' * @retrun Number
'*/
Public Function postDec(ByRef i As Variant) As Variant: postDec = inc(i, itPostDecrement):  End Function
 
vba/functions/increment.txt · Last modified: 11.01.2016 12:06:32 by yaslaw