Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
820to824
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
820to824
820to824
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

SAP via Funktionsbaustein in Excel auslesen

SAP via Funktionsbaustein in Excel auslesen
21.11.2006 13:17:17
Marie
Hallo liebe Leute,
ich hab hier ein kleines Problem.
Aufgabe ist es, ein Makro in VBA zu erstellen, welches einen Login an SAP durchführt (geht schon) und dann bestimmte Suchparameter einem selbstgeschriebenen Funktionsbaustein übergibt, der damit eine Suche durchführt und Daten zurückgibt, die dann in bestimmten Zellen in bestimmten Excelsheets ausgegeben werden sollen.
Der Login funktioniert wie gesagt bis hierhin wunderbar. Ich hänge momentan an der Übergabe der Suchparameter an den Funktionsbaustein. Wie kann man das machen?
LG
Marie

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: SAP via Funktionsbaustein in Excel auslesen
21.11.2006 14:23:17
Marie
Hallo Hansueli,
nein der FuBa ist gänzlich von einem Kollegen selbstgeschrieben worden, wenn ich das richtig verstanden habe.
Eigentlich muss ich dem Baustein nur sagen
1. "trage Wert1 in Feld1, Wert2 in Feld2, Wert3 in Feld3 ein und Enter!"
bis jetzt versuche ich das die ganze Zeit per "exports":
........
Set oParam1 = objDisplay.Exports("I_MATNR")
Set oParam2 = objDisplay.Exports("I_WERKS")
Set oParam3 = objDisplay.Exports("I_STLTY")
Set oParam4 = objDisplay.imports("RC")
oParam1.Value = txtMatNr
oParam2.Value = "3030"
oParam3.Value = "5"
.......
Aber das scheint irgendwie noch nicht ganz so zu klappen denn der Returncode (RC) steht leider nie auf "0" (wie's ja sein sollte).
weiterführend würde das dann wohl noch etwa so aussehen:
2. "übertrage Suchergebnis1, Suchergebnis2, Suchergebdnis3 und Suchergebnis4 sowie Tabelleninhalt1, Tabelleninhalt2..... an Excel"
3.
"wenn Tabelleneinträge kleiner-gleich 10 & ungleich 0 dann trage Wert A in Zelle A und Wert B in Zelle B ....... Wert N in Zelle N in TABELLE1,
sonstwenn Tabelleneinträge kleiner-gleich 20 & größer 10 dann trage Wert A in Zelle A und Wert B in Zelle B ....... Wert N in Zelle N in TABELLE2,
sonstwenn Tabelleneinträge kleiner-gleich 30 & größer 20 dann trage Wert A in Zelle A und Wert B in Zelle B ....... Wert N in Zelle N in TABELLE3,
sonst Fehler."
Aber wie gesagt ich wäre erstmal froh, wenn das ganze irgendwie an den FuBa gesendet kriegen würde......
LG
Marie
Anzeige
AW: SAP via Funktionsbaustein in Excel auslesen
21.11.2006 14:37:36
EtoPHG
Hallo Marie,
Dann muss Dir der Kollege weiterhelfen, den wie sollen die Helfer hier wissen, was Dein Kollege erstellt hat.
Den meisten hier fehlt das Instrument:
Userbild
Gruss Hansueli
AW: SAP via Funktionsbaustein in Excel auslesen
21.11.2006 14:54:16
Walburga
Hi Marie
greift der Funktionsbaustein auf eine Tabelle(SAP) zu? Wenn Ja, musst Du die Feldbelegung der Tabelle kennen, um z.B. mit SQL (Querry) die SAP-Tab auswerten zu können.
Gib mal mehr Input, vielleicht kann ich Dich unterstützen (mit Beispiel)
Gruss Walburga
AW: SAP via Funktionsbaustein in Excel auslesen
22.11.2006 09:57:07
Marie
Hallo Leute!
Also ich weiß jetzt woran es lag, dass alles nicht funktioniert hat - der Testinput der mir gegeben wurde war nicht ganz korrekt -.-
Hier erstmal der Code dafür:
------------------------------------------------------------------------------------
'Deklarationszwang
Option Explicit
'*********************************************************************************
'Deklaration der benötigten Variablen
'*********************************************************************************
Dim objBAPIControl As Object
Dim objConnection As Object
Dim objDisplay As Object
Dim login As Boolean
Dim objTable As Table
'Parameter
Dim oParam1 As Object
Dim oParam2 As Object
Dim oParam3 As Object
Dim oParam4 As Object
Dim oParam5 As Object
Dim oParam6 As Object
Dim oParam7 As Object
'*********************************************************************************
'Cancel-Button

Private Sub cmdCancel_Click()
MatNrQuery.Hide
End Sub

'Okay-Button

Private Sub cmdOK_Click()
If login = False Then
' Verbindungsaufbau
Set objBAPIControl = CreateObject("SAP.Functions")
Set objConnection = objBAPIControl.Connection
objConnection.System = "***"
objConnection.HostName = "***"
objConnection.SystemNumber = "***"
objConnection.client = "***"
objConnection.User = ""
objConnection.Password = ""
objConnection.Language = "DE"
If objConnection.Logon(0, False) Then
login = True
MsgBox "Verbunden"
End If
' Auslesen der Daten über den Baustein
' ZL_LESEN_DISPLAY_STUECK (aus der Tabelle TABENTRY)
Set objDisplay = objBAPIControl.Add("ZL_LESEN_DISPLAY_STUECK")
' EXPORTS
'Materialnummer
Set oParam1 = objDisplay.exports("I_MATNR")
'Werksnummer
Set oParam2 = objDisplay.exports("I_WERKS")
'Stücklistennummer
Set oParam3 = objDisplay.exports("I_STLTY")
' IMPORTS
'Returncode (muss 0 sein, sonst Fehler!)
Set oParam4 = objDisplay.imports("RC")
'Materialbezeichnung (Display)
Set oParam5 = objDisplay.imports("E_MAT_BEZ")
'EAN-Nummer (Display)
Set oParam6 = objDisplay.imports("E_EANNR")
'Display-Bezeichnung
Set oParam7 = objDisplay.imports("E_DIS_BEZ")
'Tabelle
Set objTable = objDisplay.Tables("TABENTRY")
'Set objCol = objTable.Columns("ENTRY")
'Wertzuweisung
oParam1.Value = txtMatNr
oParam2.Value = "3030"
oParam3.Value = "5"
'Aufruf
objDisplay.Call
Else
login = False
objConnection.Logoff
Set objConnection = Nothing
Set objBAPIControl = Nothing
End If
End Sub

------------------------------------------------------------------------------------
Jetzt funktionierts - das einzige was nun noch gemacht werden muss ist die Ausgabe in die bestimmten Tabellen und Tabellenzellen.
Allerdings wirft sich hier eine neue Problematik auf: Die aus der Tabelle ausgelesenen Daten sind nicht gerade gut strukturiert - es sind je Zeile vier verschiedene Daten, die eigentlich auch in vier verschiedene Spalten gehören - allerdings stehen sie alle in einer Spalte und sind nur durch diverse Leerzeichen getrennt.
Aber eins nach dem anderen:
Erstmal wäre es gut zu wissen, wie ich in VBA ein bestimmtes Tabellenblatt auswählen kann. Also für das aktuelle gibts ja ActiveSheet, wie kann ich sowas mit einem bestimmten Tabellenblatt machen?
LG
Marie
Anzeige
AW: SAP via Funktionsbaustein in Excel auslesen
22.11.2006 10:42:54
Marie
Soooooooooooooooo, ich hab jez schon was gefunden, wie ich das ganze in die bestimmten Tabellenblätter übertragen kann:
------------------------------------------------------------------------
If oParam4 'ungleich' "0" Then
MsgBox ("Ein Fehler ist aufgetreten. Der Returncode muss NULL sein (RC = " & oParam4 & "). Bitte überprüfen Sie Ihre Eingabe!")
Else
Dim i
For i = 1 To Entry
Cont = objTable.Cell(i, 1)
If Entry 'kleinergleich' "10" And Entry 'ungleich' "0" Then
Worksheets(2).Cells(7 + i, 1) = Cont
ElseIf Entry 'kleinergleich' "20" And Entry 'größer' "10" Then
Worksheets(3).Cells(7 + i, 1) = Cont
ElseIf Entry 'kleinergleich' "30" And Entry 'größer' "20" Then
Worksheets(4).Cells(7 + i, 1) = Cont
End If
'ActiveSheet.Cells(8 + i, 1) = objTable.Cell(i, 1)
Next i
If Entry 'kleinergleich' "10" And Entry 'ungleich' "0" Then
MsgBox ("Die Daten wurden in ""Etikett A5"" eingetragen")
ElseIf Entry 'kleinergleich' "20" And Entry 'größer' "10" Then
MsgBox ("Die Daten wurden in ""Etikett A4 Variante A - 20"" eingetragen")
ElseIf Entry 'kleinergleich' "30" And Entry 'größer' "20" Then
MsgBox ("Die Daten wurden in ""Etikett A4 Variante B - 30"" eingetragen")
Else
MsgBox ("Fehler! Entweder sind 0 oder mehr als 30 Einträge vorhanden. Es wurden keine Daten eingetragen.")
End If
End If
------------------------------------------------------------------------
Allerdings weiß ich noch nicht, wie ich das ganze jetzt auch besimmten Zellen (also z.B. B7) zuordnen kann, denn so kann ichs nur einer Zeile zuordnen.
Weiß da vlt jemand weiter?
LG
Marie
Anzeige
AW: SAP via Funktionsbaustein in Excel auslesen
22.11.2006 13:36:21
Marie
Hm Okay - ich danke dir erstmal - hat mir sehr geholfen schonmal!!!
Das Problem was ich jetzt habe ist, dass das ja in einer Schleife ausgegeben wird und wenn ich es so mache wie ich es jetzt habe, wird natürlich für jede zelle dann der gleiche wert genommen....es wird ja nie inkrementiert.
Außerdem sollen die Ausgaben in der Schleife nur jede zweite Zeile betreffen.
Also
ZelleneintragA
Leerzeile
ZelleneintragB
Leerzeile.......
Hier mal der "neue" Code:
'********************************************************
' Ausgabe der Daten
'********************************************************
.............
Entry = objTable.RowCount
If oParam4 'ungleich' "0" Then
MsgBox ("Ein Fehler ist aufgetreten. Der Returncode muss NULL sein (RC = " & oParam4 & "). Bitte überprüfen Sie Ihre Eingabe!")
Else
Dim i
For i = 1 To Entry
Cont = objTable.Cell(i, 1)
If Entry 'kleinergleich' "10" And Entry 'ungleich' "0" Then
Sheets(2).Range("B7:B25") = Cont
ElseIf Entry 'kleinergleich' And Entry 'größer' "10" Then
Sheets(3).Range("B7:B45") = Cont
ElseIf Entry 'kleinergleich' "30" And Entry 'größer' "20" Then
Sheets(4).Range("B7:B65") = Cont
End If
Next i
If Entry 'kleinergleich' "10" And Entry 'ungleich' "0" Then
MsgBox ("Die Daten wurden in ""Etikett A5"" eingetragen")
ElseIf Entry 'kleinergleich' And Entry 'größer' "10" Then
MsgBox ("Die Daten wurden in ""Etikett A4 Variante A - 20"" eingetragen")
ElseIf Entry 'kleinergleich' "30" And Entry 'größer' "20" Then
MsgBox ("Die Daten wurden in ""Etikett A4 Variante B - 30"" eingetragen")
Else
MsgBox ("Fehler! Entweder sind 0 oder mehr als 30 Einträge vorhanden. Es wurden keine Daten eingetragen.")
End If
End If
...........
Also erste Frage: wo kann man das Inkrement unterbringen?
und zweite Frage: wie schaffe ich's dass nur jede zweite Zeile ausgefüllt wird?
LG
Marie
Anzeige
TextToColumns!?!?
23.11.2006 10:49:22
Marie
Hallo Leute!
ich hab da eine Inspiration bekommen, dass das ganze wohl mit TextToColums irgendwie realisierbar sein kann - zumindest das splitten...... ich habs mal mit der Excelfunktion selber versucht und das klappt wunderbar - die Frage ist nur - wie kann ich das ganze auf noch nicht ausgegebene, sondern nur ausgelesene Daten anwenden!?
Kennt sich damit vlt jemand aus?
LG
Marie
Alternative zu TextToColumns!?!?
23.11.2006 11:42:37
Marie
Hallo ich schon wieder ^^
Ja ich hab mal ein wenig mehr nach texttocolumns gegoogelt - zu viele stichwörter können auch von nachteil sein....
wenn ich das richtig verstanden habe ist diese funktion rein tabellenorientiert, also nicht auf nicht-ausgegebene daten anwendbar...
und ich hab mir grad eine alternative überlegt, nur weiß ich nicht, wie ich die umsetzen soll oder ob das überhaupt möglich ist.
Also nochmal so sieht das ganze etwa aus (die Rauten bedeuten jetzt mal die Leerzeichen - wobei vor der Anzahl die Leerzeichenzahl immer wieder variiert...):
13steilligeEAN#####Packungsbezeichnung mit Leerzeichen enthalten#######################################################Anzahl#Bezeichnung
Hier mal so ein kleiner ablauf:
1. Entferne letzten 3 Zeichen vom ganzen String (brauch ich nich)
2. Trenne nach Leerzeichen (replace/split)
3. Speichere Teilstrings
4. Füge Teilstring2 bis Teilstring n-1 am Ende ein Leerzeichen an***
5. Füge Teilstring2 bis Teilstring n-1 zusammen (join)***
***Teilstring2 bis Teilstring n-1 würden dann wieder die Packungsbezeichnung ergeben, daher auch die Leerzeichen wieder. Im Endeffekt müssen 3 Strings dabei rauskommen - nicht vier, wie ich erst meinte....die Bezeichnung am Ende brauche ich nämlich nicht....
Das ganze in eine Schleife gepackt könnte theoretisch funktionieren... nur wie gesagt, ob und wie ichs umsetzen kann weiß ich nicht ....?
Hülfä? ^^
LG
Marie
Anzeige
Frage: Zweizeilig & Schleifenproblem
23.11.2006 13:46:02
Marie
So.... hab hier jetzt rumprobiert und was hinbekommen womit ich zumindest schonmal die Teilstrings rausbekomme:
.......
Cont = objTable.Cell(i, 1)
Cont = Replace(Cont, " EA", "")
EAN = Left(Cont, "15")
EAN = LTrim(EAN)
Num = Right(Cont, "10")
Num = LTrim(Num)
Name = Mid(Cont, "15", "50")
Name = LTrim(Name)
.......
Ist zwar vlt nicht die schönste Methode aber es geht :-)
Wenn mir jetzt noch jemand helfen könnte bezüglich der letzten beiden Probleme, die mich beschäftigen, dann wär ich der glücklichste Mensch auf Erden ^^
Nochmal:
Problem 1: Es sollen nur in jeder zweiten Zeile in einem bestimmten Bereich (z.B. von B7:B25) die Daten ausgegeben werden....momentan wirds noch in jeder Zeile ausgegeben (Code weiter unten)
Problem 2: Es soll in jeder Zeile dann natürlich auch ein anderer Eintrag stehen, also die Einträge der ausgelesenen Tabelle sollen auch so wieder ausgegeben werden....momentan läufts aber so, dass in jeder Zeile des angegebenen Bereichs einmal die Schleife durchlaufen wird und am Ende steht in allen das gleiche....
bis jetzt ist es so geregelt:
........
For i = 1 To Entry
........
If Entry 'kleinergleich' "10" And Entry 'ungleich' "0" Then
Sheets(2).Range("B7:B25") = Num
Sheets(2).Range("D7:D25") = Name
Sheets(2).Range("H7:H25") = Num
Sheets(2).Range("J7:J25") = EAN
ElseIf Entry 'kleinergleich' "20" And Entry 'größer' "10" Then
Sheets(3).Range("B7:B45") = Num
Sheets(3).Range("D7:D45") = Name
Sheets(3).Range("I7:I45") = Num
Sheets(3).Range("K7:K45") = EAN
ElseIf Entry 'kleinergleich' "30" And Entry 'größer' "20" Then
Sheets(4).Range("B7:B65") = Num
Sheets(4).Range("D7:D65") = Name
Sheets(4).Range("I7:I65") = Num
Sheets(4).Range("K7:K65") = EAN
End If
Next i
.......
Also schreit, wenn ihr von sowas Ahnung habt!! Bitte!
LG
Marie
Anzeige
Ausgabe nur in jeder zweiten Zeile
23.11.2006 15:48:04
Marie
So Problem mit Schleife auch gelöst....
einfach
Sheets(2).Range("B7:B25") = EAN
durch
sheets(2).cells(i+6,2) = EAN
ersetzen bzw auch noch abändern und gut *freu*
Fehlt nur noch das mit dem "nur in jede zweite Zeile ausgeben" - also HILEEEEE!?!?!?
AW: Ausgabe nur in jeder zweiten Zeile
23.11.2006 15:59:06
EtoPHG
Hallo Marie,
jede zweite Zeile

