Excel to Access "Nullwerte"
15.08.2018 12:02:07
Marco
ich versuche Daten von Excel auf Access zu transferieren. Später werde die Daten in Access über ein anderen Programm (DBxtra) abgerufen. Letztere benutzt dabei selbige Sprache/Syntax wie Access.
Der Großteil der Daten in Excel sind zwar Zahlen, weil mit denen aber nicht gerechnet wird, werden sie als Text abgespeichert.Zahlen mit denen ich später doch mal rechnen müsste, werden beispielsweise mit CDbl(Ausdruck) konvertiert. Klappt auch problemlos.
Schwierigkeiten habe ich bei unvollständigen Einträgen. Die Zahl der Spalten und Reihen sind in fast allen Fällen fix und fast alle Zellen haben einen Wert. Es gibt jedoch wenige Ausnahmen, manche Spalten haben nur in 4 der 12 Zeilen Werte. Bei den 12 Zeilen handelt es sich um die Monate Januar bis Dezember, weil aber erst April ist, werden nur die Daten bis eben April angegeben. Ausstehende Daten werden als vbNullString übergeben. Muss aber in diesen Fall gerechnet werden und die Textfelder wieder in Zahlen konvertiert werden, wird das später beim Abruf in DBxtra kritisch. Die vbNullString Werte werden wohl als 0 aufgenommen statt "nix" und deswegen nicht angezeigt. Angezeigt wird lediglich Januar bis April. Ich will jedoch alle 12 Zeilen anzeigen lassen, Spalten wo es keine Daten gibt bleiben halt "echt" leer. Der Code unten entspricht der Situation wie oben beschrieben. Ich habe mich mit IsNull oder ähnliches versucht, um einfach leere Inputfelder zu übergeben, leider ohne Erfolg. Diese Codezeilen habe daher wieder rausgenommen.
Sub PushTableToAccess()
Dim cnn As ADODB.Connection
Dim MyConn
Dim rst As ADODB.Recordset
Dim i, j, k, m As Long
Dim RowNumber, ColNumber As Long
'get all relevant database worksheet names (starting with DB)
Dim SheetNameCol As Collection
Set SheetNameCol = New Collection
Dim tempName As String
j = 0
For i = 1 To Sheets.Count
tempName = Left(Sheets(i).Name, 2)
If tempName = "DB" Then
j = j + 1
SheetNameCol.Add Sheets(i).Name
End If
Next i
'create the connection to the database
Set cnn = New ADODB.Connection
MyConn = ThisWorkbook.Path & Application.PathSeparator & TARGET_DB
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Open MyConn
End With
'go to the correct sheet and determine the # of used rows and columns
For m = 1 To SheetNameCol.Count
ActiveWorkbook.Worksheets(SheetNameCol(m)).Activate
RowNumber = Range("A65536").End(xlUp).Row 'row number
ColNumber = FieldNameNumber(SheetNameCol(m)) 'columns number
'create the recordset
Set rst = New ADODB.Recordset
rst.CursorLocation = adUseServer
rst.Open Source:=SheetNameCol(m), _
ActiveConnection:=cnn, _
CursorType:=adOpenDynamic, _
LockType:=adLockOptimistic, _
Options:=adCmdTable
'Load all records from Excel to Access,
'by looping through the rows and columns
For i = 2 To RowNumber
rst.AddNew
'field headings are in row 1 of the worksheet.
For j = 1 To ColNumber
If Cells(i, j).Value = "" Then
rst(Cells(1, j).Value) = vbNullString
Else: rst(Cells(1, j).Value) = Cells(i, j).Value
End If
Next j
rst.Update
Next i
' Clean up
rst.Close
Set rst = Nothing
Next m
cnn.Close
Set cnn = Nothing
End Sub