Workbooks.open - Übergabeparameter ändet sich

Hallo again, i scho wieda

bin grad mal wieder auf was gestoßen, das mich sehr erschüttert hat. habe folgenden code gebaut um aus einem excel sheet dessen überschriftszeile auszulesen, egal ob dieses geöffnet oder geschlossen ist:

Public Function HeaderArray(sDirName As String, ByVal sFileName As String, sTableName As String) As String()

'Debug.Print „TableWorkbench/HeaderArray started“

Dim i As Integer

Dim bCloseable As Boolean

bCloseable = False

If bFileExists(sDirName, sFileName) Then
If bFileAlreadyOpen(sDirName, sFileName) = False Then
Workbooks.Open fileName:=sDirName + sFileName
bCloseable = True
Else
Workbooks(sFileName).Activate
End If

so funktioniert der code, aber:

das Problem liegt am Parameter sFileName. wenn ich diesen nicht explizit per ByVal übergebe, dann springt der enthaltene Wert nach der anweisung Workbooks.Open fileName:=sDirName + sFileName auf einen Dateienamen den ich irgendwann zuvor im code mal eingelesen hab (in einem anderen modul).
habs auch schon probiert, das „+“ durch „&“ zu ersetzen, hilft nix.
ich kenn den unterschied zwischen ByVal und ByRef, aber solange ich am übergabeparameter nicht wirklich etwas ändere sondern nur auslese dürfte sich dieser doch ned plötzlich ändern. (bCloseable ist nur ne randerscheinung, damit klar ist, ob die datei nach abarbeiten der function geschlossen werden darf oder eben ned)

merci schonmal wieder für die unterstützung!

Hi,

ein Schuß ins blaue: fehlt beim Auslesen des Pfades der abschließende Backslash (also der letzte vor dem Dateinamen)?

M.

ein Schuß ins blaue: fehlt beim Auslesen des Pfades der
abschließende Backslash (also der letzte vor dem Dateinamen)?

die datei wird geöffnet, das is ned mein prob

die übergabe des parameters is bereits abgesichert (wenn der \ fehlt, dann häng hinten dran, sonst ned)

ausserdem würde das keine änderung von sFileName berechtigen nachdem die datei geöffnet wurde und das prob dürfte sich nicht per ByVal lösen lassen.

so wie mein code jetzt da steht funzt er, wenn das ByVal fehlt funzt es auch, aber sFileName ändert sich nach dem beschriebenen schritt

Hallo Mole,

Public Function HeaderArray(sDirName As String, ByVal

benutze bitte nicht prehtml sondern den pre-Tag.
Da kommen dann manchmal auch die lästigen Leerzeilen aber er ist besser als prehtml.

so funktioniert der code,

ich sehe da keinen Code, ich sehe ein Codeschnipsel.
D.h. ich kann nicht wissen wie der Restcode aussieht UND nicht erkennen ob da schon ggfs. der Fehler woanderst steckt.

Zeige bitte komplett eigenständig laufenden Code,
so in etwa:

Sub Test()
Msgbox HeaderArray(„C:\test“,…,…)
End Sub

Von dem was du da in anderen Modulen machst oder nicht hab ich nix.

habs auch schon probiert, das „+“ durch „&“ zu ersetzen, hilft
nix.

Das Verknüfungszeichen von Strings ist das &.
Das Excel manchmal mitdenkt und manchmal das + zuläßt
ist m.E. ein Fehler.

ich kenn den unterschied zwischen ByVal und ByRef,

Sicher? Ich glaub dir das nicht. Nichts schlimmes, ich dachte früher
auch mir ist das klar. Aber…
Dan Appleman ist der Ober-Guru von API-Funktionen.
Hier in diesem Link
http://books.google.de/books?id=5GhiwgFDdHYC&pg=PT18…

wird sein „Guide“ erwähnt, das Buch habe ich (ich habe nur 4 Vba-Bücher), naja, in Deutsch wäre mir das viel lieber und noch kostbarer. M.E. für API-Interessierte ein Muß das zu kaufen, naja englisch ist da sehr hilfreich.

Aber ich habe auch sein Puzzle-Buch.
Und seine Bücher richten sich an erfahrene VBa-Programmiere.
Vielleicht grad deshalb widmet er in dem Puzzle-Buch ein ganzes
Kapitel (von nur 3-5) dem Thema ByVal und ByRef!
Und das für seine potentiellen Buchkäufer, also Vba-Erfahrene!

Seitdem schmökern darin bin ich äußerst skeptisch wenn jmd. sagt Byval und ByRef wäre ihm völlig klar. Mich eingeschlossen.

Gruß
Reinhard

so funktioniert der code,

ich sehe da keinen Code, ich sehe ein Codeschnipsel.
D.h. ich kann nicht wissen wie der Restcode aussieht UND nicht
erkennen ob da schon ggfs. der Fehler woanderst steckt.
Von dem was du da in anderen Modulen machst oder nicht hab ich
nix.

völlig egal was in anderen modulen oder im rest des cods läuft.
das problem ist nicht die funktionalität des codes sondern der fehler in einer variable und in exakt einer einzigen codezeile. wenn es sich nur durch testen und nicht durch schlussfolgerung lösen lässt, dann hat sich das erledigt. kann den ganzen code wie an anderer stelle bereits erwähnt nicht hochladen.

Worbook.open - sFileName ist korrekt
Workbook wird korrekt geöffnet
folgezeile sFileName ist geändert

ich kenn den unterschied zwischen ByVal und ByRef,

Sicher? Ich glaub dir das nicht. Nichts schlimmes, ich dachte
früher
auch mir ist das klar. Aber…

danke für die empfehlung! werd ich auf jeden flal mal reinschaun.

aber selbst wenn ich den unterschied nicht kenne, solange ich eine variable ausschließlich auslese darf sie sich nicht verändern. und das tue ich ja mit workbook.open.
baref (standardwert) übergibt der methode die referenz also die adresse der variablen. änderungen an der variable in der aufgefufenen methode ändern die variable an sich. byval übergibt den wert ohne bezug zur variable (die dadurch unberührt bleibt). veränderungen an der variable betreffen nur die aufgerufene methode.
aber byval und byref sind ja nicht mal das problem. sie sind zwar die lösung, aber nicht die fragestellung.

die änderung darf an der stelle nicht stattfinden, egal ob byref oder byval.

auch hier, kann geschlossen werden

Hallo Mole,

kann es vlt. sein das du eine Variable mit dem selbigen Namen irgendwo schon einmal definiert hast?

By the Way … In einer Function / Sub kann man egal ob Byref oder Byval einen Wert permanent ändern, sofern es keine prmitiven Datentypen sind :wink:

MfG Alex