Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

VBA Anpassung für Laufwerkmapping mit User und Passwort

Frage Entwicklung VB for Applications

Mitglied: skyacer

skyacer (Level 1) - Jetzt verbinden

10.05.2012 um 19:04 Uhr, 4483 Aufrufe, 14 Kommentare, 1 Danke

Hilfe bei VBA Anpassung für Laufwerkmapping mit User und Passwort

Hallo,

bin grade dabei mir ein Script anzupassen womit ich zu Hause mich mit meinem NAS verbinden kann ohne das jemand mein User bzw Password weiß.

Folgende Lösung funktioniert soweit bis auf die Ausgabe der Errorcodes falls welche auftreten. Ich find einfach nicht herraus was ich noch verändern muss damit diese richtig ausgegeben werden.
Dann würd ich auch gern noch statt das ich den User eingeben muss das ich ein Auswahlfeld habe wo ich den User auswählen kann. Könnte mir da auch jemand helfen?

Grüße Sky

01.
' Bei Fehlern Script weiterlaufen lassen 
02.
On Error Resume Next 
03.
 
04.
'-------------------------------------------------------------------- 
05.
' Netzlaufwerke f: bis z: trennen Asc(f)=102 ...Asc(z)=122 
06.
' ACHTUNG: auf Kleinschreibung bei Netzlaufwerken achten 
07.
'----------------------------------------------------------------- 
08.
Dim DelNetDrive 
09.
Set WshNet = CreateObject("WScript.Network") 
10.
 
11.
For DriveAsc = 105 To 122 
12.
On Error Resume Next 
13.
DelNetDrive = Chr(DriveAsc) & ":" 
14.
WshNet.RemoveNetworkDrive DelNetDrive, True, True  
15.
next 
16.
On Error Goto 0 
17.
 
18.
 
19.
 
20.
' Diese Funktion nutzt den IE zum erstellen eines Dialogfensters für Username und Password 
21.
   Dim objIE 
22.
   ' Erstellen einen IE Objektes 
23.
   Set objIE = CreateObject( "InternetExplorer.Application" ) 
24.
   ' Setzen der IE Einstellungen 
25.
   objIE.Navigate "about:blank" 
26.
   objIE.Document.Title = "Login Netzlaufwerke" 
27.
   objIE.ToolBar        = False 
28.
   objIE.StatusBar      = False 
29.
   objIE.Resizable      = False 
30.
   objIE.Width          = 400 
31.
   objIE.Height         = 300 
32.
   ' Zentrieren des Dialogfensters auf dem Desktop 
33.
   With objIE.Document.ParentWindow.Screen  
34.
       objIE.Left = (.AvailWidth  - objIE.Width ) \ 2 
35.
       objIE.Top  = (.Availheight - objIE.Height) \ 2 
36.
   End With 
37.
 
38.
    ' Erstellen des HTML-Codes für das Dialogfenster 
39.
    objIE.Document.Body.InnerHTML = "<DIV align='center'><P>" & myPrompt _ 
40.
                                & "</P>" & vbCrLf _ 
41.
                                & "<div align='center'><P>" & myMessage _ 
42.
                                & "</P>" & vbCrLf _ 
43.
	                            & "<P>User: <INPUT TYPE='input' SIZE= '20'" _ 
44.
                                & "ID='Username'/></P>" & vbCrLf _ 
45.
                                & "<P>Password: <INPUT TYPE='password' SIZE= '20'" _ 
46.
                                & "ID='Password'></P>" & vbCrLf _ 
47.
                                & "<P><INPUT TYPE='hidden' ID='OK'" _ 
48.
                                & "NAME='OK' VALUE='0'/></p>" _ 
49.
                                & "<INPUT TYPE='submit' VALUE='OK'" _ 
50.
                                & "OnClick='VBScript:OK.Value=1'/></P></DIV>" 
51.
 
52.
    ' Sichbarkeit des IE Fensters 
53.
    objIE.Visible = True 
54.
 
55.
    ' Warten bis der OK Button gedrückt wurde 
56.
    Do While 0 = objIE.Document.All.OK.Value 
57.
    	Wscript.Sleep 250 
58.
    Loop 
59.
 
60.
' Lesen des Username und Password vom Dialogfenster 
61.
getUsername  = objIE.Document.All.Username.Value 
62.
getPassword = objIE.Document.All.Password.Value 
63.
 
