hallo liebes Forum,
vielen Dank erstmal für die Bereitstellung dieses tollen Forums. Die vielen Beiträge hier, haben mir schon bei einigen Problemen diverse Lösungsansätze aufgezeigt. Heute habe ich ein Problem, bei dem ich zwar in Ansätzen schon Lösungen gefunden habe, diese haben mich aber noch nicht vollends zufrieden gestellt.
Zuerst möchte ich mein Problem kurz schildern:
Wir haben hier 1000ende xls-Dateien, welche automatisch über einen vorgelagerten Prozess generiert werden. Die Dateien haben inhaltlich immer den gleichen Aufbau, sind aber inhaltlich schon halbwegs komplex. Beim Öffnen der Datei, wird die Datei für den Endanwender benutzergerecht aufgebaut. Das bedeutet, es werden Felder umformatiert, neue Tabellen generiert und Formeln neu berechnet, da die Daten vorher per ODBC flach in die Datei geschrieben wurden.
U.a. gibt es nun eine neue Anforderung. Zu einem Produkt (ein Produkt bedeutet immer eine xls-Datei) soll beim Öffnen der Datei aus einer zentralen Datei immer ein Abschlag ermittelt werden. Platt gesagt bedeutet dies beim Öffnen einer der vielen Dateien muss aus einer zentralen Datei gelesen werden.
Dazu hatte ich nun geforscht und hatte 3 verschiedene Ansätze gefunden:
1. Ansatz:
INDEX(\'Pfad\[xls-Datei.xlsm]Tabelle1\'!$B:$B;VERGLEICH($A2;\'Pfad\[xls-Datei.xlsm]Tabelle1'!$A:$A;0))
2. Ansatz
Per AdoDB einen SQL absetzen. Also so was in der Art:
Dim SQL As String
Dim Con As String
On Error GoTo errorhandler
If ((GetAttr(Path) And vbDirectory) vbDirectory) Then
SQL = "SELECT" & SelectString & " FROM [" & Table & "$" & SourceRange & "] " & WhereString
If Mid(Path, InStrRev(Path, ".") + 1) = "xls" Then
Con = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Extended Properties=Excel 8.0;" & "Data Source=" & Path & ";"
ElseIf Mid(Path, InStrRev(Path, ".") + 1) Like "xls?" Then
Con = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Extended Properties=""Excel 12.0;HDR=YES"";" & "Data Source=" & Path & ";" & "MODE=READ;"
Else
GoTo errorhandler
End If
Set ExcelTable = CreateObject("ADODB.Recordset")
ExcelTable.Open SQL, Con, 3, 1
Exit Function
End If
errorhandler:
Set ExcelTable = Nothing
3. Ansatz
GetValue = ExecuteExcel4Macro(arg)
(Scheint mir relativ langsam zu sein, daher habe ich das noch nicht näher betrachtet.)
Im Prinzip, muss ich mit einer ID immer nur maximal eine Zeile auslesen. Eigentlich wollte ich den zweiten Ansatz (AdoDB und SQL) verfolgen, habe aber dabei nun die Problematik, dass die Datei scheinbar immer in einem schreibenden Modus geöffnet wird. Auch dann wenn ich die Option "Mode=Read" mitgebe.
Da ich einen relativ großen Anwenderkreis habe (größer 100 Personen), hätte ich die Befürchtung, dass es über kurz oder lang, Zugriffsprobleme auf die zentrale Datei xls-Datei gibt.
Die zentrale xls-Datei in eine echte DB zu wandeln ist mir als Lösungsansatz bewusst, allerdings scheint mir der Aufwand recht hoch, zumal ich ja eigentlich nur aus der Datei lesen möchte? Und ich ja eigentlich auch eine Option dafür habe, die aber scheinbar ignoriert wird.
Könnt Ihr mir an dieser Stelle weiterhelfen? Oder habt Ihr noch andere Lösungsansätze?
Für Eure Unterstützung schon mal vielen Dank im voraus.
Mit freundlichen Grüßen
Manuel