excel - visual - ¿Por qué mi conexión de acceso ADO está dando resultados diferentes que la misma consulta ejecutada en la aplicación de acceso?
visual ado net (1)
Cambie [Enroll Date] = ''''
de IsNull([Enroll Date])
[Enroll Date] = ''''
a IsNull([Enroll Date])
en su declaración IIF
.
En este caso, sospecho que [Enroll Date]
tiene el formato de Acceso como Date
y Date
los tipos de datos no pueden tener un valor de ''''
(o una cadena vacía). Es una fecha válida o nula.
Dicho esto, al transferir datos entre Access y Excel, debe obtener los tipos de datos al instante en cada sistema para que funcione correctamente. No puedo darle una explicación decente aquí, pero si busca en Google, puede encontrar muchas cosas sobre temas relacionados con el tipo de datos al transferir datos de Excel a Access.
He estado tratando de resolver esto durante más de un día y siento que la respuesta se reduce a cómo Access maneja los tipos de datos, pero aún no me he dado cuenta. Simplifiqué el problema con la esperanza de que sea más fácil de resolver. Tengo 2 columnas en un libro de trabajo de Excel: la columna A es Texto y la columna B son las fechas. Básicamente, solo quiero seleccionar las fechas de la Columna B cuando la Columna A no es nula. Esto funciona bien en teoría, pero no para situaciones reales con las que me estoy encontrando.
Ejemplo: en lugar de que la columna B sea todas las fechas, uno de los valores de la columna B es simplemente una cadena nula. Para manejar esto, simplemente agregué una declaración IIF de que si la columna B es =''''
hazlo 0:
querystr = "Select IIF([Enroll Date] = '''',0,[Enroll Date]) As vdate FROM [Sheet1$] where [Account Number] IS NOT NULL"
Esta consulta funciona perfectamente bien cuando importo la hoja de cálculo a Access, pero cuando la uso con una conexión ADO para Excel VBA, todos los registros vuelven como Empty
, a excepción de la cadena de longitud cero que devuelve nulo. Este submarino configurará el libro completo para usted y lo demostrará todo:
Sub flow()
Dim con As Object
Dim rec As Object
Dim path As String
Dim y As Integer: y = 1
Dim sht1 As Worksheet
Set sht1 = ActiveSheet
path = SetData()
Set con = CreateObject("ADODB.Connection")
Set rec = CreateObject("ADODB.Recordset")
con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & ";" & _
"Extended Properties=" & Chr(34) & "Excel 12.0 Xml;HDR=YES" & Chr(34) & ";"
con.Open
querystr = "Select IIF([Enroll Date] = '''',0,[Enroll Date]) As vdate FROM [Sheet1$] where [Account Number] IS NOT NULL"
rec.Open querystr, con
Range("D2").CopyFromRecordset rec
''every record is blank
rec.Close
rec.Open querystr, con
Do Until rec.EOF
y = y + 1
If IsEmpty(rec.Fields("vdate")) Then
Range("G" & y).Value = "Empty"
ElseIf IsNull(rec.Fields("vdate")) Then
Range("G" & y).Value = "Null"
End If
rec.movenext
Loop
End Sub
Function SetData() As String
Dim sht1 As Worksheet: Set sht1 = ThisWorkbook.Sheets(1)
With sht1
.Columns.Item("A").NumberFormat = "@"
.Columns.Item("B").NumberFormat = "m/d/yyyy"
.Range("A1").Value = "Account Number"
.Range("B1").Value = "Enroll Date"
.Columns("A:B").AutoFit
For x = 1 To 5
.Range("A" & x + 1).Value = x
Next x
Union(.Range("B2:B4"), .Range("B6")).Value = DateSerial(2016, 4, 1)
''change B5 to accounting format
.Range("B5").NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
.Range("B5").Value = vbNullString
End With
With ThisWorkbook
.Save
SetData = .FullName
End With
End Function