64.
 
65.
' Schließen des IE Scriptes 
66.
objIE.Quit 
67.
Set objIE = Nothing 
68.
 
69.
 
70.
 
71.
if getUsername = "user1" then 
72.
' Verbinden der Netzlaufwerke für user1 
73.
 
74.
Set WshNetwork = WScript.CreateObject("WScript.Network") 
75.
WshNetwork.MapNetworkDrive "w:", "\\homenas\verzeichnis 1", False, getUsername, getPassword  
76.
end if 
77.
 
78.
if getUsername = "user2" then 
79.
' Verbinden der Netzlaufwerke für user2 
80.
 
81.
Set WshNetwork = WScript.CreateObject("WScript.Network") 
82.
WshNetwork.MapNetworkDrive "t:", "\\homenas\verzeichnis 2", False, getUsername, getPassword  
83.
end if 
84.
 
85.
 
86.
 
87.
' Fehlerbehandlung 
88.
' Netzlaufwerke wurden verbunden 
89.
if Err = 0 then 
90.
msgbox "Netzlaufwerke wurden verbunden." 
91.
else 
92.
select case Err.Number 
93.
case -2147024843 
94.
' Netzlaufwerke konnte nicht verbunden werden 
95.
msgbox "Netzlaufwerke wurden nicht verbunden. Vielleicht ist das Ziel offline. Versuchen Sie es später nochmal" 
96.
' Anmeldung fehlgeschlagen: Username oder Password falsch 
97.
case -2147023570 
98.
msgbox "Netzlaufwerke wurden nicht verbunden: Username und/oder Password falsch." 
99.
' Anmeldung fehlgeschlagen: Password falsch 
100.
case -2147024810 
101.
msgbox "Netzlaufwerke wurden nicht verbunden: Password falsch." 
102.
' Netzlaufwerk konnte nicht verbunden werden: Netzlaufwerke schon verbunden 
103.
case -2147023677 
104.
msgbox "Netzlaufwerke sind schon verbunden." 
105.
' anderer Fehler 
106.
case else 
107.
msgbox "Teilen Sie den aufgetretenen Fehler dem Administrator mit: "& vbCrLf & vbCrLf & err.Number & vbCrLf & Err.Description 
108.
end select 
109.
end if 
110.
 
Mitglied: NetWolf
10.05.2012 um 20:21 Uhr
Moin Moin,

bei der Anweisung "On Error Resume Next" ist dir klar, was du dem Script sagst?
Ich übersetzte mal: Wenn ein Fehler auftritt mache einfach weiter, ohne den Fehler zu melden!

Auch die Anweisung läuft ins Leere: On Error Goto 0
Eine Sprungmarke mit 0 zu benennen ist nicht sinnvoll. Schlimmer noch, diese Sprungmarke gibt es gar nicht.

Alle Netzlaufwerke trennt man z.B. mit net use * /delete /yes (warum du das auch immer brauchst??)

Sorry, mir erschließt sich noch nicht der Sinn und Zweck des Scriptes. In Windows bist du mit Benutzername / Passwort angemeldet. Wenn du nun auf der NAS für diesen Benutzer entsprechende Rechte vergibst, kannst auch nur du an die entsprechenden Ordner.

Grüße aus Rostock
Wolfgang
(Netwolf)
Bitte warten ..
Mitglied: bastla
10.05.2012 um 23:03 Uhr
@NetWolf
Auch die Anweisung läuft ins Leere: On Error Goto 0
Das hat den Sinn, nach dem angesprochenen "On Error Resume Next" wieder auf Standardfehlerhandling (also Abbruch mit Ausgabe des Fehlers) umzuschalten: On Error-Anweisung (Visual Basic)
Alle Netzlaufwerke trennt man z.B. mit net use * /delete /yes
Grundsätzlich ja - aber deswegen eine Shell aufrufen? Die Zeilen ab 9 tun's ja auch ...

Grüße
bastla
Bitte warten ..
Mitglied: skyacer
11.05.2012 um 19:17 Uhr
Hi,

das ich die Abfrage extra nicht so gewählt habe das er den Loginnamen nimmt ist deshalb so, weil die Loginnamen der PC sich von denen der auf den Nas unterscheiden. Ausserdem möchte ich nicht das er sich beim Anmelden gleich mit den jeweiligen Laufwerken verbindet sondern ich vorher auswählen möchte mit welchen Login. Hat alles schon seinen Hintergrund.


