brave71
Goto Top

String aus Excelzelle für Datei aus Netzwerk verwenden

Hallo ins Forum,
die Spezialisten sind gefragt.
Ich suche Hilfe zu dieser Problemstellung:
Ich habe eine Excel Datei mit 8 Spalten und beliebig vielen Zeilen.
Die erste Zeile ist die Deklaration der Spalten wobei die erste Spalte also A1 der Artikel ist nach dem gesucht wird. Gesucht wird der Artikel durch ab scannen eines Barcodes (Inputbox). Die nachfolgenden Spalten also B1 bis H1 (in Excel Datei 1 bis Datei 7 benannt sind Dateinamen) können in der jeweiligen Zeile einen Wert haben oder auch leer sein. Der String in der jeweiligen Zelle ist der Name einer Pdf- oder Worddatei die später über Netzwerk geöffnet werden soll.
Ich brauche nun also wenn der Artikel in der Liste gefunden wurde, die einzelnen Zellen aus der Zeile als Variable um diese dann in den Netzwerkaufruf zur Datei einbinden zu können.
Als csv Datei ist das wohl auch realisierbar, ich möchte aber direkt mit der Exceldatei arbeiten.
Hab vorher noch nichts mit VBS gemacht und gerade angefangen mich ins Thema einzulesen. Was ich bisher habe funktioniert mal soweit das der eingescannte Artikel gefunden wird. Wie ich jetzt aber den Bezug zu den weiteren Zellen/Spalten herstellen soll daran scheitere ich. (doch eher ein Readline?)
Ich will vor allem auch verstehen was wann im Script passiert deswegen ist entsprechend einiges aus kommentiert. Ich hoffe es gibt hier die Profis die es mir nahe bringen und weiterhelfen können.
Hoffe mal es ist einigermaßen Verständlich formuliert.
Hier mal mein bisheriger Ansatz:
Option Explicit
Rem == Deklaration der Variablen										 

Dim barcode, oWorkbook, oExcel, oSheet, arWerte, oWertGefunden, Dokument(8) 
Dokument(0) = "Artikel"  
Dokument(1) = "Datei1"  
Dokument(2) = "Datei2"   
Dokument(3) = "Datei3"   
Dokument(4) = "Datei4"   
Dokument(5) = "Datei5"   
Dokument(6) = "Datei6"  
Dokument(7) = "Datei7"   

Const ForReading = 1

Rem == Initialisiere Excel Datei Tabellenblatt                                                          ==

Set oExcel 	= CreateObject("Excel.Application")  
Set oWorkbook 	= oExcel.Workbooks.Add("C:\test.xlsx")  
Set oSheet	= oWorkbook.Sheets(1)

REM Excel Tabelle mit True anzeigen  									 ==

oExcel.Visible = FALSE												

Rem == Inputbox zum Barcode scannen aufrufen							 ==

barcode=InputBox ("Bitte Barcode abscannen:")  

rem WScript.Echo ("eingescannter Barcode:") , barcode  

'Array mit Suchwert, die in der Tabelle gesucht werden:  
arWerte = Array(barcode)
rem wscript.echo 
'In der Schleife ein Aufruf der Suchfunktion für jeden Wert im Array  
FOR barcode = 0 To UBound(arWerte)
	fWertSuchen(arWerte(barcode))
NEXT

Function fWertSuchen(strWert)
'On Error Resume Next  
Err.Clear

Set oWertGefunden = oSheet.Columns(1).Find(strWert)

Rem == Ausgabe Artikel gefunden ja/nein			                                              ==

IF oWertGefunden Is Nothing Then
	fWertSuchen = FALSE
	wscript.echo " nicht gefunden " & strWert  
ELSE
	fWertSuchen = TRUE
	wscript.echo "gefunden " & strWert  
END IF

End Function

oExcel.Quit
Kommentar vom Moderator tomolpi am Nov 05, 2019 um 09:45:44 Uhr
Code-Tags hinzugefügt

Content-Key: 511790

Url: https://administrator.de/contentid/511790

Printed on: April 19, 2024 at 01:04 o'clock

Member: SlainteMhath
SlainteMhath Nov 05, 2019 at 09:35:33 (UTC)
Goto Top
Moin,

verwende doch bitte mal code-tags, dann kann ich dir auch sagen, ab welcher Zeile dein VBA wirr wird face-smile

