www visual son sirve qué que principales para net los epass ejemplo cuáles conforman excel vba excel-vba ms-access access-vba

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