Hab vorher eine Batch gehabt aber es hat mich schon immer gestört das ich darin den User und das Password hinterlegen musste. War also eine unschöne Lösung.

Wär also schön wenn mit trotzdem jemand dabei helfen könnte bzw. die Fehler mir mal zeigt. bin was Scripten angeht noch blutiger Anfänger.

Grüße
Bitte warten ..
Mitglied: mak-xxl
12.05.2012 um 09:27 Uhr
Moin skyacer,

bis auf die oben besprochenen 'On Error ...' gibt es im WSH keine weiteren Sprungmarken. Der Aufbau des Scriptes lässt vermuten, dass Dir so etwas wie 'Goto Fehlerbehandlung' vorschwebte (der Block am Ende) - ist aber leider nicht möglich.

Alternativen sind:

  • 'While'- oder 'Do Loop'-Schleifen mit Eingabeüberprüfung solange, bis korrekter Wert eingegeben wurde zur Verhinderung von Fehlern im weiteren Ablauf;
  • vor der vermutlich fehlererzeugenden Zeile die Fehlerausgabe ausschalten ('... Resume Next'), danach eine komplette Fehlerbehandlung einbauen und Fehlerausgabe wieder einschalten ('... Goto 0');
  • Fehlerausgabe generell ausschalten und ein extra Sub (oder Function, falls Rückgabewerte gewünscht) erstellen, in dem eine komplette Fehlerbehandlung erfolgt. Diese(s) nach all den Zeilen rufen ('Call Fehlerbehandlung'), die einen Fehler verursachen [könnten].

Letzteres ist auch gleichzeitig ein Paradebeispiel für wiederverwendbaren Code ...

Viel Erfolg und freundliche Grüße von der Insel - Mario
Bitte warten ..
Mitglied: skyacer
12.05.2012 um 13:20 Uhr
Alternativen sind:

  • 'While'- oder 'Do Loop'-Schleifen mit Eingabeüberprüfung solange, bis korrekter Wert
eingegeben wurde zur Verhinderung von Fehlern im weiteren Ablauf;
  • vor der vermutlich fehlererzeugenden Zeile die Fehlerausgabe ausschalten ('... Resume Next'), danach eine
komplette Fehlerbehandlung einbauen und Fehlerausgabe wieder einschalten ('... Goto 0');
  • Fehlerausgabe generell ausschalten und ein extra Sub (oder Function, falls Rückgabewerte gewünscht) erstellen, in dem
eine komplette Fehlerbehandlung erfolgt. Diese(s) nach all den Zeilen rufen ('Call Fehlerbehandlung'), die einen
Fehler verursachen [könnten].


Und genau das kann ich eben noch nicht. Bin schon froh das ich den Teil oben hinbekommen habe aus Teilstücken. Könnte mir sonst jemand eben sowas erstellen??

Grüße
Bitte warten ..
Mitglied: skyacer
14.05.2012 um 10:28 Uhr
Hi,

hab das jetzt erstmal so gelöst. So wie es ausschaut funktioniert es. Ich hab nur ein Problem festgestellt. Starte ich das Skript und gebe alles ordnungsgemäß ein verbindet er mit die Laufwerke alle. Starte ich das ganze jetzt nochmal und gebe nur den Usernamen ein ohne das Kennwort verbindet er mir die Laufwerke auch. Das soll aber nicht so sein. Was muss ich also ändern damit dies auch noch beseitigt wird.

Grüße
Sky

01.
 
02.
'-------------------------------------------------------------------- 
03.
' Netzlaufwerke f: bis z: trennen Asc(f)=102 ...Asc(z)=122 
04.
' ACHTUNG: auf Kleinschreibung bei Netzlaufwerken achten 
05.
'----------------------------------------------------------------- 
06.
Dim DelNetDrive 
07.
set WshNetwork = WScript.CreateObject("WScript.Network") 
08.
 
09.
For DriveAsc = 105 To 122 
10.
On Error Resume Next 
11.
DelNetDrive = Chr(DriveAsc) & ":" 
12.
 
13.
WshNetwork.RemoveNetworkDrive DelNetDrive, True, True  
14.
next 
15.
on error goto 0 
16.
 