lg,
Slainte
Member: tomolpi
Solution tomolpi Nov 05, 2019 at 09:46:31 (UTC)
Goto Top
Zitat von @SlainteMhath:

Moin,

verwende doch bitte mal code-tags, dann kann ich dir auch sagen, ab welcher Zeile dein VBA wirr wird face-smile

lg,
Slainte
Habe ich eben mal korrigiert, siehe Moderationskommentar.

LG
tomolpi
Mitglied: 141575
141575 Nov 05, 2019 updated at 11:06:11 (UTC)
Goto Top
Wie ich jetzt aber den Bezug zu den weiteren Zellen/Spalten herstellen soll daran scheitere ich.
strWertSpalteB = oWertGefunden.Offset(0,1).Value
strWertSpalteC = oWertGefunden.Offset(0,2).Value
'usw.  
Es geht auch
strWertSpalteB = oSheet.Cells(oWertGefunden.Row,"B").Value  
strWertSpalteC = oSheet.Cells(oWertGefunden.Row,"C").Value  
Member: Brave71
Brave71 Nov 05, 2019 updated at 11:35:57 (UTC)
Goto Top
Option Explicit
Rem =======================================================================
Rem == Deklaration der Variablen										 ==
Rem =======================================================================
Dim barcode, oWorkbook, oExcel, oSheet, arWerte, oWertGefunden, Dokument(8) 
Dokument(0) = "Artikel"  
Dokument(1) = "Datei1"  
Dokument(2) = "Datei2"   
Dokument(3) = "Datei3"   
Dokument(4) = "Datei4"   
Dokument(5) = "Datei5"   
Dokument(6) = "Datei6"  
Dokument(7) = "Datei7"   

Const ForReading = 1

Rem =======================================================================
Rem == Initialisiere Excel Datei Tabellenblatt                           ==
Rem =======================================================================
Set oExcel 	= CreateObject("Excel.Application")  
Set oWorkbook 	= oExcel.Workbooks.Add("C:\test.xlsx")  
Set oSheet	= oWorkbook.Sheets(1)

Rem =======================================================================
REM Excel Tabelle mit True anzeigen  									 ==
Rem =======================================================================
oExcel.Visible = FALSE												

Rem =======================================================================
Rem == Inputbox zum Barcode scannen aufrufen							 ==
Rem =======================================================================
barcode=InputBox ("Bitte Barcode abscannen:")  

rem WScript.Echo ("eingescannter Barcode:") , barcode  


'Array mit Suchwerten, die in der Tabelle gesucht werden:  
arWerte = Array(barcode)
rem wscript.echo 
'In der Schleife ein Aufruf der Suchfunktion für jeden Wert im Array  
FOR barcode = 0 To UBound(arWerte)
	fWertSuchen(arWerte(barcode))
NEXT

Function fWertSuchen(strWert)
'On Error Resume Next  
Err.Clear

Set oWertGefunden = oSheet.Columns(1).Find(strWert)
Rem =======================================================================
Rem == Ausgabe Artikel gefunden ja/nein			                         ==
Rem =======================================================================
IF oWertGefunden Is Nothing Then
	fWertSuchen = FALSE
	wscript.echo " nicht gefunden " & strWert  
ELSE
	fWertSuchen = TRUE
	wscript.echo "gefunden " & strWert  
END IF

End Function

oExcel.Quit
Member: Brave71
Brave71 Nov 05, 2019 at 11:08:02 (UTC)
Goto Top
Hallo sorry jetzt war ich zu schnell...
Member: Brave71
Brave71 Nov 05, 2019 at 11:21:49 (UTC)
Goto Top
So passt es jetzt besser?
Member: Brave71
Brave71 Nov 06, 2019 at 07:45:30 (UTC)
Goto Top
Die Aufgabe ist nicht gelöst, kann man den Status wieder ändern?
Mitglied: 141575
141575 Nov 06, 2019 updated at 08:19:47 (UTC)
Goto Top
Zitat von @Brave71:

Die Aufgabe ist nicht gelöst, kann man den Status wieder ändern?
Ja. Steht in der Hilfe!
Aber bitte lies doch mal meinen Kommentar!! Da steht die Lösung zu deiner Frage, sogar zwei mögliche.
Member: Brave71
Brave71 Nov 07, 2019 at 11:51:53 (UTC)
Goto Top
Hallo,
danke erst mal für deinen Beitrag.
Funktioniert soweit mal solange ein Wert gefunden wird, bei falschen Wert kommt es zur Fehlermeldung "Objekt erforderlich oWerteGefunden"
Ich denke da brauche ich vorher nochmal eine IF Abfrage.... mit dem Ansatz versuche ich mich dran.
Member: Brave71
Brave71 Nov 12, 2019 at 12:09:27 (UTC)
Goto Top
Hallo,

ich hab mein Script umgeschrieben und bis dahin funktioniert auch alles wie erwartet.
Nun will ich die entsprechenden Dateien die auf dem Netzwerk liegen öffnen. Die Netzwerkpfade sind mit Rechnerstart bereits gemountet.
Das Programm z.B. Adobe Reader wird aber ja lokal aufgerufen, was ich mit dem Eintrag auch funktioniert.
If strWertSoka = "" Then  
   wscript.echo  " leer"   
Else  fWertSuchen = TRUE
Set WsShell = WScript.CreateObject("WScript.Shell")  
wsShell.run """C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe"""   
End IF

wie muss der Eintrag für die Datei auf dem Netz aussehen, einfach anhängen in Form von "\\Servername\Ordner\strWertVariable" geht ja wohl nicht.
Member: goRaini
goRaini Nov 12, 2019 at 16:38:55 (UTC)
Goto Top
Verknüpfen von Variablen und Konstanten geht einfach mit dem & (und-Zeichen).

strDateipfad = "\\" & strServername & "\" & strOrdnername & "\" & strWertVariable

Statt Acrobat-Reader zu starten kannst du auch direkt die verknüpfe Anwendung starten, dafür brauchst Du nur den Dateipfad anzugeben:

Call ShellExecute(0, "open", strDatei, "", "", SW_SHOWNORMAL)  

Falls Du einen Ordner öffnen willst, dann geht's über den Explorer:

Shell "explorer.exe """ & strOrdner & "\" & strDatei & """", vbNormalFocus  
Member: Brave71
Brave71 Nov 18, 2019 at 07:41:50 (UTC)
Goto Top
Hallo,

mein Servername ist mit Bindestrich also set strServername = xx-x-xx
Die Bindestriche mag er aber wohl nicht, hab es auch mit Delimiter versucht funktioniert aber auch nicht.
Kann wer helfen?
Member: tomolpi
tomolpi Nov 18, 2019 at 08:05:42 (UTC)
Goto Top
Zitat von @Brave71:

Hallo,

mein Servername ist mit Bindestrich also set strServername = xx-x-xx
Die Bindestriche mag er aber wohl nicht, hab es auch mit Delimiter versucht funktioniert aber auch nicht.
Kann wer helfen?
Wie sieht es bei der Verwendung der IP-Adresse des Servers aus?
Member: goRaini
goRaini Nov 18, 2019 at 09:09:50 (UTC)
Goto Top
Wenn du den Servernamen im Pfad drin meinst (also beim Aufruf über Deine Variante mit Acrobat), dann musst du die Anführungszeichen mit in die Zeichenkette einbauen. Meine Variante hat das bereits drin.

Deine Variante würde dann so aussehen:

wsShell.run """C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe""" & " """ & strPfad """"  

Wenn ein Anführungszeichen innerhalb eines Strings dargestellt werden soll, dann muss er doppelt angegeben werde.
Member: Brave71
Brave71 Nov 18, 2019 at 11:17:22 (UTC)
Goto Top
Hallo,

ich wollte jetzt eigentlich die Datei direkt aufrufen mit:
strDateipfadtest = "\\"& strServername &"\"& strOrdnername &"\"& strVerzeichnis &"\"& strWerttest   

Die Variable strServername ist das Problem
set strServername = xx-x-xx

geht aber so nicht wegen den Bindestrichen ich versuch mal die IP Adresse
Member: goRaini
goRaini Nov 18, 2019 at 11:42:57 (UTC)
Goto Top
da fehlen aber die Anführungszeichen:

falsch:
set strServername = xx-x-xx

richtig:
strServername = "xx-x-xx"  

Ich vermute mal, dass Du den Servernamen fest im Code hinterlegen willst. Wenn nicht muss der Wert ja auch irgendwo herkommen (z.B. aus einer Inputbox).

"Set" verwendet man nur bei Objektvariablen, hier kann es entfallen.
Member: Brave71
Brave71 Nov 26, 2019 at 17:02:28 (UTC)
Goto Top
Hallo,

ich musste meinem Ablauf noch eine Select Case Abfrage einbauen welche auch soweit funktioniert.
Um das gewählte Ergebnis weiter verarbeiten zu können habe ich ein StrFlag eingebaut mit dem ich das bewältigen wollte.
Allerdings funktioniert das nicht so wie gedacht.
hier mal ein Auszug aus dem Scriptteil:
Select Case inp01
    Case "1"  
        MsgBox "Test1 ausgewaehlt",64,strTitle  
        strFlag = True
	    Case "2"  
        MsgBox "Test2 ausgewaehlt",64,strTitle  
        strFlag = True
		
		
		
strWertTest1 = oSheet.Cells(oWertGefunden.Row,"C").Value  
If strFlag = true then
Else  fWertSuchen = TRUE
Set WsShell = WScript.CreateObject("WScript.Shell")  
wsShell.run "\\"& strServername &"\"& strOrdnername &"\"& strVerzeichnis &"\"& strWertTest1  
End IF


Kann ich das Ergebnis des strgFlag gar nicht weiter außerhalb des Case verwenden?
Fehler wird mir keiner ausgegeben.
Member: goRaini
Solution goRaini Nov 26, 2019 at 17:36:52 (UTC)
Goto Top
Kann das sein, dass Du von Datentypen und Variablendeklaration ziemlich wenig verstehst? Das meine ich nicht als Vorwurf oder als ernstgemeinte Frage, denn keiner kann alles.

Zuerst einmal solltest Du in Deinem VBA-Modul oben als erste Zeile folgendes hinschreiben:
Option Explicit
Ab dann wirst Du gezwungen Variablen zu deklarieren, so dass Du dann auch weißt, dass die Variable entweder im kompletten Modul oder nur in einer Sub / Function gültig ist.

Dann solltest Du in Deiner Sub / Function, das mal ungefähr so machen:
Dim strEingabe as String
Dim blnFlag as Boolean

Ich mach gern die ersten drei Buchstaben der Variablen als Datentyp und dahinter etwas, mit dem ich auch in einem Jahr noch was anfangen kann. Texte werden als String, Ja/Nein-Wert als Boolean gespeichert.

Wenn der VBA-Compiler bzw. -Interpreter die Variable strFlag nämlich als String versteht, dann wird bei der Zeile
strFlag = True
Der Text "Wahr" in die Variable gespeichert. Mit etwas Glück klappt der Vergleich ...
If strFlag = true then
... trotzdem, aber verlassen würde ich mich darauf nicht zwingend - es ist zumindest unsauber programmiert.

Vorschlag / Tipp:
Was hälst Du davon, wenn Du Dir ein Buch oder eBook zum Thema "Excel VBA" kaufst und liest. Ich glaube, das würde Dir langfristig sehr viel weiterhelfen.

Mit Excel und VBA kann man (mit etwas Übung natürlich) richtig schön "zaubern"! Aber Achtung: Suchtgefahr! Wenn Du wirklich eintauchst und Du zum "Flow" kommst, dann ist die Kategorie "Zeit" vorrübergehend ausser Kraft gesetzt. Aber schön ist es, wenn man anschließend sieht, was man selbst erschaffen kann.

Viel Glück beim Weiterprobieren!
Member: Brave71
Brave71 Nov 26, 2019 at 19:48:15 (UTC)
Goto Top
Hallo goRaini,

zum ersten Punkt hatte ich Anfangs des Themas bereits geschrieben... "Hab vorher noch nichts mit VBS gemacht und gerade angefangen mich ins Thema einzulesen"
Zum zweiten Punkt Option Explicit steht bereits in meinem Script, das hab ich mittlerweile begriffen.
Ich lese mich durch diverse Internetseiten und probiere aus. Gibt aber eben immer mehr als eine Möglichkeit wie man was umsetzten kann.... so ist Internet Fluch und Segen zu gleich.
Ich such mal nach einem Grundlagenbuch das mir hilft.

Danke für die Hilfe bis dahin.
Ich mach den Punkt dann zu.