VB(A): 'Benannter' Index

Liebe ExpertInnen,

ich suche eine Möglichkeit, mit einer Zeichenkette auf ein Tabellenelement zuzugreifen: Anstatt aus einem Array per

 for i = 1 to endwert 
 If feld(i,1) = suchbegriff then gefunden = feld(i,2) 
 next i

das Ergebnis herauszunudeln, möchte ich gleich

 ergebnis = feld(suchbegriff ,2) 

schreiben. Geht das überhaupt und irgendwie? Ich kann mich leider nicht erinnern, wo mir das Konstrukt schon mal begegnet ist (Alzheimer grüßt von fern). Wer weiß was?

Gruß Ralf

Hi Ralf,

ersetze das Array durch eine Collection.
Das ist zwar deutlich langsamer, aber für Deinen Zweck besser.

Ich würde es vorziehen, das Array zu sortieren und dann mit einem iterativen Algorithmus im Array zu suchen, wenn es zulässig ist, das Array zu sortieren.

Gruß, Rainer

Moin, Rainer,

ersetze das Array durch eine Collection.

das habe ich befürchtet - irgendwann muss es wohl sein. Meine ersten Versuche sind jämmerlich gescheitert, über „424 - kein Objekt“ bin ich noch nicht hinausgekommen.

Das ist zwar deutlich langsamer, aber für Deinen Zweck besser.

Fürs Erste bin ich auf Asc und Chr$ ausgewichen. Feigheit vor dem Feind und nicht sehr elegant, klappt aber :smile:

Gruß Ralf

@Rainer wb, PC wieder okay?

Hallo Ralf,

ersetze das Array durch eine Collection.

das habe ich befürchtet - irgendwann muss es wohl sein. Meine
ersten Versuche sind jämmerlich gescheitert, über „424 - kein
Objekt“ bin ich noch nicht hinausgekommen.

Verstehe ich nicht, poste doch mal Beispielcode. Ich hab nicht viel Ahnung aber eine Collectoion anzulegen ging problemlos.

Den einzigen für mich praktischen Nutzen für mich sehe ich in der Collection, wenn ich in einer riesen langen Spalte in Excel (oder einem eindimensionalen Array) sehr schnell alle Einträge ohne Doppelte haben will. Das ist da die schnellste mir bekannte Methode.

Ansonsten kann ich mit Collection wenig anfangen.
Genial wäre Collection wenn man es so befüllen könnte:

col.Add „x“, „1“
col.Add „y“, „2“
col.Add „z“, „3“

und dann zugreifen so

msgbox col.item(„y“).key ’ Ergebnis 2
msgbox col.item(2).item ’ Ergebnis y

Aber das geht leider nicht.

Insofern weiß ich gar nicht warum du eine Collection benutzen solltest.

Das ist zwar deutlich langsamer, aber für Deinen Zweck besser.

Fürs Erste bin ich auf Asc und Chr$ ausgewichen. Feigheit vor
dem Feind und nicht sehr elegant, klappt aber :smile:

Was hat denn die Zeichenumwandlung mit deiner Ausgangsfrage zu einem Array zu tun?

Heute ist wohl wieder einer der 365 Tage im Jahr wo ich wenig kapiere, naja, zum Glück haben wir ja Schaltjahr *lächel*

Achja, ausgangs sprachst du von einer Tabelle, welcher Art, Excel, Access, Word, in einer VB-Form, sonstwo? , bei dir weiß ich das nie, du tingelst da überall rum :smile:

Gruß
Reinhard

Moin, Reinhard,

Verstehe ich nicht, poste doch mal Beispielcode.

hab grad keinen mehr zur Hand :frowning:

eine Collectoion anzulegen ging problemlos.

