Probleme bei Auslesen einer Excel-Tabelle via VB mit leeren Feldern

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von tulla.

    Probleme bei Auslesen einer Excel-Tabelle via VB mit leeren Feldern

    Hallo,

    als Neuer mit Erstkontakt zu diesem Forum möchte ich erst einmal allen Helfenden jetzt schon für Ihre Hilfe danken. Für Euch vieleicht eine Kleinigkeit, ich bekomme es nicht hin:

    Mit folgender Programmierung baue ich eine Verbindung in VB zu einer Exel-Tabelle her (den Rest drum herum spare ich mir mal):

    con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Pfad_und_Dateiname.xls & ";Extended Properties='Excel 8.0;IMEX=1;ImportMixedTypes=Text'"
    cmd.Connection = con
    con.Open()
    SchemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})


    Tabelle = SchemaTable.Rows(0)!TABLE_NAME.ToString.Trim("'") 'Der Tabellenblattname !
    cmd.CommandText = "Select F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,F13 From [" & Tabelle & "A6:M]" 'Ab Zeile 6 beginnt der Inhalt (ja nur eine Zeile)
    reader = cmd.ExecuteReader()

    Mit folgendem Befehl kann ich ein Feld ausgeben:

    MsgBox((reader("F11")))

    Jetzt kommt es aber. Solage die Felder gefüllt sind funktioniert es. Wenn aber ein Feld leer ist kommt es zu der Fehlermeldung:

    'Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben'

    Weil ja in F11 Nichts (Null?) ist. IsDBNull geht nicht da gleiches Problem. Also wollte ich in der Select-Abfrage bereits sie Null-Werte ersetzen.....
    Aber Select IsNull(F11,'leer') kennt er hier nicht. Nz (aus MSAcess) erkennt er auch nicht.

    Kurz gesagt und gefragt: Wie mache ich aus diesen leeren Felder bereits in der Select-Abfrage für VB nutzbare Inhalte wie 'leer' oder 0 ?

    Über Ideen wäre ich sehr dankbar.

    Michael

    Leider genau das Problem

    Hallo,

    Vielen Dank für Deine Antwort. Aber genau die ist das Problem.
    Die Funktion IsNull will zwingend einen Parameter haben. Und das ist F11 in der Klammer.
    F11 ist aber nichts, Null, nicht definiert und somit hier nicht gültig.
    Ich muss bereits in der Abfrage , in der Select Abfrage überhaupt etwas zuweisen. Wenigstens Null.

    So geht es leider nicht.
    Alle Eure Lösungsvorschläge basieren auf Funktionen die den Wert F11 überprüfen. IsNull, DBNull, usw..
    Hier ist aber bereits das Problem. F11 ist kein gültiger Parameter, nicht definiert, funktioniert einfach nicht. D.h. es steht bei jedem Befehl endgültig IsNull(), DBNull(), usw.. und das funzt nicht.

    Ich vermute ich habe bereits einenFehler in der connection zur Excel-Tabelle und zwar hier im SQL-String.

    Ich lese in Zeile 6 die Spalte A - M ein. Diese sind 'LEER' und somit habe ich KEINE Spaltenüberschriften und definiere diese mit F1 bis F13 per Hand in der SQL-Abfrage
    Wenn er jetzt die nächste Zeile, Zeile 7 ausliesst, bekommt er mal Werte: Funktioniert alles- und mal keine: Führt zum Fehler.

    Ich glaube durch den fehlenden Inhalt wird in diesem Moment das Feld F11, deren Inhalt leer ist, nicht sauber definiert. Nicht einmal als NULL?!

    Somit würde ich gerne bereits IN der SQL-Abfrage den leeren Werten einen Wert zuweisen. Ich kenne 'Select IsNull(F11,"Leer")' aus meinem SQL-Wissensstand. Der funktioniert in Excel aber nicht.

    Kurz gefragt: mit welchem Select - Befehl, der in Excel Funktioniert, kann ich Null-Werte ersetzen?
    So, du redest immer von Zeile 6
    Setz mal deinen Code in einen VB Tag so wie hier:

    Visual Basic-Quellcode

    1. con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Pfad_und_Dateiname.xls & ";Extended Properties='Excel 8.0;IMEX=1;ImportMixedTypes=Text'"
    2. cmd.Connection = con
    3. con.Open()
    4. SchemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
    5. Tabelle = SchemaTable.Rows(0)!TABLE_NAME.ToString.Trim("'") 'Der Tabellenblattname !
    6. cmd.CommandText = "Select F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,F13 From [" & Tabelle & "A6:M]" 'Ab Zeile 6 beginnt der Inhalt (ja nur eine Zeile)
    7. reader = cmd.ExecuteReader()
    8. Mit folgendem Befehl kann ich ein Feld ausgeben:
    9. MsgBox((reader("F11")))


    Du kannst vor deiner Abfrage jeder "Variable" einen Wert zuweisen:

    Visual Basic-Quellcode

    1. F1 ="0"
    2. F2="0"
    3. ...

    Wenn ich deinen Code nehme und in VBA Excel kopiere wird mir erstmal falscher Syntaxy bei der Zeile "SchemaTable" angezeigt. Bist dir sicher das du in VBA bist oder in VB2008/2010/2012
    Zum anderen ließt du mit deiner Abfrage nur eine zeile aus, zumindest kann ich es nicht sehen wo die Schleife ist die das Dateineinlesen mit movenext weiter treibt?
    Hallo Tulla,

    ich muss zu meiner Schande eingestehen, dass ich gar nicht genau sagen kann in welchen VB - Umfeld ich mich genau befinde. Ich programmiere in einer Warenwirtschaft Namens SAP B1 die VB zulässt. Sorry.
    Die meisten nutzbaren Befehle kommen aus dem MSDN (Visual Studio?!). Also Dr. Google.

    Zu Deiner Frage.

    Ja ich lese NUR eine Zeile aus. Das ist ein Kontrollprogramm ob in Zeile 7 Überschriften überhaupt vorhanden sind. Später folgt dann in einem weiteren Programm das auslesen sämtlicher Daten.

    Deine Idee mit der vorherigen Zuweisung von Werten (F11="String") funktioniert leider auch nicht. Es kommt zum Typenkonflikt. Was darauf hindeutet, das VB aus dem leeren Feld F11 einen Typen macht der mir unbekannt ist.

    Ist nicht irgendwie die Select-Abfrage anfassbar???
    Der Typenkonflikt war klar. Denn du Fragst in der Select ja die Felder mit Namen ab, sprich Spaltenname in deinem Fall F1 bis F12.

    Das F1="0" sollte mal zeigen, dass das keine Variable ist.
    Wenn du sagen würdest

    Visual Basic-Quellcode

    1. dim MeineErsteSpalte as String
    2. 'nach der Abfrage
    3. MeineErsteSpalte=F1
    4. i


    sollte er dir die Variable MeineErsteSpalte mit leer ausgeben.

    Erschwerend kommt dazu, dass du garnicht weist in welchm Umfang dein Programm die "gedultete" VB syntax unterstützt.
    In der Regel sind es die Mindestanforderungen von VB 6.0 bzw VBA(Visual Basic for Aplications) ist ein beschränkte VB befehlssatz und nicht so komplex wie Visual Studio als komplette Entwicklungsumgebung vorhanden.
    VBA ist in jedem OfficeProdukt(Excel, Access, Word, PowerPoint,Outlook...) von MS hinterlegt und kann mit der Tastenkobination ALT+F11 aufgerufen werden.