Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: dolpho am August 08, 2023, 10:54:25

Titel: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: dolpho am August 08, 2023, 10:54:25
Hallo Access-Gemeinde;
mal wieder hänge ich an einem kleinen Problem:

Vorgeschichte:
Aus dem SAP exportiere ich Daten in eine Excel-Tabelle.
Dies lässt sich im SAP leider nicht automatisieren und es kann passieren, dass diese Daten falsch aus dem SAP exportiert werden.

Aufgabe:
Nun soll geprüft werden ob meine zu importierende Exceltabelle das Feld "Lagertyp" enthält.
Ist dieses vorhanden, dann handelt es sich um eine falsche Exportversion und der Vorgang soll abgebrochen werden.
Ist das Feld "Lagertyp" nicht vorhanden, können alle Daten aus der
Tabelle "EXPORT" Datenblatt "Sheet1"
in meine Access-Tabelle "Labelimport"
importiert werden.
Die Excel-Tabelle ist dabei im gleichen Ordner wie die Datenbank

Problem:
Dabei weiß ich nicht, wie ich die Excel-Tabelle richtig "ansprechen" soll.

Einer von Euch weiß sicher Rat.

Vielen Dank schon mal im voraus
Gruß dolpho
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: PhilS am August 08, 2023, 11:15:05
Du könntest ein ADO-Recordset auf Basis der Excel-Daten öffnen und dann prüfen, ob die Fields-Collection des Recordsets die erforderlichen Felder enthält, oder eben bestimmte Felder nicht enthält.

Hier ist ein Beispiel zu diesem Thema: https://stackoverflow.com/questions/46916552/read-excel-file-into-adodb-recordset
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: dolpho am August 08, 2023, 11:39:40
Hallo PhilS
leider spreche ich kaum ein Wort englisch und verstehe daher nur "Bahnhof"
Einen Lösungsansatz hätte ich schon über ein DAO Recordset,
aber wo schreibe ich denn rein, welche Excel-Datei ich meine?

Das ist ein ähnlicher Code aus dem "ms-office-forum":

  Dim rs As DAO.Recordset
   Dim bSACHNUMMER As Boolean
   Dim bZGS As Boolean
   Dim i As Long
   Set rs = CurrentDb.OpenRecordset( _
      "SELECT T.* FROM [excel 8.0;hdr=yes;imex=2;DATABASE=" & sFile & _
      "].[" & sTable & "$] AS T")
   With rs
      For i = 0 To .Fields.Count - 1
         'Debug.Print .Fields(i).Name
         If .Fields(i).Name = "SACHNUMMER" Then bSACHNUMMER = True
         If .Fields(i).Name = "ZGS" Then bZGS = True
      Next
   End With

Da könnte ich ja "Sachnummer" oder "ZGS" durch "Datentyp" ersetzen.
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: ebs17 am August 08, 2023, 11:57:32
Genau. Aber "Lagertyp" statt "Datentyp".
Recordset schließen nicht vergessen, die Mehrbenutzerfähigkeit von Excel ist nicht besonders.
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: dolpho am August 08, 2023, 12:44:05
Leider komme ich nicht mal über die ersten Zeilen hinweg:

Set rs = CurrentDb.OpenRecordset( _
    "SELECT T.* FROM [excel 8.0;hdr=yes;imex=2;DATABASE=" & sFile & _
    "].[" & sTable & "$] AS T")

...und ich weiß nicht, was ich falsch mache...

Keine Datenbank in Verbindungszeichenfolge oder IN-Klausel angegeben
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: PhilS am August 08, 2023, 12:51:14
Zitat von: dolpho am August 08, 2023, 11:39:40aber wo schreibe ich denn rein, welche Excel-Datei ich meine?
sFile und sTable sind im Code nicht deklariert. Vermutlich sollen sie als Argumente an diese Prozedur übergeben werden. Das sollte aus der Prozedurdeklaration hervorgehen.
sFile ist der Dateinamen.
sTable ist der Bereich in Excel, der die Daten der Tabelle enthält. - Genaue Syntax dafür habe ich gerade nicht im Kopf, findest du aber sicherlich mit Google.


Zitat von: dolpho am August 08, 2023, 12:44:05Leider komme ich nicht mal über die ersten Zeilen hinweg:
Wie soll man dir bei dieser Aussage helfen?
Beschreibe doch bitte das Problem verständlich.
Kommt eine Fehlermeldung? Wenn ja, welche genau?
Passiert etwas anderes als du erwartest? Wenn ja, was erwartest du, was passiert stattdessen?

Ich hoffe du kannst das Problem mit meinen obigen Hinweisen bereits lösen. Merk dir aber bitte generell, dass eine konkrete, verständliche Problembeschreibung unerlässlich für passende Lösungsvorschläge ist.
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: PhilS am August 08, 2023, 12:54:19
Zitat von: dolpho am August 08, 2023, 12:44:05Keine Datenbank in Verbindungszeichenfolge oder IN-Klausel angegeben
Ups, das hatte ich übersehen.
Dann liegt es höchstwahrscheinlich an fehlenden Werten für sFile und sTable.
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: ebs17 am August 09, 2023, 12:45:43
Aus persönlicher Mitteilung:
Zitatirgendwie komme ich nicht zum gewünschten Ziel :-(

Es muss doch eine Möglichkeit geben die in Normalsprache heißt:

Sage mir bitte, ob es in der Tabelle
 "\\ad001.Test.net\dfs001\File\DE\MST\Bezold\Etiketten\Neu\EXPORT.XLSX"
eine Spalte Lagertyp gibt, dann brich ab
und wenn nicht importiere bitte die Daten in meine Tabelle "Labelimport"

Jetzt suche ich schon einen ganzen Tag lang und scheitere wahrscheinlich an der Vielfalt der Dialekte im Vba:
DAO, ADO, SQL etc.

Gruß Lutz (dolpho)
Fragen werden im Forum behandelt. Ein angeforderter persönlicher Service sollte auch ein Bezahlangebot einschließen.

Der Codeausschnitt, den Du gefunden hast, ist doch schon nah an einer Verwendbarkeit.
Offene Probleme:
- Den Variablen sFile und sTable musst Du vor Verwendung der SQL-Anweisung (das erfolgt mit Öffnen des Recordsets) konkrete Inhalte zuweisen, die man vorher bestimmen müsste. Variablen wurden eingeführt, damit man auf sich ändernde Arbeitsmappen und ändernde Tabellenblätter reagieren kann.
- excel 8.0 müsste auf excel 12.0 xml geändert werden, um das neuere Excelformat XLSX lesen zu können
- Der gezeigte Pfad zur Excelmappe sieht wie eine Internetadresse aus. Ich bin im starken Zweifel, ob VBA eine solche Adresse unmittelbar verwerten kann.
=> Prüfen! Notfalls erst herunterladen in das Filesystem oder einen alternativen Zugriff finden, der die Datei von dieser Adresse direkt lesen kann und seinerseits eine von Access lesbar Tabelle anbietet. Power Query in Excel sollte dazu in der Lage sein.
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: dolpho am August 10, 2023, 07:46:52
@ebs17 sorry für die PM, ich werds beherzigen oder Dir nen Kasten Bier über den Zaun stellen, wenn ich mal wieder durch Freiberg fahre und DANKE!

Hallo,
vielleicht bin ich der Lösung schon nahe.
Den Pfad habe ich geprüft mit:
Dim strDateiName As String
Dim strDateiExistiert As String
Dim Name As String
Name = "Neu"
    strDateiName = "\\ad001.test.net\dfs001\File\DE\MST\Bezold\Etiketten\Neu\EXPORT.XLSX"
    strDateiExistiert = Dir(strDateiName)

  If strDateiExistiert = "" Then
        MsgBox "Die ausgewählte Datei existiert nicht"
    Else
        MsgBox "Die ausgewählte Datei existiert"
    End If
End Sub

und bekomme die Meldung "Die ausgewählte Datei existiert"

Dann habe ich den anderen Code umgebaut und bin mir keines Fehlers bewusst:

Public Function FieldsExists(ByVal sFile As String, _
            ByVal sTable As String) As Boolean
  Dim rs As DAO.Recordset
  Dim bLagertyp As Boolean
  Dim i As Long
    sFile = "\\ad001.test.net\dfs001\File\DE\MST\Bezold\Etiketten\Neu\EXPORT.XLSX"
    sTable = Sheet1
  Set rs = CurrentDb.OpenRecordset( _
      "SELECT T.* FROM [excel 12.0 xml;hdr=yes;imex=2;DATABASE=" & sFile & _
      "].[" & sTable & "$] AS T")
  With rs
      For i = 0 To .Fields.Count - 1
        Debug.Print .Fields(i).Name
        If .Fields(i).Name = "Lagertyp" Then bLagertyp = True
      Next
  End With
  If bLagertyp Then FieldsExists = True
  Set rs = Nothing
End Function

Wenn ich die Funktion aber jetzt aufrufe, bekomme ich die Meldung:

fehler beim kompilieren argument ist nicht optional

Anmerkung: Bitte wegen der besseren Übersicht die Codetags des Forum benutzen. MzKlMu
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: ebs17 am August 10, 2023, 11:41:38
Public Function FieldsExists(ByVal sFile As String, _
            ByVal sTable As String) As Boolean
Du hast hier eine schöne Funktionsdeklaration. Diese musst Du dann aber auch anwenden wie geschrieben. Anwenden heißt hier, die Argumente bei Funktionsaufruf mitgeben. Die interne Zuweisung an sFile und sTable ist Unsinn (Foulspiel).

Also in einer übergeordneten Prozedur so etwas:
If FieldsExists("\\ad001.test.net\dfs001\File\DE\MST\Bezold\Etiketten\Neu\EXPORT.XLSX", "Sheet1") Then
   ' abbrechen
Else
   ' weitermachen
End If
Angemerkt:
- Da sTable als String deklariert ist, muss da auch ein String übergeben werden.
- Der Name FieldExists der Funktion würde nahelegen, dass man auf beliebige Feldnamen testen könnte, nicht nur auf einen hardcodierten. Es würde sich also die Verwendung eines dritten Arguments FieldName förmlich aufdrängen - was hier im konkreten Fall keinen Zusatzeffekt bringt, aber generell die Funktion universaler macht.

Zitates kann passieren, dass diese Daten falsch aus dem SAP exportiert werden
Es gibt nicht nur einen Fehler, den man machen kann.
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: dolpho am August 10, 2023, 12:21:37
jetzt habe ich es verstanden!
mit war nicht klar, wie und wann ich die Argumente in diesem Fall übergeben muss.

Danke!

In diesem speziellen Fall muss man bei Export aus SAP eine spezielle Version wählen.
wenn man es vergisst, diese auszuwählen, hat man die Spalte Lagertyp und wenn es richtig war, hat man sie nicht. Somit kann man also nur EINEN Fehler machen.

Gruß Lutz
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: ebs17 am August 10, 2023, 19:04:38
Wenn die anderen Felder bekannt sind und gleich bleiben, würde mich ein zusätzliches Feld in der Exceltabelle nicht stören. Abhängig vom Import würde man z.B. bei einer Anfügeabfrage eine saubere Zuordnung von jeweils Quellfeld und Zielfeld vornehmen und könnte derart Überflüssiges einfach ignorieren.
Titel: Re: Kontrolle und Datenimport per VBA aus Excel
Beitrag von: dolpho am August 11, 2023, 07:13:40
Hallo Ebs,

darum geht es gar nicht. In diesem Fall wird die Datenbank als Werkzeug missbraucht. Unser Auftraggeber ist nicht in der Lage, uns ein vernünftiges Einlagerungsetikett über SAP zu erzeugen. Im Gegensatz zu Excel oder Word kann aber Access sehr gut mit Etikettendruckern kommunizieren. Also exportiere ich die Daten aus SAP in eine Datei namens "EXPORT" und brauche dafür bestimmte Felder. Dann lösche ich in der Datenbank alle Daten. und importiere diese "Export" und das alles mit möglichst wenig manuellen Arbeitsschritten. Vorher prüfe ich, ob der Export in einem bestimmten Format stattgefunden hat und über ein Auswahlformular kann ich dann für die Einlagerungsware vernünftige Etiketten erzeugen.

Na dann ein herzliches Grüß Gott, wie man hier sagen würde.

Gruß Lutz