Ich fürchte, mir fehlt’s am objektorientierten Denken. Aber gleich dermaßen, dass ich nicht mal Fragen formulieren kann. Der 424 hat mich schon öfter gequält :frowning:((

Was hat denn die Zeichenumwandlung mit deiner Ausgangsfrage zu
einem Array zu tun?

Vielleicht bloß schlecht formuliert. Für eine Prüfziffernberechnung brauchte ich Pärchen von Zeichen und Zahlen, die sich teilweise aus dem Ascii-Code herleiten lassen.

Achja, ausgangs sprachst du von einer Tabelle, welcher Art,
Excel, Access, Word, in einer VB-Form, sonstwo?

Die Application läuft in Access, druckt manches per Word, im- und exportiert nach Excel und druckt Barcode-Etiketten. Mit Tabelle habe ich wohl ein Array in VBA gemeint - Asche auf mein Haupt.

bei dir weiß ich das nie, du tingelst da überall rum :smile:

Ich fresse aus allen Näpfen, soweit ich das Zeug beißen kann.

Gruß Ralf

Grüezi Ralf

ich suche eine Möglichkeit, mit einer Zeichenkette auf ein
Tabellenelement zuzugreifen: Anstatt aus einem Array per

for i = 1 to endwert
If feld(i,1) = suchbegriff then gefunden = feld(i,2)
next i

das Ergebnis herauszunudeln, möchte ich gleich

ergebnis = feld(suchbegriff ,2)

schreiben. Geht das überhaupt und irgendwie? Ich kann mich
leider nicht erinnern, wo mir das Konstrukt schon mal begegnet
ist (Alzheimer grüßt von fern). Wer weiß was?

Das ist doch eigentlich das Prinzip eines SVERWEIS() aus Excel.
Wenn denn der Code in Excel läuft kannst Du diese wie folgt ausnutzen:

Public Sub Test()
Dim Arr(4, 1) As Variant
 For i = 0 To 4
 Arr(i, 0) = "a" & i
 Arr(i, 1) = i
 Next i
 MsgBox Application.WorksheetFunction.VLookup("a4", Arr(), 2, 0)
End Sub

Ansonsten denke ich auch, dass Du eine Collection verwenden könntes(
(Die kann im Übrigen gemischt jede Menge verschiedener Objekte aufnehmen; Strings, Zahlen, Ranges usf.)


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Excel Vba Löung mit Collection

ich suche eine Möglichkeit, mit einer Zeichenkette auf ein
Tabellenelement zuzugreifen: Anstatt aus einem Array per
for i = 1 to endwert
If feld(i,1) = suchbegriff then gefunden = feld(i,2)
next i
das Ergebnis herauszunudeln, möchte ich gleich
ergebnis = feld(suchbegriff ,2)
schreiben.

Hallo Ralf,

Tabellenblatt: [Mappe1]!Tabelle1
 │ A │ B │ C │ D │
──┼─────────────┼────┼─────────────┼───┤
1 │ müller │ 2 │ drampeltier │ 9 │
──┼─────────────┼────┼─────────────┼───┤
2 │ meier │ 3 │ │ │
──┼─────────────┼────┼─────────────┼───┤
3 │ schmidt │ 4 │ │ │
──┼─────────────┼────┼─────────────┼───┤
4 │ schulze │ 5 │ │ │
──┼─────────────┼────┼─────────────┼───┤
5 │ bauer │ 6 │ │ │
──┼─────────────┼────┼─────────────┼───┤
6 │ vogel │ 7 │ │ │
──┼─────────────┼────┼─────────────┼───┤
7 │ mustermann │ 8 │ │ │
──┼─────────────┼────┼─────────────┼───┤
8 │ drampeltier │ 9 │ │ │
──┼─────────────┼────┼─────────────┼───┤
9 │ Elefant │ 10 │ │ │
──┴─────────────┴────┴─────────────┴───┘
Benutzte Formeln:
D1: =Finde(C1)

A1:smiley:9
haben das Zahlenformat: Standard

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Der Code dazu (in Modu1):

 Option Explicit
'
Function Finde(SuchwortZelle As Range) As Integer
Dim N As Long, colFeld As New Collection
On Error GoTo Fehler
For N = 1 To Range("A" & Rows.Count).End(xlUp).Row
 colFeld.Add CStr(Cells(N, 2)), Cells(N, 1)
Next N
Finde = CInt(colFeld.Item(SuchwortZelle.Value))
Exit Function
Fehler:
 Finde = 0
End Function

Gruß
Reinhard

Grüezi Rainhard

ich suche eine Möglichkeit, mit einer Zeichenkette auf ein
Tabellenelement zuzugreifen: Anstatt aus einem Array per
for i = 1 to endwert
If feld(i,1) = suchbegriff then gefunden = feld(i,2)
next i
das Ergebnis herauszunudeln, möchte ich gleich
ergebnis = feld(suchbegriff ,2)
schreiben.

Tabellenblatt: [Mappe1]!Tabelle1
│ A │ B │ C
│ D │
──┼─────────────┼────┼─────────────┼───┤
1 │ müller │ 2 │ drampeltier
│ 9 │
──┼─────────────┼────┼─────────────┼───┤
2 │ meier │ 3 │
│ │
──┼─────────────┼────┼─────────────┼───┤
3 │ schmidt │ 4 │
│ │
──┼─────────────┼────┼─────────────┼───┤
4 │ schulze │ 5 │
│ │
──┼─────────────┼────┼─────────────┼───┤
5 │ bauer │ 6 │
│ │
──┼─────────────┼────┼─────────────┼───┤
6 │ vogel │ 7 │
│ │
──┼─────────────┼────┼─────────────┼───┤
7 │ mustermann │ 8 │
│ │
──┼─────────────┼────┼─────────────┼───┤
8 │ drampeltier │ 9 │
│ │
──┼─────────────┼────┼─────────────┼───┤
9 │ Elefant │ 10 │
│ │
──┴─────────────┴────┴─────────────┴───┘
Benutzte Formeln:
D1: =Finde(C1)

Tabellendarstellung erreicht mit dem Code in
FAQ:2363

Option Explicit

Function Finde(SuchwortZelle As Range) As Integer
Dim N As Long, colFeld As New Collection
On Error GoTo Fehler
For N = 1 To Range(„A“ & Rows.Count).End(xlUp).Row
colFeld.Add CStr(Cells(N, 2)), Cells(N, 1)
Next N
Finde = CInt(colFeld.Item(SuchwortZelle.Value))
Exit Function
Fehler:
Finde = 0
End Function

Hmmm - baust Du hier den SVERWEIS() nach? :wink:

IMO sollte sich der OP mal wieder melden was genau er will/möchte.
Ich fürchte es geht nicht um ein Range-Array, sondern ein ‚selbstgebautes‘…


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Spalten als Long oder Integer definieren?
Grüzi Thomas,

Option Explicit

Function Finde(SuchwortZelle As Range) As Integer
Dim N As Long, colFeld As New Collection
On Error GoTo Fehler
For N = 1 To Range(„A“ & Rows.Count).End(xlUp).Row
colFeld.Add CStr(Cells(N, 2)), Cells(N, 1)
Next N
Finde = CInt(colFeld.Item(SuchwortZelle.Value))
Exit Function
Fehler:
Finde = 0
End Function

Hmmm - baust Du hier den SVERWEIS() nach? :wink:

ui, ist mir gar nicht aufgefallen weil ich so mit der Collection beschäftigt war.
Hätte ich probiert Sverweis nachzubauen wäre ich nie auf Collection gekommen :smile:

In dem Zusammenhang, ich stiess heute auf „Scripting.Dictionary“, ich sehe da keinen Unterschied zu Collection, ist das etwa das Gleiche?

Die MS-Seite: http://msdn2.microsoft.com/en-us/library/x4k5wbx4(VS…
hilft mir da nicht weiter oder ich überlese es dort.

IMO sollte sich der OP mal wieder melden was genau er
will/möchte.
Ich fürchte es geht nicht um ein Range-Array, sondern ein
‚selbstgebautes‘…

Gut möglich und weches Officepaket ist mir auch noch unklar.

Gestern ging es um Dim für Zeilen und Spalten, ich habe da jmd. gesagt daß ich für Spalten immer Integer nehme, für Zeilen immer Long.
Daraufhin hat jmd. anderes mich darauf hingewiesen daß eilen UND Spalten vom Typ her sowieso immer Long sind.

Was auch stimmt, es steht so in der Hilfe für Row und Column.

Sub tt()
Dim Zei As Integer
Zei = ActiveCell.Row
MsgBox TypeName(Zei) ’ Integer
MsgBox VarType(Zei) 'ergibt 2 = Integer
End Sub

Was mache ich nun mit der Information daß beide Variablen in der Hilfe als Long beschrieben werden, vergessen, nicht beachten, kann da mal irgendwannn bei irgendeiner Gelegenheit ein unentdeckter Fehler entstehen wenn ich weiterhin Spalten als Integer definiere?
Für XL2007 reicht ja noch Integer.

Danke ^ Gruß
Reinhard


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüezi Reinhard

Grüzi Thomas,

Uuups, ein kleiner Versprecher - das kommt vor am Anfang :wink:

Hmmm - baust Du hier den SVERWEIS() nach? :wink:

ui, ist mir gar nicht aufgefallen weil ich so mit der
Collection beschäftigt war.
Hätte ich probiert Sverweis nachzubauen wäre ich nie auf
Collection gekommen :smile:

Hi, hi, ja der Wald und die Bäume, ich weiss.
Die Collection ist auch nur ‚zweispaltig‘, wenns weiter geht ist der SVERWEIS() etas mächtiger.

In dem Zusammenhang, ich stiess heute auf
„Scripting.Dictionary“, ich sehe da keinen Unterschied zu
Collection, ist das etwa das Gleiche?

In etwa - wobei das Dictionary-Objekt ein ‚externes‘ ist, das erst erzeugt werden muss und IMO nur Strings aufnehmen kann.

Die Collections sind Teil der VBA-Objekte und können auch gemischte Inhalte wie Strings, Doubles, Ranges, Userforms und noch so einiges mehr aufnehmen, das Ganze auch bunt gemischt.

Von der Handhabung her sind sich aber Collections und das Dictionary-Objekt sehr ähnlich.

Fast alles in Excel wird intern über Collections verwaltet:

http://msdn2.microsoft.com/en-us/library/aa272271(of…

Gestern ging es um Dim für Zeilen und Spalten, ich habe da
jmd. gesagt daß ich für Spalten immer Integer nehme, für
Zeilen immer Long.
Daraufhin hat jmd. anderes mich darauf hingewiesen daß eilen
UND Spalten vom Typ her sowieso immer Long sind.

Was auch stimmt, es steht so in der Hilfe für Row und Column.

Was mache ich nun mit der Information daß beide Variablen in
der Hilfe als Long beschrieben werden, vergessen, nicht
beachten, kann da mal irgendwannn bei irgendeiner Gelegenheit
ein unentdeckter Fehler entstehen wenn ich weiterhin Spalten
als Integer definiere?
Für XL2007 reicht ja noch Integer.

Ein Aspekt der hier noch hinzukommt ist der Speicherbedarf für die Variablen - da Integer ein Untertyp von Long ist und intern eh mit Long gerechnet wird bringt Integer IMO keine wirklichen Vorteile da der Wert für die Verarbeitung eh in Long umgewandelt wird.

Prinzipiell würde bis xl2003 ja sogar Byte völlig ausreichen um die Spalten durchzuzählen.

Ich denke es hängt auch vom persönlichen Stil und Gusto ab - wichtig(er) scheint mit hier, dass überhaupte eine Daklaration vorgenommen wird und diese wenn möglich auch bewusst und mit Bedacht (nicht also Integer für Zeilen).


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüzi Thomas,

Grüezi Reinhard

Grüzi Thomas,

Uuups, ein kleiner Versprecher - das kommt vor am Anfang :wink:

jaja, immer auf die kleinen Unschuldigen, die sich nicht wehren können.

Übrigens, ich bin ja Gentleman, ich würde jetzt nie nicht dich fragen ob Daklaration was Neues in XL2007 Vba ist, was die früheren Definitionen und Deklarationen zusammenführt *grien*

In dem Zusammenhang, ich stiess heute auf
„Scripting.Dictionary“, ich sehe da keinen Unterschied zu
Collection, ist das etwa das Gleiche?

In etwa - wobei das Dictionary-Objekt ein ‚externes‘ ist, das
erst erzeugt werden muss und IMO nur Strings aufnehmen kann.

Bin ja Gentleman und sage zu IMO nix, verweise nur diskret auf
http://msdn2.microsoft.com/en-us/library/x4k5wbx4(VS…

-)

Die Collections sind Teil der VBA-Objekte und können auch
gemischte Inhalte wie Strings, Doubles, Ranges, Userforms und
noch so einiges mehr aufnehmen, das Ganze auch bunt gemischt.

Von der Handhabung her sind sich aber Collections und das
Dictionary-Objekt sehr ähnlich.

Ja, ich habe es jeweils mit 10000 Items getestet, waren gleichschnell.

Wobei ich die Feinheiten natürlich nicht weiß, ob sie z.B. gleiche Startbedingungen hatten, ich meine damit daß ich ja schreiben kann
Dim colFeld as new Collection und dann gleich mit .Add etwas dazufügen kann, während ich ja dieses dictionary erst als Variable definieren muß und dann später noch Set benutzen muß.
Sicher, das macht quasi keine Zeit aus, aber watt weiß ich wie Vba die Dinger intern verwaltet.
Aber so ein Wissen tangiert mich derzeit noch wenifer als peripher, a) weil mir das Hintergrundwissen fehlt b) es grad wichtigeres gibt.

Fast alles in Excel wird intern über Collections verwaltet:

http://msdn2.microsoft.com/en-us/library/aa272271(of…

*seufz* das meinte ich grad eben, wann soll ich denn das alles durchlesen, testen, irgendwann kapieren :frowning:

Ein Aspekt der hier noch hinzukommt ist der Speicherbedarf für
die Variablen - da Integer ein Untertyp von Long ist und
intern eh mit Long gerechnet wird bringt Integer IMO keine
wirklichen Vorteile da der Wert für die Verarbeitung eh in
Long umgewandelt wird.

Aha, sehr interessant, da denke ich mir spontan, dann nehme ich doch gleich Long für alle Zahlen (schon klar ggfs.Double usw.) aber dann sehe ich deine nächste Aussage :frowning:

Prinzipiell würde bis xl2003 ja sogar Byte völlig ausreichen
um die Spalten durchzuzählen.

Jett haste mich geschafft, was soll ich denn nun nehmen, Byte oder Long? (2007 lasse ich jetzt mal weg)

Oder anderstrum, was nimmst du? Immer Long oder schaust du welche Zahlwerte im maximalfall entstehen können? Und wenn ja, was soll das dann für die geschwindigkeit bringen wenn sie sowieso in Long gewandelt werden *verwirrt blöd aus der Wäsche glotz* *gg*

Ich denke es hängt auch vom persönlichen Stil und Gusto ab -
wichtig(er) scheint mit hier, dass überhaupte eine Daklaration
vorgenommen wird und diese wenn möglich auch bewusst und mit
Bedacht (nicht also Integer für Zeilen).

Vor deinem Beitrag dachte ich mir das so, daklariere ich nicht ist alles Variant und daklariere ich Spalte als Byte so müßte das schneller sein, da Variant k.A. 22 Bytes oder so hat, Byte nur ähem ein Byte.
Mir fällt grad af, für meine nächste Äußerung passt variant nicht, nehmen wir lieber Integer.

Gut, ich habe schon irgendwo gelesen daß sowas öfters gar nix bringt, weil man einen schnellen Rechner hat der sowieso alles in 64 oder gar 128 Bits rechnet und der überprüft nicht ob er Byte-variablen oder Integer-Variablen addiert.
Aus dem Bauch heraus würde ich jetzt sagen man achte auf die Uhrzeit und ich habe grad keine Lust in der Hilfe nachzuschauen, Integer sind 4 Bytes *einfach mal so schätz*
D.h. egal ob man jetzt eine Variable als Typ Byte oder Integer definiert ist völlig egal, die Verarbeitung ist genauso schnell als wenn man einen Datentyp wählt der halt diese 64 oder 128 Bits breit ist.

Gut’s Nächtle

Gruß
Reinhard

Grüezi Reinhard :smile:

Grüzi Thomas,

Grüezi Reinhard

Grüzi Thomas,

Uuups, ein kleiner Versprecher - das kommt vor am Anfang :wink:

jaja, immer auf die kleinen Unschuldigen, die sich nicht
wehren können.

Ja, vor allem auf die sozial Schwachen mit nur einem Vater :wink:

Übrigens, ich bin ja Gentleman, ich würde jetzt nie nicht dich
fragen ob Daklaration was Neues in XL2007 Vba ist, was die
früheren Definitionen und Deklarationen zusammenführt *grien*

Acha Du hast mich also erwischtes also bemerkt…

In dem Zusammenhang, ich stiess heute auf
„Scripting.Dictionary“, ich sehe da keinen Unterschied zu
Collection, ist das etwa das Gleiche?

In etwa - wobei das Dictionary-Objekt ein ‚externes‘ ist, das
erst erzeugt werden muss und IMO nur Strings aufnehmen kann.

Bin ja Gentleman und sage zu IMO nix, verweise nur diskret auf
http://msdn2.microsoft.com/en-us/library/x4k5wbx4(VS…

-)

Hmmm, dann hat mich mein Erinnerungsvermögen da arg getäuscht - ist wohl nicht mehr das Jüngste…

Fast alles in Excel wird intern über Collections verwaltet:

http://msdn2.microsoft.com/en-us/library/aa272271(of…

*seufz* das meinte ich grad eben, wann soll ich denn das alles
durchlesen, testen, irgendwann kapieren :frowning:

Willkommen im Club, sage ich da nur.

Ein Aspekt der hier noch hinzukommt ist der Speicherbedarf für
die Variablen - da Integer ein Untertyp von Long ist und
intern eh mit Long gerechnet wird bringt Integer IMO keine
wirklichen Vorteile da der Wert für die Verarbeitung eh in
Long umgewandelt wird.

Aha, sehr interessant, da denke ich mir spontan, dann nehme
ich doch gleich Long für alle Zahlen (schon klar ggfs.Double
usw.) aber dann sehe ich deine nächste Aussage :frowning:

Ich denke einmal muss man sich entscheiden…

Prinzipiell würde bis xl2003 ja sogar Byte völlig ausreichen
um die Spalten durchzuzählen.

Jett haste mich geschafft, was soll ich denn nun nehmen, Byte
oder Long? (2007 lasse ich jetzt mal weg)

Oder anderstrum, was nimmst du? Immer Long oder schaust du
welche Zahlwerte im maximalfall entstehen können? Und wenn ja,
was soll das dann für die geschwindigkeit bringen wenn sie
sowieso in Long gewandelt werden *verwirrt blöd aus der Wäsche
glotz* *gg*

…ich mache das meistens nach Gefühl.
Allein der Ansatz dass man(n) sich Gedanken darüber macht wie gross denn ein Wert sein kann, der an die Variable übergeben wird ist viel wert, denke ich mal.

Ich denke es hängt auch vom persönlichen Stil und Gusto ab -
wichtig(er) scheint mit hier, dass überhaupte eine Daklaration
vorgenommen wird und diese wenn möglich auch bewusst und mit
Bedacht (nicht also Integer für Zeilen).

Vor deinem Beitrag dachte ich mir das so, daklariere ich nicht
ist alles Variant und daklariere ich Spalte als Byte so müßte
das schneller sein, da Variant k.A. 22 Bytes oder so hat, Byte
nur ähem ein Byte.
Mir fällt grad af, für meine nächste Äußerung passt variant
nicht, nehmen wir lieber Integer.

Variant nehme ich ‚nur‘ ganz bewusst - zu viel passiert mir dabei mit impliziter Datentypen-Umwandlung das dann nicht mehr unter Kontrolle ist. Sehr gerne verwende ich ein Variant-Array zur Aufnahme von Ranges in einem Rutsch, das macht dann wirklich was her.

Ansonsten versuche ich klar zu deklarieren.

Gut, ich habe schon irgendwo gelesen daß sowas öfters gar nix
bringt, weil man einen schnellen Rechner hat der sowieso alles
in 64 oder gar 128 Bits rechnet und der überprüft nicht ob er
Byte-variablen oder Integer-Variablen addiert.
Aus dem Bauch heraus würde ich jetzt sagen man achte auf die
Uhrzeit und ich habe grad keine Lust in der Hilfe
nachzuschauen, Integer sind 4 Bytes *einfach mal so schätz*
D.h. egal ob man jetzt eine Variable als Typ Byte oder Integer
definiert ist völlig egal, die Verarbeitung ist genauso
schnell als wenn man einen Datentyp wählt der halt diese 64
oder 128 Bits breit ist.