17.
call IELogin ( getLoginName, getPassword)  
18.
 
19.
'Netzlaufwerke verbinden 
20.
On Error Resume Next 
21.
If getLoginName = "User1" then 
22.
'msgbox  "User: " & getLoginName & vbCrLf & "Password: " & getPassword 
23.
WshNetwork.MapNetworkDrive "k:", "\\homenas\1", False, getLoginName, getPassword 
24.
WshNetwork.MapNetworkDrive "l:", "\\homenas\2", False, getLoginName, getPassword 
25.
WshNetwork.MapNetworkDrive "m:", "\\homenas\3", False, getLoginName, getPassword 
26.
WshNetwork.MapNetworkDrive "n:", "\\homenas\4", False, getLoginName, getPassword 
27.
WshNetwork.MapNetworkDrive "o:", "\\homenas\5", False, getLoginName, getPassword 
28.
WshNetwork.MapNetworkDrive "p:", "\\homenas\6", False, getLoginName, getPassword 
29.
WshNetwork.MapNetworkDrive "q:", "\\homenas\7", False, getLoginName, getPassword 
30.
call error 
31.
 
32.
elseIf getLoginName = "User2" then 
33.
'msgbox  "User: " & getLoginName & vbCrLf & "Password: " & getPassword 
34.
WshNetwork.MapNetworkDrive "k:", "\\homenas\1", False, getLoginName, getPassword 
35.
WshNetwork.MapNetworkDrive "l:", "\\homenas\2", False, getLoginName, getPassword 
36.
WshNetwork.MapNetworkDrive "m:", "\\homenas\3", False, getLoginName, getPassword 
37.
WshNetwork.MapNetworkDrive "o:", "\\homenas\4", False, getLoginName, getPassword 
38.
WshNetwork.MapNetworkDrive "p:", "\\homenas\5", False, getLoginName, getPassword 
39.
call error 
40.
 
41.
else  
42.
msgbox "Netzlaufwerke wurden nicht verbunden: Username falsch oder nicht eingegeben" 
43.
End If 
44.
On Error Goto 0 
45.
 
46.
 
47.
Function IELogin( getLoginName, getPassword)  
48.
    Dim objIE 
49.
    ' Create an IE object 
50.
    Set objIE = CreateObject( "InternetExplorer.Application" ) 
51.
    ' specify some of the IE window's settings 
52.
    objIE.Navigate "about:blank" 
53.
    objIE.Document.Title = "NetworkLogin" & String( 100, "." ) 
54.
    objIE.ToolBar        = False 
55.
    objIE.Resizable      = False 
56.
    objIE.StatusBar      = False 
57.
    objIE.Width          = 300 
58.
    objIE.Height         = 200 
59.
    ' Center the dialog window on the screen 
60.
    With objIE.Document.ParentWindow.Screen 
61.
        objIE.Left = (.AvailWidth  - objIE.Width ) \ 2 
62.
        objIE.Top  = (.Availheight - objIE.Height) \ 2 
63.
    End With 
64.
    ' Wait till IE is ready 
65.
    Do While objIE.Busy 
66.
        WScript.Sleep 200 
67.
    Loop 
68.
    ' Insert the HTML code to prompt for user input 
69.
    objIE.Document.Body.InnerHTML = "<div align=""left"">" & vbcrlf _ 
70.
                                  & "<table cellspacing=""5""><tr nowrap>" _ 
71.
                                  & "<td>Username:</td><td>" _ 
72.
                                  & "<input type=""text"" size=""20"" " _ 
73.
                                  & "autocomplete=""off"" " _ 
74.
                                  & "id=""LoginName""></td></tr>" & vbcrlf _ 
75.
                                  & "<tr nowrap><td>Password:</td>" _ 
76.
                                  & "<td><input type=""password"" size=""21"" " _ 
77.
                                  & "id=""Password""></td>" & vbcrlf _ 
78.
                                  & "</tr></div></table>" & vbcrlf _ 
79.
                                  & "<div align=""center""><p><input type=""hidden"" id=""OK"" " _ 
80.
                                  & "name=""OK"" value=""0""> " _ 
81.
                                  & "<input type=""submit"" value="" OK "" " _ 
82.
								  & "onClick=""VBScript:OK.Value=1""> "_  
