VBA Crash-kurs

Moien

Ich bräuchte einen Crashkurs für VBA, am liebsten in der Variante die die Jungs von ESRI verwenden: http://www.esri.com/software/arcgis/index.html

Alternativ würde es mir auch schon helfen wenn jemand weiss was dieser Code genau tut:

if [OBJART] = "3102" then
 kmh = 30
 if [WDM] = "1701" then
 kmh = 40
 endif
endif

Denn auch wenn [OBJART] dem String „3102“ entspricht bleibt kmh = 0. Nehme ich die 2. If-Anfrage raus so wird kmh auf 30 gesetzt. In den Resultaten kommt der Wert 40 gar nicht vor (die Kombination 3102 - 1701 aber schon).

Danke.

Hi pumpkin,

Ich bräuchte einen Crashkurs für VBA, am liebsten in der
Variante die die Jungs von ESRI verwenden:

http://www.esri.com/software/arcgis/index.html

naja, dann rede mit denen :smile: K.A. um was es da geht.

Alternativ würde es mir auch schon helfen wenn jemand weiss
was dieser Code genau tut:

if [OBJART] = „3102“ then
kmh = 30
if [WDM] = „1701“ then
kmh = 40
endif
endif

Denn auch wenn [OBJART] dem String „3102“ entspricht bleibt
kmh = 0. Nehme ich die 2. If-Anfrage raus so wird kmh auf 30
gesetzt. In den Resultaten kommt der Wert 40 gar nicht vor
(die Kombination 3102 - 1701 aber schon).

Das glaube ich so nicht. Entweder die erste IF-Abfrage stimmt oder nicht. Wenn ja wird kmh zumindest auf 30 gestezt, wenn nein halt nicht, bzw bleibt auf Null.
Dazu spielt die Existens der 2ten IF Abfrage erstmal keine Rolle.
Die 2te IF-Abfrage entscheidet nur noch ob kmh 30 oder 40 ist.
Gruß
Reinhard

Moien

Das glaube ich so nicht.

Glaub es oder glaub es nicht, es ist ein bekannter Bug aus deren VBA-Engine. Verschachtelungen von if´s unterstützt das Ding nicht … man kann aber switch in if´s bauen.

Ich weiss schon wieso mir VBA komisch vorkommt.

cu

Hi Pumpkin,

Glaub es oder glaub es nicht, es ist ein bekannter Bug aus
deren VBA-Engine. Verschachtelungen von if´s unterstützt das
Ding nicht … man kann aber switch in if´s bauen.

VBA habe ich bisher für eine Applikations-Programmiersprache von Microsoft gehalten. Wenn die Leute von ESRI etwas haben, was sie auch so nennen, was aber nicht funktioniert, wie sollen wir Dir da helfen?

Suchst Du einen alternativen Weg? Bist Du sicher, daß die Werte stimmen? Hast Du das Programm schon mal im Debugger angesehen? Tritt der Bug auch auf, wenn die zweite Prüfung in einer anderen Prozedur durchgeführt wird? Schon mal ‚Select Case‘ statt ‚If‘ probiert? Erzähl mal etwas über die Werte, die die beiden geprüften Variablen annehmen können, eventuell gibt es da eine andere Lösung, indem man die Werte erst zusammenbringt und bei der Prüfung wieder auseinender rechnet. :smile: Was mit einem ‚richtigen‘ VBA immer geht, ist Funktionen mit VB6 zu programmieren, in ein OCX schreiben und das als neues Steuerelement einfügen. Geht das wenigstens?

Ich weiss schon wieso mir VBA komisch vorkommt.

*gg* ne, VBA kann dafür nichts. :smile: Das VBA von Microsoft funktioniert, das hat solche Bugs nicht.

Gruß, Rainer

Nachtrag
Hi Pumpkin,

Deinen Code kann VB6 nicht lesen, ich habe es gerade mal ausprobiert. Die Variablen dürfen nicht in Klammern stehen. Ist das eine Eigenheit von diesem VBA? In VB6 würde das so aussehen …

