525 Aufrufe
Gefragt in Tabellenkalkulation von peko Mitglied (235 Punkte)
Hallo alle,

gewaltiges Problem!

Eine Funktion in VBA wird von einem Makro ausgeführt, von einem anderen aber nicht!

Ich habe in VBA programmiert:

Function dv(dn As String) As Boolean
Application.Volatile
dv = False
If Len(dn) > 0 Then
dv = (Dir(dn) <> "")
End If
End Function

Sub TestA()
Dim b As Boolean, dp, datei, dname As String
dp = ActiveWorkbook.Path
For i = 4 To nr
datei = Cells(i, 2)
dname = dp & "\" & datei & ".xls"
b = dv(dname)
If b = True Then GoTo weiter


'weiterer Code

'weiterer Code


weiter:
Next i
End Sub

Sub TestB()
Dim b As Boolean, dp, datei, dname As String
dp = ActiveWorkbook.Path
For i = 4 To nr
datei = Cells(i, 2)
dname = dp & "\" & datei & ".xls"
b = dv(dname)
If b = False Then GoTo weiter


'weiterer Code

'weiterer Code


weiter:
Next i
End Sub


In TestA läuft alles richtig. In TestB wird zu VBA gesprungen und folgende Meldung erscheint:

Fehler beim Kompilieren:
Argumenttyp ByRef unverträglich

Kann jemand helfen?

Liebe Grüße
Peter

4 Antworten

0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi Peter :-)

Deine Variablen Deklaration ist unzureichend

Gruss nighty

Für Amatuere heisst es !

1.Jede Variable in einer Zeile deklarieren.
2.Jeder Variable explizit einen Datentyp zuweisen.
3.Variablen nicht wie in anderen Sprachen mit Komma trennen

gruss nighty
0 Punkte
Beantwortet von
Ich stimme Nighty zu. Wenn du schon Variablen deklarierst, dann
solltest du das auch für Alle Variablen durchziehen. Aber es müsste
auch so gehen. Allerdings muss ich blind sein, denn ich kann keinen
wesentlichen Unterschied zwischen TestA und TestB erkennen. Nach
meiner Einschätzung dürften beide NICHT funktionieren. Da der
Variable nr kein Wert zugewiesen ist, zählst du von 4 nach 0 wodurch
die gesamte Schleife nicht ausgeführt wird. Falls du rückwärts zählen
willst solltest du For i = 4 To nr Step -1 verwenden.
0 Punkte
Beantwortet von
Hab grad doch nochmal getestet. Ich nahm an, dass die teilweise
fehlende Deklaration kein Problem ist, da der Typ String ja durch
ActiveWorkbook.Path zugewiesen wird. Dummerweise prüft der
Debugger schon vorher, ob alles passt. Soll heißen
Variablendeklaration nur entweder ganz oder gar nicht. Mach "dp as
string" oder nimm "as string" hinter dn weg. Letzteres würde ich dir
aber nicht empfehlen, da das zu neuen Bugs führen kann.

Fazit: Nighty hatte mal wieder - wie fast immer - richtig gelegen.
Allerdings betrifft auch dieses Problem beide Varianten.
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
Hi all :-)
Ein Beispiel aus dem Netz zur Verdeutlichung !
Gruss Nighty
Private Sub Form_Load()
Dim s, s2 As String
Dim b As Boolean
s = "Gurke"
s2 = "nsaft!"
b = False
Call n(s, s2, b)
MsgBox (b)
MsgBox (s)
End Sub

Private Sub n(s As String, s2 As String, b As Boolean)
s = s & s2
b = True
End Sub


Der Fehler tritt hierbei in folgender Zeile auf:
Call n(s, s2, b)

Was ist die Ursache für diesen Fehler?
Die Variable s wurde in der Zeile zusammen mit s2 vermeindlich als String deklariert:
Dim s, s2 As String

Somit sollte die Parameter-Übergabe an die Prozedur n aber doch verträglich sein.
Ändert man nun die Deklarationszeile von s wie folgt...
Dim s As String
Dim s2 As String

... funktioniert der Code.
Grund hierfür ist, dass VB alle Variablen, die nicht explizit mit einem bestimmten Datentyp deklariert wurden, als Variant deklariert!
D.h.: VB "liest" folgende Deklarationszeile...
Dim s, s2 As String

...wie folgt:
Dim s As Variant, s2 As String

Fazit:
Am besten man deklariert immer jede Variable in einer eigenen Zeile, so dass man erst gar nicht auf die Idee kommt, mehrere Variablen des gleichen Datentyps einfach durch Komma und ohne explizite Datentyp-Angabe zu deklarieren!
...