Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1856to1860
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBScript für Import aus Excel in PCOMM

VBScript für Import aus Excel in PCOMM
02.12.2021 12:33:31
Sascha
Hallo liebe Community,
ich habe derzeit ein Problem mit einer Makro-Erstellung.
Ich habe erste Teilerfolge erzielen können. (Verbindung zwischen PCOMM und Excel funktioniert, für mich bis dato Neuland).
Ich kann Daten aus Spalten direkt in den IBM-Host übertragen, dies funktioniert aber nur über "SendKeys".
Ich würde aber gerne den Befehl "GetText" nutzen, um eine IF-Prüfung laufen zu lassen und den Text auch sozusagen zwischen zu speichern für weitere Felder.
Bei der Ausführung erhalte ich die Fehlermeldung:
"Kompilierungsfehler in Microsoft VBScript, Line 25, Anweisungsende erwartet"
Das selbe Problem wird somit auch Line 27 und 29 betreffen.
Wie muss ich die Zeile enden lassen?
Oder wie muss die Klammer bestückt sein bei "excel.Cells(row,1,1)", damit er die Daten kopiert in die Zwischenablage.
Vielen Dank im Voraus für eure Hilfe! :-)
Mein Script sieht derzeit so aus: (wird aber noch deutlich erweitert, muss nur erstmal diese Basis-Funktion implementieren)

[PCOMM SCRIPT HEADER]
LANGUAGE=VBSCRIPT
DESCRIPTION=
[PCOMM SCRIPT SOURCE]
autECLSession.SetConnectionByName(ThisSessionName)
REM This line calls the macro subroutine
subSub1_
dim excel
dim row
dim inputfilename
dim objWorkbook
dim i, ka12
sub subSub1_()
inputfilename = "C:\Users\*********.xlsx"
Set excel = CreateObject("Excel.Application")
Set objWorkbook = excel.Workbooks.Open(inputFilename)
excel.visible = true
row = 1
for i = 1 to 2
dim spalte1a
spalte1a= autECLSession.autECLPS.GetText excel.Cells(row,1,1).Value
dim spalte1b
spalte1b= autECLSession.autECLPS.GetText excel.Cells(row,2,1).Value
dim spalte1c
spalte1c= autECLSession.autECLPS.GetText excel.Cells(row,3,1).Value
autECLSession.autECLPS.SendKeys ".ka10,"
autECLSession.autECLPS.SendKeys spalte1a
autECLSession.autECLPS.SendKeys " hip "
autECLSession.autECLPS.SendKeys spalte1a
autECLSession.autECLPS.SendKeys " hip "
autECLSession.autECLPS.SendKeys spalte1a
autECLSession.autECLPS.SendKeys " hurra "
if spalte1b = XY And spalte1c = VF then
autECLSession.autECLPS.SendKeys "38826"
end if
if spalte1b = XY And spalte1c = LD then
autECLSession.autECLPS.SendKeys "38825"
end if
if spalte1b = YX And spalte1c = VF then
autECLSession.autECLPS.SendKeys "38829"
end if
if spalte1b = YX And spalte1c = LD then
autECLSession.autECLPS.SendKeys "38828"
end if
row = row + 1
next
excel.Quit
Set excel = Nothing
end sub
Das erste Makro sah so aus und funktioniert auch wie oben beschrieben hinsichtlich des direkten Einfügens in PCOMM.

[PCOMM SCRIPT HEADER]
LANGUAGE=VBSCRIPT
DESCRIPTION=
[PCOMM SCRIPT SOURCE]
autECLSession.SetConnectionByName(ThisSessionName)
REM This line calls the macro subroutine
subSub1_
dim excel
dim row
dim inputfilename
dim objWorkbook
dim i, ka12
sub subSub1_()
inputfilename = "C:\Users\*********.xlsx"
Set excel = CreateObject("Excel.Application")
Set objWorkbook = excel.Workbooks.Open(inputFilename)
excel.visible = true
row = 1
for i = 1 to 2
autECLSession.autECLPS.SendKeys excel.Cells(row,1).Value
autECLSession.autECLPS.SendKeys excel.Cells(row,2).Value
autECLSession.autECLPS.SendKeys excel.Cells(row,3).Value
row = row + 1
next
excel.Quit
Set excel = Nothing
end sub

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
vielleicht solltest du das ...
02.12.2021 12:38:26
Rudi
... in einem VB-Forum fragen.
Was mir spanisch vorkommt: .Cells(row,1,1)
Gruß
Rudi
AW: VBScript für Import aus Excel in PCOMM
02.12.2021 14:20:04
Sascha
Vielen Dank für die Antwort.
Leider funktioniert es immer noch nicht.
Die Fehlermeldung ist verschwunden, aber er versucht nun in PCOMM die Daten aus Zeile 1 zu kopieren, greift aber nicht mehr auf Excel zu.
Daher müsste vermutlich schon irgendein Verweis auf Excel in die Zeile einfließen.
Deswegen meine ursprüngliche Variante.
spalte1a= autECLSession.autECLPS.GetText excel.Cells(row,1,1).Value
AW: VBScript für Import aus Excel in PCOMM
02.12.2021 14:54:10
ChrisL
Hi
Du übergibst nur den Text in die Variable. Dazu braucht es m.E. keinen Verweis auf Excel.

spalte1a= autECLSession.autECLPS.GetText(row,1,1)
MsgBox spalte1a
Nach meiner Interpretation müsste (bei row = 1) der Buchstabe links oben rauskommen. Wenn da kein Text steht, dann kommt natürlich "" (nichts) zurück.
cu
Chris
Anzeige
AW: VBScript für Import aus Excel in PCOMM
02.12.2021 15:01:35
Sascha
Hello again,
es kommt lediglich bei (row,1,3) etwas raus, weil in IBM PCOMM diese Zelle mit einer 1 befüllt ist.
Die Test-Texte, die in den Excel-Spalten sind, kopiert er nicht.
Er versucht also nicht in Excel, sondern nur in PCOMM die Daten abzugreifen.
Daher auch mein Gedanke dazu, dass der Befehl einen Verweis auf Excel benötigt.
AW: VBScript für Import aus Excel in PCOMM
02.12.2021 16:22:48
ChrisL
Hi
Ohne dass ich tiefer in die Spezifikationen von IBM eintauche, aber GetText soll doch nur den Text aus dem Host lesen und wenn du die Textlänge auf 1 setzt, dann kommt halt nur ein Zeichen (Text oder Zahl) zurück.
Der Befehl ist also dazu da einen Text aus dem Host zu lesen und nicht aus Excel. Wenn du aus Excel lesen willst, dann so...

x = objWorkbook.Worksheets("Tabelle1").Cells(Zeilenindex, Spaltenindex)
MsgBox x