Option Explicit

Private Sub Command1\_Click()
 Dim OBJART As String
 Dim WDM As String
 Dim kmh As Integer
 OBJART = "3102"
 WDM = "1701"
 If OBJART = "3102" Then
 kmh = 30
 If WDM = "1701" Then
 kmh = 40
 End If
 End If
 Command1.Caption = kmh
 ' \*\*\* kmh ist 40 \*\*\* :smile:
End Sub

Gruß, Rainer

Deinen Code kann VB6 nicht lesen, ich habe es gerade mal
ausprobiert. Die Variablen dürfen nicht in Klammern stehen.
Ist das eine Eigenheit von diesem VBA? In VB6 würde das so
aussehen …

Hallo Rainer,
in VBA von Excel klappt das:

Sub tt()
Dim kmh
If [OBJART] = "3102" Then
 kmh = 30
 If [WDM] = "1701" Then
 kmh = 40
 End If
End If
MsgBox kmh
End Sub

OBJART und WDM sind Namen von Zellen (Einfügen–Namen–Definieren–…).
Die Zellen müssen als Text formatiert sein. Es klappt weil man in Excelvba
Range(„A1“)=„abc“
oder
[A1]=„abc“
zur Referenzierung benutzen kann.
Gruß
Reinhard

Moien

VBA habe ich bisher für eine Applikations-Programmiersprache
von Microsoft gehalten. Wenn die Leute von ESRI etwas haben,
was sie auch so nennen, was aber nicht funktioniert, wie
sollen wir Dir da helfen?

Wie soll ich als Anwender riechen wer wesen Lib für sein Skripting benutzt ? Die sprechen halt explizit von VBA und verweisen auf die Docs von M$.

Suchst Du einen alternativen Weg? Bist Du sicher, daß die
Werte stimmen? Hast Du das Programm schon mal im Debugger
angesehen?

Soweit man bei dem Ding von einem Debugger sprechen kann: ja. Gleiches Resultat.

Tritt der Bug auch auf, wenn die zweite Prüfung in
einer anderen Prozedur durchgeführt wird?

Nein. D.h. ich bau mir jetzt ~35 Prozeduren …?

Schon mal ‚Select Case‘ statt ‚If‘ probiert?

Ja, das geht. Man kann scheinbar ein If und ein Select verschachteln. Nun hilft mir das select wenig weil ich auf unterschiedliche Variablen testen möchte.

Erzähl mal etwas über die Werte,
die die beiden geprüften Variablen annehmen können, eventuell
gibt es da eine andere Lösung, indem man die Werte erst
zusammenbringt und bei der Prüfung wieder auseinender rechnet.

Es gibt die Werte von 3100 bis 3200 und 1700 bis 1800. (Sowie eine weitere Variable von AAAA bis ZZZZ). Alle Kombinationen können auftretten (die Testdaten haben etwa 100 Kombinationen, die realen wahrscheinlich deutlich mehr). Alle Variablen sind in einer Tabelle als 4 Zeichen langer String gespeichert, die Tabelle liegt in einer DB.

-) Was mit einem ‚richtigen‘ VBA immer geht, ist Funktionen

mit VB6 zu programmieren, in ein OCX schreiben und das als
neues Steuerelement einfügen. Geht das wenigstens?

Da ist nur eine Texteingabe… von OCX weiss das Ding nix.

Ich lad die Datenbank jetzt in Postgres und mach das ganz in SQL, das geht schneller.

cu

Hi Pumpkin,

Ich lad die Datenbank jetzt in Postgres und mach das ganz in
SQL, das geht schneller.

wenn Du eine andere Lösung hast, hat sich das ja erledigt. Das ist sicher sinnvoller als zu ermitteln, was dieses VBA alles falsch macht und zu versuchen die Fehler zu umgehen.

Gruß, Rainer

Bist du sicher, dass es sich immer um Strings handelt?

versuche mal:

if cstr([OBJART]) = "3102" then 

Liebe Grüße
Alois

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]