Frage

Ich versuche, eine Tabelle mit Werten aus einer Excel (2003) Tabelle zu extrahieren VB6, das Ergebnis in einem (adodb)-Cord gespeichert werden muss. Die Tabelle sieht wie folgt aus:

    Name   Option.1  Option.2  Option.3  Option.4  Option.5  Option.6 
    -----------------------------------------------------------------
    Name1         2         3         4
    Name2         2         3         4
    Name3         2         3         4
    Name4         2         3         4
    Name5         2         3         4
    Name6         2         3         4
    Name7         2         3         4
    Name8         2         3         4
    Name9         2         3         4         5         6         7  

Nach dem Verbinden und Ausführen der Abfrage „SELECT * FROM [Sheet1$]“ oder sogar eine Spalte spezifische „SELECT [Option#6] FROM [Sheet1$]“ (siehe Fußnote 1) und Looping durch die Ergebnisse bin ich Null Werte für die Zeile Name9 gegeben, Option.4 -> Option.6 statt die richtigen Werte 5, 6 und 7. Es scheint, die Verbindung zu der Tabelle mit einem „best guess“ zu entscheiden, verwendet, was die gültige Tabelle Grenzen sind, und dauert nur eine bestimmte Anzahl von Zeilen zu berücksichtigen.

, um die Tabelle zu verbinden, ich habe beiden Verbindungsanbieter Microsoft.Jet.OLEDB.4.0 und MSDASQL versucht, und das gleiche Problem bekommen.

Hier sind die Verbindungseinstellungen verwende ich:

Set cn = New ADODB.Connection
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & filePath & ";Extended Properties=Excel 8.0;"
    - - - - OR - - - - 
    .Provider = "MSDASQL"
    .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
                        "DBQ=" & filePath & ";MaxScanRows=0;"
    .CursorLocation = adUseClient
    .Open
End With  
Set rsSelects = New ADODB.Recordset
Set rsSelects = cn.Execute("SELECT [Option#5] FROM " & "[" & strTbl & "]")

Dieses Problem tritt nur, wenn es mehr als 8 Zeilen (mit Ausnahme der Spaltennamen), und ich habe MaxScanRow=0 für die MSDASQL Verbindung gesetzt, aber dies hat die gleichen Ergebnisse.

Bemerkenswerte Projektreferenzen Ich habe enthalten sind:

  • MS ActiveX Data Objects 2.8-Bibliothek
  • MS ActiveX Data Objects Recordset 2.8 Bibliothek
  • MS Excel 11.0 Object Library
  • MS Data Binding-Sammlung VB 6.0 (SP4)

Jede Hilfe in dieser Angelegenheit wäre sehr geschätzt!

(1) Aus irgendeinem Grund, wenn ein Komma in dem Spaltennamen einschließlich, es als # interpretiert wird.


Danke an alle! Auf halbem Weg durch versuchen, einen Schema.ini "programmatisch" von KB155512 onedaywhen ist ausgezeichnet post wies mich auf die Lösung:

.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & filePath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Ich würde jemand mit ähnlichen Problemen ermutigen, die Post und Kommentare zu lesen, da es leichte Abweichungen von einer Person zur anderen zu einer Lösung sind.

War es hilfreich?

Lösung

Sie sind richtig: es den Datentyp auf einer Anzahl von Zeilen basiert erraten. Es gibt lokale Maschine Registrierungsschlüssel Sie in der Lage sein können, zu verändern gewählt, um den Datentyp zu beeinflussen. Weitere Einzelheiten finden Sie unter diese Antwort .

Andere Tipps

Die Excel-ISAM-Treiber sucht standardmäßig in die erste Handvoll Ihre Zeilen und errät ihre Datentyp. Sollte sie (später in der Tabelle) Daten, die nicht in die ursprüngliche Annahme passen, es runzelt die Stirn und wendet es auf NULL.

Ihre MaxScanRows=0 Einstellung ist der Schlüssel zu diesem Problem. Es klingt wie es das Richtige (scannen die gesamte Tabelle für den Datentyp zu verwenden) tun würde, aber eigentlich ist es nicht.

Siehe onedaywhen 's Antwort für die weitere Details, meine ersten Informationen über KB282263 war nicht die richtige Beratung.

Der beste Rat, den ich Ihnen geben kann, ist, es zu tun in der VB6-Umgebung zu stoppen. Öffnen Sie Excel, drücken Sie ALT + F11 und die VBA-IDE laden. Setzen Sie den Code in dort. Innerhalb dieser Umgebung können Sie das vollständige Excel-Objektmodell zugreifen.

Ich habe viele Menschen versuchen, zu sehen und die Interaktion mit Excel auf viele verschiedene Arten und sie haben alle Probleme. entweder die VBA-Makro oder Add-in-Methode ist eine beste Weise, die ich auf die Daten des Erhaltens gefunden haben. Es ist, wie Microsoft Excel erhalten und Projekt mit TFS zu integrieren.

Manchmal müssen Sie den Prozess ein wenig für diesen Ansatz zu überdenken geeignet sein. Z.B. Möglicherweise müssen Sie den Benutzer erhalten, die die Tabelle wird mit einem Makro auszuführen, die die Daten aus der Tabelle schieben werden, anstatt Sie einen Prozess läuft die Daten aus der Tabelle zu ziehen, aber in der Regel ist es durchaus machbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top