83.
								  & "<input type=""hidden"" id=""Beenden"" name=""Beenden"" value=""0"">" _ 
84.
								  & "<input type='submit' value='Beenden' onClick=""VBScript:Beenden.Value=2""></p></div>" 
85.
    ' Hide the scrollbars 
86.
    objIE.Document.Body.Style.overflow = "visible" 
87.
    ' Make the window visible 
88.
    objIE.Visible = True 
89.
    ' Set focus on input field 
90.
    objIE.Document.All.LoginName.Focus 
91.
	 
92.
	' Wait till the OK button has been clicked 
93.
    On Error Resume Next 
94.
    Do While objIE.Document.All.OK.Value = 0 and objIE.Document.All.Beenden.Value = 0 
95.
        WScript.Sleep 200 
96.
		If Err or objIE.Document.All.Beenden.Value = 2 Then    'user clicked red X (or alt-F4) to close IE window 
97.
             objIE.Quit 
98.
			 WScript.Quit 
99.
            Set objIE = Nothing 
100.
            Exit Function 
101.
			     End if 
102.
    Loop 
103.
    On Error Goto 0 
104.
	  
105.
		     
106.
    ' Read the user input from the dialog window 
107.
   	getLoginName = objIE.Document.All.LoginName.Value 
108.
	getPassword = objIE.Document.All.Password.Value 
109.
	 
110.
	 
111.
	' Close and release the object 
112.
    objIE.Quit 
113.
    Set objIE = Nothing 
114.
	 
115.
	 
116.
End Function 
117.
 
118.
Function error 
119.
if Err =  0 then 
120.
msgbox "Netzlaufwerke wurden verbunden." 
121.
else 
122.
select case Err.Number 
123.
case -2147024843 
124.
' Netzlaufwerke konnte nicht verbunden werden 
125.
msgbox "Netzlaufwerke wurden nicht verbunden. Vielleicht ist das Ziel offline. Versuchen Sie es später nochmal" 
126.
' Anmeldung fehlgeschlagen: Username oder Password falsch 
127.
case -2147023570 
128.
msgbox "Netzlaufwerke wurden nicht verbunden: Username und/oder Password falsch." 
129.
' Anmeldung fehlgeschlagen: Password falsch 
130.
case -2147024810 
131.
msgbox "Netzlaufwerke wurden nicht verbunden: Password falsch." 
132.
' Netzlaufwerk konnte nicht verbunden werden: Netzlaufwerke schon verbunden 
133.
case -2147024811 
134.
msgbox "Netzlaufwerke sind schon verbunden." 
135.
' anderer Fehler 
136.
case else 
137.
msgbox "Teilen Sie den aufgetretenen Fehler dem Administrator mit: "& vbCrLf & vbCrLf & err.Number & vbCrLf & Err.Description 
138.
end select 
139.
end if 
140.
End Function
Bitte warten ..
Mitglied: mak-xxl
14.05.2012 um 20:25 Uhr
Moin skyacer,

um zu überprüfen, dass hier nicht das gespeicherte Passwort vom IE weitergereicht wird, solltest Du selbiges testweise einmal löschen - ist es an dem, müsstest Du evtl. von dieser Eingabemaske abrücken oder getPassword bei Neuaufruf entladen (leeren). Als dauerhafte Lösung wäre eine Speicherung der ersten Ausführung des Scriptes in der aktuellen Sitzung in einer Umgebungsvariablen möglich, die, jedesmal abgefragt vom Script, zu der Entscheidung herangezogen werden kann, das Passwort erneut abzufragen oder neu zu verbinden oder die Verbindungen zu prüfen oder was auch immer.

Als 1. Tipp sei noch vermerkt, eigene Funktionen/Subs nicht so zu benennen wie reservierte Wörter der Programmierumgebung (i.e. 'error').
Der 2. Tipp betrifft das Rufen der Fehlerbehandlung (i.e. in Zeile 30):
- wenn die Zeile 28 einen Fehler verursacht, weil z.B. der verwendete Laufwerksbuchstabe nicht frei ist und
- wenn danach Zeile 29 einen Fehler verursacht, weil z.B. die verwendete Freigabe nicht erreichbar ist
wird, wenn mit Zeile 30 die Auswertung des Fehlers erfolgen soll, nur der letzte Fehler (i.e. Err.Number) behandelt werden, der vorhergehende wurde 'überschrieben'.
Ergo: Hinter jeder Zeile, die potentiell Fehler verursachen kann, wird die Fehlebehandlungsroutine gerufen! Damit aber nicht jedesmal die komplette Prüfung erfolgt, wird das nur getan, wenn ein Fehler aufgetreten ist, etwa so:

If Err.Number <> 0 Then Call ErrorHandler
Freundliche Grüße von der Insel - Mario
Bitte warten ..
Mitglied: skyacer
14.05.2012 um 22:40 Uhr
Danke erstmal für deine Hilfe/Anmerkungen. Könntest du mir dabei helfen bzw die entsprechenden zeilen eben umändern? Ich bin schon froh das ich das ohne große Probleme gelöst bekommen habe.

um zu überprüfen, dass hier nicht das gespeicherte Passwort vom IE weitergereicht wird, solltest Du selbiges testweise
einmal löschen - ist es an dem, müsstest Du evtl. von dieser Eingabemaske abrücken oder getPassword bei
Neuaufruf entladen (leeren). Als dauerhafte Lösung wäre eine Speicherung der ersten Ausführung des Scriptes in der
aktuellen Sitzung in einer Umgebungsvariablen möglich, die, jedesmal abgefragt vom Script, zu der Entscheidung herangezogen
werden kann, das Passwort erneut abzufragen oder neu zu verbinden oder die Verbindungen zu prüfen oder was auch immer.

Und wie um alles in der Welt entlade ich "getPassword" ?

Als 1. Tipp sei noch vermerkt, eigene Funktionen/Subs nicht so zu benennen wie reservierte Wörter der Programmierumgebung
(i.e. 'error').
Der 2. Tipp betrifft das Rufen der Fehlerbehandlung (i.e. in Zeile 30):
- wenn die Zeile 28 einen Fehler verursacht, weil z.B. der verwendete Laufwerksbuchstabe nicht frei ist und
- wenn danach Zeile 29 einen Fehler verursacht, weil z.B. die verwendete Freigabe nicht erreichbar ist
wird, wenn mit Zeile 30 die Auswertung des Fehlers erfolgen soll, nur der letzte Fehler (i.e. Err.Number) behandelt werden, der
vorhergehende wurde 'überschrieben'.
Ergo: Hinter jeder Zeile, die potentiell Fehler verursachen kann, wird die Fehlebehandlungsroutine gerufen! Damit aber nicht
jedesmal die komplette Prüfung erfolgt, wird das nur getan, wenn ein Fehler aufgetreten ist, etwa so:

If Err.Number <> 0 Then Call ErrorHandler

Das werd ich dann auch gleich mal so umsetzen.

Grüße Sky
Bitte warten ..
Mitglied: mak-xxl
15.05.2012 um 07:41 Uhr
Moin skyacer,


Zitat von skyacer:
Und wie um alles in der Welt entlade ich "getPassword" ?

Zum Beispiel, in dem Du Zeile 108 nicht ausführst oder einen leeren Wert übergibst:

getPassword = "" 
getPassword = Empty 
' getPassword = ...
Freundliche Grüße von der Insel - Mario
Bitte warten ..
Mitglied: skyacer
15.05.2012 um 08:30 Uhr
Okay das Klingt einleuchtend. Aber das Problem ist ja dann das ich ja keine Übergabe des Passwortes mehr habe, ergo würde er auch keine Laufwerke verbinden. Also ist das nicht die optimalste Lösung.

Dann hab ich da noch eine Frage:
Wenn ich den Fehlerhändler hinter jede Zeile Beim Laufwerksverbinden einsetze würde ich ja bei jedem Fehler jeweils ein Fenster bekommen. Gibt es die Möglichkeit das der/die Fehler dann nur zum Schluss gebündelt in einem Fenster angezeigt werden?

Grüße
Bitte warten ..
Mitglied: mak-xxl
15.05.2012 um 14:10 Uhr
Moin skyacer,

Zitat von skyacer:
Okay das Klingt einleuchtend. Aber das Problem ist ja dann das ich ja keine Übergabe des Passwortes mehr habe, ergo
würde er auch keine Laufwerke verbinden. Also ist das nicht die optimalste Lösung.