In dem Fall braucht es keinen Bezug zu IBM-Host sondern nur zu Excel.
Übrigens durfte ich vor längerer Zeit mal mit einer etablierten RPA-Software (Robotic Process Automation) spielen und der Anwendungsfall bestand darin einen IBM-Host zu steuern (lesen/schreiben). Wenn die Umgebung mal eingerichtet ist und nachdem ich die richtige Schnittstelle zum Host gefunden habe, hat die Angelegenheit viel Freude bereitet (u.a. weil der Host mit fixer Breite/Höhe arbeitet und keine Dynamik aufweist). Für das professionelle Umfeld (worauf IBM-Host deutet) und mit entsprechender Investitionsbereitschaft kann ich den punktuellen Einsatz von RPA empfehlen.
cu
Chris
Anzeige
AW: VBScript für Import aus Excel in PCOMM
02.12.2021 18:39:42
Sascha
Okay, das werde ich mal am Montag ausprobieren, vorher komme ich leider nicht mehr dazu.
Ist nur dafür da, mir die Arbeit zu erleichtern. Generell haben wir auch die RPA, damit arbeitet aber nur eine spezielle Abteilung, an die wir Großprojekte abgeben, daher ist mir das ein Begriff.
Würde mich am Montag nochmal hier melden, wenn ich es getestet habe. :-)
Ggfs. ergeben sich dann noch 1-2 Fragen oder notwendige Korrekturen.
Und wenn ich dafür hier schon einen Experten an der Hand habe.. ;-)
Danke erstmal für deine Hilfe.
LG Sascha
OT: RPA IBM-Host
02.12.2021 18:57:39
ChrisL
Aus dem Nähkästchen geplaudert:
Ich meine mich zu erinnern immer zuerst Ctrl+Home geschickt (SendKeys) zu haben, um den Cursor in eine fixe Ausgangsposition zu setzen. Danach mit Tab navigieren.
Die alten Host-Tastaturen waren anders aufgebaut u.a. reichten die F-Tasten bis F-24. Um einen Host über eine PC-Tastatur zu steuern benutzt man heute Ctrl als Enter-Taste und z.B. F15-Taste wäre Shift-F3.
Es gilt zwischen VBA-SendKeys und Host-SendKeys zu unterscheiden. Gleicher Befehl aber andere Programmiersprache. Die SendKeys vom Host orientieren sich an der alten Tastatur d.h. Enter=Enter (oder war es Return). Jedenfalls wären die SendKeys-Spezifikationen von IBM zu lesen und nicht von VB. Und selbstverständlich sollte man auch nicht mit VBA-SendKeys versuchen den Host zu steuern.
Jede Host-Maske hat i.d.R. an einer fixen Stelle (z.B. rechts oben) eine eindeutige ID. Damit lässt sich bei Abzweigungen und Fehler erkennen, ob man auf der richtigen Seite ist.
Für eine Stapelverarbeitung scheint es mir zentral, dass die Eingaben kontrolliert/überwacht erfolgen, sonst müllst du den Host im schlimmsten Fall mit Fehlinformationen zu. Ein Fehlerprotokoll um nicht/unvollständig verarbeitete Aktionen zu erkennen ist zusätzlich sinnvoll.
Und weiter abgeschweift. Der Einsatz von RPA sollte nur ganz gezielt erfolgen (auch das VB-Script ist eine Form von RPA, nur ohne spezialisierte Software). Nach meiner Erfahrung wird RPA schnell einmal als Allzweckwaffe gesehen, wenn der Manager den Cursor auf dem Bildschirm flitzen sieht. Zudem muss der Manager innovativ sein und Kosten sparen (was gibt es besseres als Roboter arbeiten zu lassen).
Aus meiner Sicht stellt RPA eher eine Übergangslösung dar oder evtl. als "Schnittstelle" zu fremden Applikationen, wo man keinen direkten Zugang (API) bekommt.
Ich denke es ist nicht unüblich, dass Unternehmen versuchen alte Host-Applikationen abzulösen, aber nur sehr schwer davon loskommen. Die Vernetzung unterschiedlicher Anwendungen ist derart gross, dass eine Ablösung eine Operation am offenen Herzen darstellt bzw. mit dem Ersatz des Backbones zeitgleich auch alle Umsysteme erneuert werden müssten. Ich würde behaupten, die unterschätzte Komplexität führt nicht selten zu Millionen-Abschreibern in Grossunternehmen, wenn das Endlos-Projekt eingestampft werden muss.
Jedenfalls wird in Host-Applikationen kaum mehr investiert, weil man diese ja sowieso ablösen will (und evtl. auch mangels Entwicklern). Parallel besteht aber eine zunehmende Anforderung zur Prozessautomatisierung. In solchen Situationen sehe ich ein berechtigtes Einsatzgebiet für RPA, vorausgesetzt man macht es richtig (Governance, Sicherheit usw.). Der Roboter braucht übrigens seine eigene User-ID und Passwort (Nachvollziehbarkeit etc.).
Ein weiteres Pro um einen Host über die Benutzeroberfläche zu steuern, ist die fehlende Investitionsbereitschaft und darum ändern sich Host-Masken heutzutage so gut wie nie. Im Gegensatz z.B. zu fremden Webanwendungen wo ohne Vorwarnung Änderungen eingespielt werden (und somit muss man auch laufend seine Automatisierung anpassen).
PS: Und aufpassen, dass du dich mit deinem Roboter nicht selber wegrationalisierst. Also niemandem etwas erzählen fleissig weiter jammern wie zeitraubend die Aufgabe ist. :)
Anzeige
AW: OT: RPA IBM-Host
02.12.2021 19:49:21
Sascha
Also eigentlich arbeiten wir inzwischen sogar mit Quick3270.. man kann aber die alten Makros aus dem IBM Host nutzen. Diese lassen sich in meinen Augen leichter schreiben..
In 3-4 Jahren soll auch das neue, web-basierte Betriebssystem kommen, dann ist das gute alte Makro leider passè.
Ich erzähle es auch niemandem, wäre doch auch schön blöd. xD
Aber wie gesagt, ich nutze das Makro normalerweise in einfachsten Weisen und wollte jetzt einfach mal probieren, ob es mit Excel klappt um die Sachen noch weiter automatisieren zu können.
Kannte bis dato nur die GetText-Funktion innerhalb des Hosts. So wie ich das verstehe, ist es bei deinem Befehl dann X, welches ich beliebig mit "SendKeys X" einfügen kann und auch per "If..then" nutzen kann.
Dazu noch eine Frage, habe vor bspw. "If Spalte1a = XY AND Spalte1b = GH Then ...." zu nutzen..ist das so möglich zwei Vorausetzungen vorzugeben?
Oder muss man dann einen anderen Befehl nutzen?
LG
Sascha
Anzeige
AW: VBScript für Import aus Excel in PCOMM
03.12.2021 08:48:15
ChrisL
Hi Sascha
Grundsätzlich passt das schon so. Man kann noch ein wenig verschönern (z.B. mit Select Case).
Ich würde zwecks Übersichtlichkeit auf eine klare Abfolge achten. EVA-Prinzip (Eingabe, Verarbeitung, Ausgabe) oder bezogen auf dein Beispiel lesen, gelesenes interpretieren/auswerten, dann schreiben. Erweiterbar z.B. mit einer Validierung/Gültigkeitsprüfung als Zwischenschritt.
Nachfolgend eine mögliche Strukturierung (ungetestet):