sheets(2).cells(i*2+5,2) = EAN

Gruss Hansueli
DANKE!! SUPER!!
23.11.2006 16:17:16
Marie
DANKE DANKE DANKE!!! Das war der finale Schuss!!!
ISCH HABE FERTISCH!!
DANKE HANSUELI!!! DANKE!!!!
Der fertige Quelltext
23.11.2006 16:33:42
Marie
Hier der fertige Source:
'Deklarationszwang
Option Explicit
'*********************************************************************************
'Deklaration der benötigten Variablen
'*********************************************************************************
Dim objBAPIControl As Object
Dim objConnection As Object
Dim objDisplay As Object
Dim login As Boolean
Dim objTable As Table
'Parameter
Dim oParam1 As Object
Dim oParam2 As Object
Dim oParam3 As Object
Dim oParam4 As Object
Dim oParam5 As Object
Dim oParam6 As Object
Dim oParam7 As Object
'Zur Ausgabe
Dim i As Integer
Dim n As Integer
Dim strTeilstring()
Dim Cont As String
Dim Entry As String
Dim EAN As String
Dim Name As String
Dim Num As String
'*********************************************************************************
'Cancel-Button

Private Sub cmdCancel_Click()
MatNrQuery.Hide
End Sub

'Okay-Button

Private Sub cmdOK_Click()
If login = False Then
' Verbindungsaufbau
Set objBAPIControl = CreateObject("SAP.Functions")
Set objConnection = objBAPIControl.Connection
objConnection.System = "***"
objConnection.HostName = "****"
objConnection.SystemNumber = "****"
objConnection.client = "***"
objConnection.User = ""
objConnection.Password = ""
objConnection.Language = "DE"
If objConnection.Logon(0, False) Then
login = True
MsgBox "Verbunden"
End If
' Auslesen der Daten über den Baustein
' ZL_LESEN_DISPLAY_STUECK (aus der Tabelle TABENTRY)
Set objDisplay = objBAPIControl.Add("ZL_LESEN_DISPLAY_STUECK")
' EXPORTS
'Materialnummer
Set oParam1 = objDisplay.exports("I_MATNR")
'Werksnummer
Set oParam2 = objDisplay.exports("I_WERKS")
'Stücklistennummer
Set oParam3 = objDisplay.exports("I_STLTY")
' IMPORTS
'Returncode (muss 0 sein, sonst Fehler!)
Set oParam4 = objDisplay.imports("RC")
'Materialbezeichnung (Display)
Set oParam5 = objDisplay.imports("E_MAT_BEZ")
'EAN-Nummer (Display)
Set oParam6 = objDisplay.imports("E_EANNR")
'Display-Bezeichnung
Set oParam7 = objDisplay.imports("E_DIS_BEZ")
'Tabelle
Set objTable = objDisplay.Tables("TABENTRY")
'Wertzuweisung
oParam1.Value = txtMatNr
oParam2.Value = "3030"
oParam3.Value = "5"
'Aufruf
objDisplay.Call
' Ausgabe der Daten
'Anzahl der Einträge (Zeilen der SAP-Tabelle)
Entry = objTable.RowCount
If oParam4 'ungleich' "0" Then
MsgBox ("Ein Fehler ist aufgetreten. Der Returncode muss NULL sein (RC = " & oParam4 & "). Bitte überprüfen Sie Ihre Eingabe!")
Else
'Schleifendurchlauf von Eintrag 1 bis n
For i = 1 To Entry
'Tabelle zeilenweise auslesen
Cont = objTable.Cell(i, 1)
'Letzten 3 Zeichen entfernen - werden nicht benötigt
Cont = Replace(Cont, " EA", "")
'EAN Nummer ausschneiden und Leerzeichen davor und danach entfernen
EAN = Left(Cont, "15")
EAN = LTrim(EAN)
'Anzahl ausschneiden und Leerzeichen....
Num = Right(Cont, "10")
Num = LTrim(Num)
'Packungsbezeichnung ausschneiden und Leerzeichen....
Name = Mid(Cont, "15", "50")
Name = LTrim(Name)
'Wenn weniger als oder genau 10 und mehr als 0 Einträge vorhanden sind -> Ausgabe in A5
If Entry 'kleinergleich' "10" And Entry 'ungleich' "0" Then
Sheets(2).Cells(i * 2 + 5, 2) = Num
Sheets(2).Cells(i * 2 + 5, 4) = Name
Sheets(2).Cells(i * 2 + 5, 8) = Num
Sheets(2).Cells(i * 2 + 5, 10) = EAN
'Wenn weniger als oder genau 20 und mehr als 10 Einträge vorhanden sind -> Ausgabe A4 -A
ElseIf Entry 'kleinergleich' "20" And Entry 'größer' "10" Then
Sheets(3).Cells(i * 2 + 5, 2) = Num
Sheets(3).Cells(i * 2 + 5, 4) = Name
Sheets(3).Cells(i * 2 + 5, 9) = Num
Sheets(3).Cells(i * 2 + 5, 11) = EAN
'Wenn weniger als oder genau 30 und mehr als 20 Einträge vorhanden sind -> Ausgabe A4 -B
ElseIf Entry 'kleinergleich' "30" And Entry 'größer' "20" Then
Sheets(4).Cells(i * 2 + 5, 2) = Num
Sheets(4).Cells(i * 2 + 5, 4) = Name
Sheets(4).Cells(i * 2 + 5, 9) = Num
Sheets(4).Cells(i * 2 + 5, 11) = EAN
End If
Next i
If Entry 'kleinergleich' "10" And Entry 'ungleich' "0" Then
Sheets(2).Range("D1") = oParam5
Sheets(2).Range("D2") = oParam7
Sheets(2).Range("J2") = oParam1
Sheets(2).Range("F27") = oParam6
MsgBox ("Die Daten wurden in ""Etikett A5"" eingetragen")
ElseIf Entry 'kleinergleich' "20" And Entry 'größer' "10" Then
Sheets(3).Range("D1") = oParam5
Sheets(3).Range("D2") = oParam7
Sheets(3).Range("J2") = oParam1
Sheets(3).Range("F47") = oParam6
MsgBox ("Die Daten wurden in ""Etikett A4 Variante A - 20"" eingetragen")
ElseIf Entry 'kleinergleich' "30" And Entry 'größer' "20" Then
Sheets(4).Range("D1") = oParam5
Sheets(4).Range("D2") = oParam7
Sheets(4).Range("K2") = oParam1
Sheets(4).Range("F67") = oParam6
MsgBox ("Die Daten wurden in ""Etikett A4 Variante B - 30"" eingetragen")
Else
MsgBox ("Fehler! Entweder sind 0 oder mehr als 30 Einträge vorhanden. Es wurden keine Daten eingetragen.")
End If
End If
Else
login = False
objConnection.Logoff
Set objConnection = Nothing
Set objBAPIControl = Nothing
End If
End Sub

Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige