una traer tabla registro insertar funcion formulario donde dlookup datos cuadro campo busquedas busqueda buscar vba ms-access access-vba recordset

traer - ir a registro access vba



MSAccess 2010+VBA: el valor no es una propiedad predeterminada del objeto de campo del conjunto de registros (1)

Como rs("MyField") es un objeto Field , si lo haces ...

MsgBox TypeName(rs("MyField"))

... El acceso le dirá que su tipo es Campo .

Así que TypeName() es un ejemplo donde el objeto mismo se referencia directamente en lugar de su propiedad predeterminada .Value .

Pero algo así como Debug.Print siempre hace referencia a .Value , por lo que Debug.Print rs("MyField") es lo mismo que Debug.Print rs("MyField").Value

Si sabe exactamente cuándo se hará referencia implícita a .Value y cuándo no, puede agregarlo solo cuando sea absolutamente necesario y omitirlo el resto del tiempo.

Sin embargo, algunos desarrolladores de Access recomiendan incluir siempre .Value para evitar dicha confusión. Si eso te parece demasiado esfuerzo, al menos considera incluir .Value cuando .Value una tarea ...

something = rs("MyField").Value

... y esté atento a cualquier otro contexto en el que no obtenga lo que desea sin .Value

Necesitaba copiar algunos valores de la tabla de MS Access en Excel usando el código VBA. Lo había hecho muchas veces y me consideraba experimentado. En mi código exporto los datos usando las siguientes declaraciones:

sh.range("A" & row).Value = rs("MyField")

donde sh es la hoja de Excel, la fila es entera (larga) y rs es el conjunto de registros (DAO o ADO, sin ningún efecto sobre el problema considerado).

Mi código funcionó bien en mi computadora con MS Office 2007 instalado. Pero cuando mi cliente ejecutó el código en su máquina con MS Office 2010, falló y siguió fallando de forma muy aleatoria. Por ejemplo, al depurar VBA en el módulo MS Access paso a paso presionando F8, siempre funcionó. Pero cuando presioné ''ejecutar'' F5, falló muy pronto.

Después de muchas pruebas y errores (traté de abrir el conjunto de registros usando diferentes opciones y tipos de conjuntos de registros y el almacenamiento en caché de los registros, etc.), finalmente encontré que si escribo

sh.range("A" & row).Value = rs("MyField").Value

todo funciona bien. Pero de acuerdo con los documentos (por ejemplo, http://msdn.microsoft.com/en-us/library/office/ff197799(v=office.15).aspx ), la propiedad Value es la propiedad predeterminada del objeto de campo, que en turn es la colección predeterminada del objeto recordset.

Pero parece que no puedo confiar en la predeterminación, que he estado haciendo en la mayor parte de mi código. De hecho, encontré una solución a mi problema, pero aún no tengo idea de la causa. ¿Alguien sabe por qué el código está haciendo esto? ¿Cuál es el problema?

PD: También encontré que si expandía el enunciado de una línea en dos líneas (tres con declaración):

dim v as Variant v = rs("MyField") sh.range("A" & row).Value = v

también funciona ...