Sub s1()
Dim objExcel As Object, objWorkbook As Object
Dim lngZeile As Long, lngNummer As Long
Dim strSpalte1a As String, strSpalte1b As String, strSpalte1c As String
' Applikationen initialisieren
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:\Users\*********.xlsx")
objExcel.Visible = True
For lngZeile = 1 To 2
'lesen
strSpalte1a = objWorkbook.Worksheets("Tabelle1").Cells(lngZeile, 1).Value
strSpalte1b = objWorkbook.Worksheets("Tabelle1").Cells(lngZeile, 2).Value
strSpalte1c = objWorkbook.Worksheets("Tabelle1").Cells(lngZeile, 3).Value
'interpretieren
If strSpalte1b = XY Then
Select Case strSpalte1c
Case VF: lngNummer = 38826
Case LD: lngNummer = 38825
Case XX: lngNummer = 38829 '?
Case YY: lngNummer = 38828 '?
Case Else: '?
End Select
Else
End If
'navigieren
'schreiben
autECLSession.autECLPS.SendKeys ".ka10,"
autECLSession.autECLPS.SendKeys strSpalte1a
autECLSession.autECLPS.SendKeys " hip "
autECLSession.autECLPS.SendKeys strSpalte1a
autECLSession.autECLPS.SendKeys " hip "
autECLSession.autECLPS.SendKeys strSpalte1a
autECLSession.autECLPS.SendKeys " hurra "
autECLSession.autECLPS.SendKeys lngNummer
Next lngZeile
' aufräumen
objExcel.Quit
Set objExcel = Nothing
End Sub
cu
Chris
Anzeige
AW: VBScript für Import aus Excel in PCOMM
07.12.2021 13:01:45
Sascha
Hi,
sorry, kam nicht früher wieder dazu hier zu schreiben oder zu testen.
Bezüglich der IF-Eingabe gäbe es natürlich auch die Option, die Excel-Datei mit einer Formel zu verändern, um gar nicht erst den Host überlegen zu lassen sondern nur noch das fixe Endergebnis zu übertragen.
Bedeutet, ich bräuchte dann eher eine Excel-Formel für: (immer zwei Vorrausetzungen aus diesen 4 Variablen ergeben eine Nummer, geprüft werden müssen alle 4 Varianten pro Zeile)
VF (Information Spalte 1a) + BR (Information in Spalte 1b) = 38826 (Ergebnis in Spalte 1c)
LD + BR = 38825
VF + RB = 38829
LD + RB = 38828
Danke schonmal vorab für deine tolle Hilfe.
Wenn ich die Info habe, werde ich mal die Excel-Datei entsprechend abändern und anfangen das Makro richtig zu bauen.
Sollten dann noch Fragen auftauchen, melde ich mich nochmal bei dir. :)
LG
Sascha
Anzeige
AW: VBScript für Import aus Excel in PCOMM
07.12.2021 13:32:38
ChrisL
Hi Sascha
Bei vielen Kombinationen macht eine Abbildung als Tabelle tatsächlich Sinn (u.a. einfache Wartbarkeit).
https://www.herber.de/bbs/user/149638.xlsx
Da es nur eindeutige Treffer geben sollte, kannst du SUMMEWENNS() verwenden.
cu
Chris
AW: VBScript für Import aus Excel in PCOMM
07.12.2021 13:50:00
Sascha
Hi Chris,
wenn ich die Testdatei in anderen Zeilen probiere, klappt es aber leider nicht.
Hatte mir bis zu deiner Antwort schon eine Formel erstellt, die aber den Fehler "Namen" auswirft.
Vielleicht findest du den Fehler?
Daten sind in Spalte C und F, Ergebnis soll in einer anderen Zeile ausgeworfen werden.
Da ich die Daten nun natürlich anonymisiert darstelle, währe noch die Frage, wenn Spalte C bspw. "Sascha hat keine Ahnung GmbH" heißt, stört sich die Formel dann an den Leerzeichen?