Was das Wort 'testweise' bedeutet ist aber klar? Ich dachte schon, Du wolltest eine Ursache finden ...

Wenn ich den Fehlerhändler hinter jede Zeile Beim Laufwerksverbinden einsetze würde ich ja bei jedem Fehler jeweils ein
Fenster bekommen. Gibt es die Möglichkeit das der/die Fehler dann nur zum Schluss gebündelt in einem Fenster angezeigt werden?

Wenn sich die Frage nach der Sinnfälligkeit solchen Tuns nicht stellt, kannst Du ein Array mit Fehlernummern (und dann aber auch Beschreibungen der verursachenden Zeile) erzeugen und je Zeile mit evtl. aufgetretenen Fehlern beladen lassen - das Ganze wertest Du zum Schluss aus.

Freundliche Grüße von der Insel - Mario
Bitte warten ..
Mitglied: skyacer
16.05.2012 um 08:17 Uhr
Hi,

deswegen fragte ich ja auch schon des öfteren wer mir dabei helfen könnte dies umzusetzen. Wenn ich wüsste wie man das macht würde ich ja nicht fragen ob mir jemand unter die Arme greifen könnte.

Könntest du mir nicht sonst mal das Skript oben eben umsetzen mit den Punkten die wir in den letzten 2-3 Threads besprochen hatte. Dann können wir das Thema auch endlich abschließen hier.

Danke und Grüße Sky
Bitte warten ..
Mitglied: mak-xxl
16.05.2012 um 12:45 Uhr
Moin skyacer,

bis jetzt hast Du mehrmals nach einer Detailänderung und Vorschlägen zur Abhilfe eines Fehlers gefragt - und genau das hast Du jedesmal bekommen.
Eine Lösung, die das Sammeln von Fehlern vornimmt, ist nicht besonders sinnvoll, da der Anwender dann auch nichts mehr ändern kann - besser ist hier, den ganzen Scriptablauf so anzupassen, dass potentielle Fehler abgefangen werden. Beispiele wären die Prüfung auf Erreichbarkeit einer Freigabe oder die Prüfung auf Verfügbarkeit eines Laufwerksbuchstabens etc.

Wenn die Fehler gesammelt werden sollen, dann etwa so:
Dim ErrArr(), i 
Redim ErrArr(0)                                     ' beides an den Anfang des Scriptes
Nach jeder potentiell fehlererzeugenden Zeile folgenden Code einfügen:
If Err.Number <> 0 Then 
    ErrArr(Ubound(ErrArr, 1)) = Err.Number          ' Err.Number speichern 
    Redim Preserve ErrArr(Ubound(ErrArr, 1) + 1)    ' neuen Platz im Array schaffen 
End If
An das Ende des Main-Blocks (Zeile 45/46) folgenden Block setzen:
For i = 0 to Ubound(ErrArr, 1) - 1                  ' -1 wg. letztem (unnötigen) Redim) 
    Call ErrorHandler(ErrArr(i)) 
Next
Zeile 118 ändern in
Function ErrorHandler(ByRef FehlerNummer)           ' Fkt. bekommt bei Aufruf Wert übergeben
Zeile 119 ändern in
If FehlerNummer = 0 Then
Zeile 122 ändern in
Select Case FehlerNummer
Zeile 127 (Err.Description) wird nur die letzte Fehlerbeschreibung auswerfen (sie obigen Post), um das zu korrigieren, müsstest Du mehrere Arrays dimensionieren (da Preserve nur die höchste Dimension ändern kann) und diese entsprechend füllen und übergeben - diesen (absurden) Aufwand hast Du aber nicht, wenn Du nach jedem Fehler die Fehlerbehandlung aufrufst (siehe weiter oben gemachte Aussagen).

Freundliche Grüße von der Insel - Mario
Bitte warten ..
Mitglied: bastla
16.05.2012 um 21:01 Uhr
@Mario
Als Alternative zu den Arrays böte sich aber auch einfach je ein String mit Delimitern an (bei Bedarf ließen sich per "Split()") daraus auch nachträglich wieder Arrays machen) - allerdings finde ich das Ansinnen selbst auch nur bedingt sinnvoll ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows Server
User-ID zu Application Crash

Frage von pablovic zum Thema Windows Server ...

VB for Applications
gelöst VBA-Makro verschwindet nach Speichern (5)

Frage von lupi1989 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...