Und damit triffst Du den Nagel dann auf den Kopf - heute spielt es gar keine so grosse Rolle (mehr) welcher Variablentyp denn verwendet wird, da die Rechner eh viel zu schnell sind, als dass man das noch bemerken würde.
Bei grossen Projekten hingegen macht es IMO Sinn, sich über die Variablentypen Gedanken zu machen und im Laufe der Zeit fliesst dies dann auch in ‚kleine‘ Codes ein.
Das alles ist ein fliessender Prozess, der IMO nie endgültig abgeschlossen ist und sich stets weiter entwickelt - wie alles andere im Leben auch.


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo Reinhard,

ich mag mich net gross einmischen wollen, in eure Diskussion. Wie du sicherlich weisst habe ich A keine Ahnung von VBA und B bin ich gerade dabei mir VB9 beizubringen. Dabei stiess ich auch auf einiges neues, oder besser gesagt Sachen die ich nicht wusste.

Um mal ein wenig Licht ins Dunkel zu bringen, oder dich nochmehr zu verwirren *feix*

Unter VB, kann ich etwas wiefolgt declarieren

Dim I as MeineReferenz
Set I = New MeineReferenz
'Nun kann ich auf I zugreifen

'oder auch

Dim I as New MeineRefernez
'Nun kann ich auch gleich auf I zugreifen :wink:

'hierbei muss man beachten das bis einschliesslich VB6 die Verwendung
'von Set erfolgen muss! Ab VB6 ist dies nicht mehr nötig da das alles 
'Objecte sind!

Dann musst du noch unterscheiden. Der PC hat sagen wir einmal 2 Speicherbereiche! Den Managed Heap ( Heap) und den Stack!

Wertevariablen werden direkt im Stack abgelegt. Wogegen aber Referenzvariablen im Heap abgelegt werden. Ok, um genauer zu sein. Hast du eine Referenzvariable, so werden die Daten im Heap abgelegt! Zusaetzlich noch wird die Adresse vom Heap im Stack abgelegt. Die Variable dann beinhaltet nur die Adresse vom Stack. Über diesen kann sie dann auf den Heap zugreifen :wink:

Das hat natuerlich den Vor oder Nachteil, das wenn du eine ReferenzVariable hast. Das wenn du eine Referenz erstellst, du eigentlich nur den Zeiger verbiegst auf den Heap. Sprich. Es gibt 2 Daten im Stack. Aber beide zeigen gemeinsam auf das „Object“ im Heap! Änderst du nur 1 Variable so aendern sich ergo beide!
Bei WerteVariablen kann dir das nicht passieren, da dort ergo immer eine Kopie im Stack abgelegt wird :wink:

'wir erstellen mal eine Klasse Class1( Die Referenz)
Option Explicit

Private MyData As Integer

Public Property Get MeineVariable() As Integer
MeineVariable = MyData
End Property

Public Property Let MeineVariable(ByVal vNewValue As Integer)
MyData = vNewValue
End Property

'Wir erstellen eine Sub zum testen :wink:
Private Sub tt()
Dim a As New Class1
Dim b As New Class1
a.MeineVariable = 5
b.MeineVariable = 6
MsgBox "A: " & a.MeineVariable & vbNewLine & "B: " & b.MeineVariable
Set a = b 'Wir verbiegen den Zeiger im Stack! Beide Zeiger zeigen auf das selöbe Object!
b.MeineVariable = 10
MsgBox "A: " & a.MeineVariable & vbNewLine & "B: " & b.MeineVariable
End Sub

'Was meinst du was nun in A und in B für ein Wert steht?

Private Sub tt()
Dim a As Integer
Dim b As Integer
a = 5
b = 6
MsgBox "A: " & a & vbNewLine & "B: " & b
a = b
b = 10
MsgBox "A: " & a & vbNewLine & "B: " & b
End Sub

'Na was für Werte stehen nun in A und in B ? :wink:

Wenn man die Hintergruende nicht kennt Reinhard, so kann man schnell auf die Gusche fallen :s Somal du hier Daten aendern kannst, die mit Byval übergeben werden :s

Achja, sicher fragst du dich nun, was zum Geier sind Werte und was sind Referenz Variablen :smile:

Werte Variablen sind Primitive Datentypen ( String, Long, Integer, byte, Strukturen etc.

Referenzvariablen sind Variablen die etwas Referenzieren. Sprich, als kleine Eselsbruecke, wo du New verwendest oder die du mit Set einer Variablen zuweisen tust :wink:

MfG Alex