=WENN(UND(C2=RB;F2="LD");38825;"")&WENN(UND(C2=RB GmbH;F2="VF");38826;"")&WENN(UND(C2=BR;F2="LD"); 38828;"")&WENN(UND(C2=BR;F2="VF");38829;"") 

Anzeige
AW: VBScript für Import aus Excel in PCOMM
07.12.2021 15:01:35
ChrisL
Hi Sascha
Die Kombinationsmöglichkeiten in eine Formel zu verwursten wäre nicht meine bevorzugte Wahl. Die Wartung wird erschwert und selbst kleine Fehler lassen sich ohne Studium der langen Formel nicht beheben.
Ideal fände ich die Kombinationen in eine Tabelle zu legen (siehe die Beispieldatei von vorhin). Alternativ direkt in VBA coden.
Dennoch, der Hauptfehler bestand darin, dass Text-Strings in Gänsefüssen darzustellen sind:

=WENN(UND(C2="RB";F2="LD");38825;"")&WENN(UND(C2="RB GmbH";F2="VF");38826;"")&WENN(UND(C2="BR"; F2="LD");38828;"")&WENN(UND(C2="BR";F2="VF");38829;"") 
Die Text-Verkettung (mit &) ist etwas unkonventionell und bewirkt, dass das Ergebnis ebenfalls einen Textstring darstellt. Üblicherweise würde man die WENN's verschachteln:

=WENN(UND(C2="RB";F2="LD");38825;WENN(UND(C2="RB GmbH";F2="VF");38826;WENN(UND(C2="BR";F2="LD"); 38828;WENN(UND(C2="BR";F2="VF");38829;"")))) 
Beide Varianten sind aus meiner Sicht recht unübersichtlich.
Noch einmal ein VBA-Beispiel als Ergänzung:

If strSpalte1b = "RB" And strSpalte1c = "LD" Then
lngNummer = 38825
ElseIf strSpalte1b = "RB GmbH" And strSpalte1c = "VF" Then
lngNummer = 38826
ElseIf strSpalte1b = "BR" And strSpalte1c = "LD" Then
lngNummer = 38828
ElseIf strSpalte1b = "BR" And strSpalte1c = "VF" Then
lngNummer = 38829
Else
MsgBox "Achtung blabla... Abbruch!!"
Exit Sub
End If
cu
Chris
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige