Array in VBA

C@N

Stammgast
Hy Leute

Ich habe da so eine Aufgabe im VBA zu lösen. Ich möchte gerne die Anzahl der Arrays selber eingeben wollen, also irgendwie eine Inputbox einbinden. Wie muss ich das am Besten machen?

Nach Arraytest --> (5) sollte ich selber eingeben können!? Der Code, den ich bis jetzt habe, sieht so aus:

Danke für eure Hilfe

Greez C@N
 

Anhänge

  • Array-Zufall.txt
    425 Bytes · Aufrufe: 8

C@N

Stammgast
Habe eine Variante gefunden ^^
Falls doch noch andere Einwände oder Ideen im Raum stehen, bin ich offen für Neues!

Hier noch die Lösung..

Greez C@N
 

Anhänge

  • Array-Zufall (2).txt
    498 Bytes · Aufrufe: 8

Nebuk

PCtipp-Moderation
Teammitglied
Ich nutze VBA sehr wenig bzw. gar nicht mehr. Auf den ersten Blick sieht es gut aus. Eines solltest du vielleicht noch anpassen:
arreyzahl -> arrayzahl
:)
 

C@N

Stammgast
Ich nutze VBA sehr wenig bzw. gar nicht mehr. Auf den ersten Blick sieht es gut aus. Eines solltest du vielleicht noch anpassen:
arreyzahl -> arrayzahl
:)
Ja ich nutze es eigentlich au nicht, oder noch nicht, aber wir haben das Thema gerade in der Schule und da hab ich mal ein bisschen herumgebastelt!
Habs geändert, danke.

Greez C@N
 

Xpert

Stammgast
Code:
Option Explicit
Public Sub arreyTest()

'Variabeln dekleration
Dim arrayGroesse, i As Integer


'Array deklarieren ohne feste groesse
Dim arrayTest(10) As Integer
Dim value As Integer
Dim arreyzahl As Integer

Randomize

arreyzahl = InputBox("Geben sie die Arreyzahl ein", "Arreyzahl", "")

For i = 0 To arreyzahl
value = CInt(Int(((10 - 5) * Rnd()) + 5))

arrayTest(i) = value
MsgBox arrayTest(i) & " ist die Zahl in folgendem arrayText (" & arrayTest(i) & ")"
Next i
End Sub

Mit ist das Ziel nicht so klar. Im Moment definierst du einen fixen Array der Grösse 10 (Dim arrayTest(10). Zudem definierst du die Variable "arrayGroesse" ohne diese zu verwenden und die Variable "value" ist überflüssig. Das geht auch direkt. Im übrigen muss man Arrays am Anfang zwar immer definieren (nicht fix) aber danach kann mit ReDim die Grösse angepasst werden.

Sieht dann so aus:

Code:
Public Sub arreyTest()

'Variabeln dekleration
Dim i As Integer


'Array deklarieren ohne feste groesse
Dim arrayTest(10) As Integer
Dim arreyzahl As Integer

Randomize

arreyzahl = InputBox("Geben sie die Arreyzahl ein", "Arreyzahl", "")

    For i = 0 To arreyzahl
        arrayTest(i) = CInt(Int(((10 - 5) * Rnd()) + 5))
        MsgBox arrayTest(i) & " ist die Zahl in folgendem arrayText (" & arrayTest(i) & ")"
    Next i

End Sub
 
Zuletzt bearbeitet:

C@N

Stammgast
Code:
Option Explicit
Public Sub arreyTest()

'Variabeln dekleration
Dim arrayGroesse, i As Integer


'Array deklarieren ohne feste groesse
Dim arrayTest(10) As Integer
Dim value As Integer
Dim arreyzahl As Integer

Randomize

arreyzahl = InputBox("Geben sie die Arreyzahl ein", "Arreyzahl", "")

For i = 0 To arreyzahl
value = CInt(Int(((10 - 5) * Rnd()) + 5))

arrayTest(i) = value
MsgBox arrayTest(i) & " ist die Zahl in folgendem arrayText (" & arrayTest(i) & ")"
Next i
End Sub

Mit ist das Ziel nicht so klar. Im Moment definierst du einen fixen Array der Grösse 10 (Dim arrayTest(10). Zudem definierst du die Variable "arrayGroesse" ohne diese zu werden und die Variable "value" ist überflüssig. Das geht auch direkt. Im übrigen muss man Arrays am Anfang zwar im fix definieren aber danach kann mit ReDim die Grösse angepasst werden.

Sieht dann so aus:

Code:
Public Sub arreyTest()

'Variabeln dekleration
Dim i As Integer


'Array deklarieren ohne feste groesse
Dim arrayTest(10) As Integer
Dim arreyzahl As Integer

Randomize

arreyzahl = InputBox("Geben sie die Arreyzahl ein", "Arreyzahl", "")

    For i = 0 To arreyzahl
        arrayTest(i) = CInt(Int(((10 - 5) * Rnd()) + 5))
        MsgBox arrayTest(i) & " ist die Zahl in folgendem arrayText (" & arrayTest(i) & ")"
    Next i

End Sub
Man kann ja die Anzahl der Array-Werten definieren (die Zahl in der Klammer) und ich möchte, dass man diese Zahl selber eingeben kann (inputbox).
Stimmt jetzt wo dus sagst! Ich habe es gerad per mail mit einer Kollegin angeschaut und uns ist genau auch das aufgefallen! Danke für den Hinweis.
Ich habe das mit der arrayzahl und der Inputbox nie geschaft, aber wenn ich dein Code so anschaue, dann komm ich mir irgendwie blöde vor :S =P

Greez C@N
 

Xpert

Stammgast
Man kann ja die Anzahl der Array-Werten definieren (die Zahl in der Klammer) und ich möchte, dass man diese Zahl selber eingeben kann (inputbox).
Stimmt jetzt wo dus sagst! Ich habe es gerad per mail mit einer Kollegin angeschaut und uns ist genau auch das aufgefallen! Danke für den Hinweis.
Ich habe das mit der arrayzahl und der Inputbox nie geschaft, aber wenn ich dein Code so anschaue, dann komm ich mir irgendwie blöde vor :S =P

Greez C@N

Also dumm musst du dir gar nicht vorkommen, dem sagt man Lernphase und die hatte auch ich ;) Das was mit der Arraygrösse nicht stimmt, merkst du wenn du eine Zahl > 10 eingibst, dann gibts später nämlich eine Fehlermeldung. Im übrigen habe ich deinen Code nicht 100% richtig überarbeitet, dass möchte ich dir überlassen :cool:
 

C@N

Stammgast
Also dumm musst du dir gar nicht vorkommen, dem sagt man Lernphase und die hatte auch ich ;) Das was mit der Arraygrösse nicht stimmt, merkst du wenn du eine Zahl > 10 eingibst, dann gibts später nämlich eine Fehlermeldung. Im übrigen habe ich deinen Code nicht 100% richtig überarbeitet, dass möchte ich dir überlassen :cool:
Ja ist wohl so.
Mit einer Zahl die grösser ist als 10 habe ich es zuerst eben nicht versucht, deshalb kam auch keine Fehlermeldung. Ich habs mit 20 versucht und nach ein paar Klicks kam dann der Fehler!
Klar, ich werde alles nochmals anschauen. Vielleicht schau ich ihn noch mit dem Lehrer an oder einem Schulkameraden.

Noch einen schönen Abend
Greez C@N
 

C@N

Stammgast
done

Habe es am Freitag mit meinem Lehrer angeschaut und dann noch mit der Klasse. Sind dann auf diese Lösung gekommen:

Code:
Option Explicit
Public Sub arreyTest()

'Variabeln dekleration
Dim arrayGroesse, i As Integer


'Array deklarieren ohne feste groesse
Dim arrayTest(10) As Integer
Dim value As Integer
Dim arreyzahl As Integer

Randomize

arreyzahl = InputBox("Geben sie die Arreyzahl ein", "Arreyzahl", "")

For i = 0 To arreyzahl
value = CInt(Int(((10 - 5) * Rnd()) + 5))

arrayTest(i) = value
MsgBox arrayTest(i) & " ist die Zahl in folgendem arrayText (" & arrayTest(i) & ")"
Next i
End Sub

Mit ist das Ziel nicht so klar. Im Moment definierst du einen fixen Array der Grösse 10 (Dim arrayTest(10). Zudem definierst du die Variable "arrayGroesse" ohne diese zu verwenden und die Variable "value" ist überflüssig. Das geht auch direkt. Im übrigen muss man Arrays am Anfang zwar immer definieren (nicht fix) aber danach kann mit ReDim die Grösse angepasst werden.

Sieht dann so aus:

Code:
Option Explicit

Public Sub arraytest()

Dim arraytest() As Integer
Dim strDurchlaeufe As String
Dim intDurchlaeufe As Integer
Dim b As Integer

strDurchlaeufe = InputBox("Wie oft soll die Schleife wiederholt werden?: ", "")

intDurchlaeufe = CInt(strDurchlaeufe) 'String to Integer

ReDim arraytest(intDurchlaeufe) As Integer 'intDurhlaeufe in Variabel arraytest definieren

Dim max, min
max = InputBox("Geben Sie hier Ihre gewünschte Maximumzahl ein", "")
min = 1
Randomize

    For b = intDurchlaeufe To 1 Step -1 'wiederholt so oft wie die Zahl in IntDurchlaeufe
        intDurchlaeufe = CInt(Int((max - min + 1) * Rnd + min)) 'CInt = Umwandeln
        MsgBox intDurchlaeufe & " ist die Zahl in folgendem arrayTest(" & intDurchlaeufe & ")"
    Next b


End Sub

Hat gefuntzt ^^
Danke

Greez C@N
 

Xpert

Stammgast
Code:
Option Explicit

Public Sub arraytest()

Dim arraytest() As Integer
Dim strDurchlaeufe As String
Dim intDurchlaeufe As Integer
Dim b As Integer

strDurchlaeufe = InputBox("Wie oft soll die Schleife wiederholt werden?: ", "")

intDurchlaeufe = CInt(strDurchlaeufe) 'String to Integer

ReDim arraytest(intDurchlaeufe) As Integer 'intDurhlaeufe in Variabel arraytest definieren

Dim max, min
max = InputBox("Geben Sie hier Ihre gewünschte Maximumzahl ein", "")
min = 1
Randomize

    For b = intDurchlaeufe To 1 Step -1 'wiederholt so oft wie die Zahl in IntDurchlaeufe
        intDurchlaeufe = CInt(Int((max - min + 1) * Rnd + min)) 'CInt = Umwandeln
        MsgBox intDurchlaeufe & " ist die Zahl in folgendem arrayTest(" & intDurchlaeufe & ")"
    Next b


End Sub

Hat gefuntzt ^^
Danke

Greez C@N

Sieht eigentlich ganz ok aus und wird sicher funktionieren. Ein paar Bemerkungen habe ich aber noch:

- Bitte sei dir bewusst, dass dies funktioniert ,aber nur zum Testen der Funktionalität geeignet ist. In der Praxis müsste unbedingt noch ein Error-Handling rein -> so bekommst du eine üble Meldung wenn du z.B. einen Buchstaben statt einer Zahl eingibst. Im Minimum würde ich gleich nach "Option Explicit" ein "On Error Resume Next" setzen. Der Benutzer bekommt so zumindest keine Debugmeldung, wobei dies das absolute Minimum an Fehlerbehandlung darstellt.

- Was ich selber nicht gerne sehe ist, wenn man mitten im Code erneut Variabeln deklariert (= unübersichtlich) z.B. max und min hier:
Code:
ReDim arraytest(intDurchlaeufe) As Integer 'intDurhlaeufe in Variabel arraytest definieren

Dim max, min
max = InputBox("Geben Sie hier Ihre gewünschte Maximumzahl ein", "")

zudem fehlt hier eine Variablendeklaration d.h. hier wird für max und min ein Typ Variant definiert. Dies ist völlig unnötig und führt zu mehr Speichergebrauch. Ach ja, da "min" fix ist, kann man den Wert als Konstante definieren bzw. gleich weglassen, da "min" fix ist und du es unten nur noch einmal benötigst.

- Kommentare sind wichtig, trotzdem sollte man sparsam damit umgehen und nicht kommentieren, was man als erfahrener Programmierer sowie gleich vom Schiff aus sieht z.B.
Code:
'String to Integer
und
Code:
'intDurhlaeufe in Variabel arraytest definieren

der letzte Kommentar ist sogar falsch. Du definierst hier keine Variable in "arraytest", sondern du definierst die Grösse des Arrays von "arrytest"!

Im übrigen hätte ich für den folgenden Block einen Kommentar besser verständlichen Kommentar erwartet, da man hier genauer hinsehen muss, um zu verstehen was passiert:

Code:
    For b = intDurchlaeufe To 1 Step -1 'wiederholt so oft wie die Zahl in IntDurchlaeufe
        intDurchlaeufe = CInt(Int((max - min + 1) * Rnd + min)) 'CInt = Umwandeln
        MsgBox intDurchlaeufe & " ist die Zahl in folgendem arrayTest(" & intDurchlaeufe & ")"
    Next b

Wobei ich:
Code:
intDurchlaeufe = CInt(Int((max - min + 1) * Rnd + min))
eh nicht ganz verstehe. "min" wurde mit dem Wert "1" gefüllt und dann ziehst du durch (...)(max - min + 1) (...) "1"von max ab, um wieder "1" zu addieren :confused: Dies macht nur Sinn, wenn du eine Variable Untergrenze hast d.h. "min" nicht fix "1" wäre, sondern Variabel. Da kann man also ziemlich kürzen:

Code:
intDurchlaeufe = Int((max) * Rnd + 1)


Bei mir würde das etwa so aussehen:

Code:
Option Explicit
On Error Resume Next

Public Sub arraytest()

'Funktion: Beispiel wie die Grösse eines Arrays zur Laufzeit gesetzt werden kann
'Autor: Xpert et. al.
'Datum: 04. Juni 2012
'Version: 1.00

Dim arraytest() As Integer
Dim intDurchlaeufe, b, max  As Integer
Dim strDurchlaeufe As String

strDurchlaeufe = InputBox("Wie oft soll die Schleife wiederholt werden?: ", "")
intDurchlaeufe = CInt(strDurchlaeufe)

ReDim arraytest(intDurchlaeufe) As Integer

max = CInt(InputBox("Geben Sie hier Ihre gewünschte Maximumzahl ein", ""))

Randomize

    For b = intDurchlaeufe To 1 Step -1
        intDurchlaeufe = Int((max) * Rnd + 1)'ganzzahlige Zufallszahl innerhalb des Bereichs 1 bis "max" erzeugen
        MsgBox intDurchlaeufe & " ist die Zahl in folgendem arrayTest(" & intDurchlaeufe & ")"
    Next b

End Sub
 

C@N

Stammgast
Klar weiss ich, dass das nur zum testen ist, war ja nur eine Aufgabe zum schauen ob ich alles mehr oder weniger verstehe!

Das mit den Kommentaren war nur für mich (so schnell schnell), da wir solche Befehle in der nächsten grossen Prüfung haben werden und dass ich dann noch weiss um was es geht.

Das mit dem intDurchläufe in arraytest war auch so gemeint wie du geschrieben hast und um eine Randomzahl zu erhalten, also diese Rechnung, die du gekürzt hast, habe ich aus dem Internet! Aber stimmt, deine Version ist einfacher.

Aber danke, werde ich mir alles merken, wenn ich dann richtig Programmieren muss! =)

Greez C@N
 

Xpert

Stammgast
Klar weiss ich, dass das nur zum testen ist, war ja nur eine Aufgabe zum schauen ob ich alles mehr oder weniger verstehe!

Das mit den Kommentaren war nur für mich (so schnell schnell), da wir solche Befehle in der nächsten grossen Prüfung haben werden und dass ich dann noch weiss um was es geht.

Das mit dem intDurchläufe in arraytest war auch so gemeint wie du geschrieben hast und um eine Randomzahl zu erhalten, also diese Rechnung, die du gekürzt hast, habe ich aus dem Internet! Aber stimmt, deine Version ist einfacher.

Aber danke, werde ich mir alles merken, wenn ich dann richtig Programmieren muss! =)

Greez C@N

Wünsche dir auf jeden Fall viel Glück für deine nächste grosse Prüfung!
 
Oben