[VBA] Operación no permitida para este tipo de objeto.
Resuelto
ludobalu
Mensajes publicados
286
Estado
Miembro
-
ludobalu Mensajes publicados 286 Estado Miembro -
ludobalu Mensajes publicados 286 Estado Miembro -
Hola,
Recientemente aprendí Visual Basic, pero ahora que lo uso con Access tengo algunos problemas, especialmente porque quiero indicar campos en tablas, etc. ya que no es lo mismo que con Excel, me cuesta un poco. Por lo tanto, espero que me perdonen si alguna vez encuentran mis errores groseros.
Antes de explicar mi problema, les explicaré este contexto:
Tengo una tabla llamada "t_Card" en la que tengo una columna llamada "i_Card" (que corresponde a la clave primaria de esta tabla).
Tengo una segunda tabla llamada "t_Channel" en la que también tengo esta columna "i_Card", son dos tablas relacionadas; a cada valor de i_Card en la tabla t_Card le corresponde uno o más registros de la tabla t_Channel.
Me gustaría poder contar el número de registros no vacíos de la tabla t_Channel para cada valor de i_Card de la tabla t_Card y luego asignar este número en una nueva columna de la tabla t_Card para cada registro.
(Disculpen si me explico mal, pero en resumen, me gustaría mostrar para todos los registros de la tabla t_Card el número de registros no vacíos que les corresponden según la tabla t_Channel)
Aquí está el código que he realizado:
Sub ensayo()
Dim Tarjeta As Object
Dim t_Card As DAO.TableDef
Dim db As DAO.Database
Set db = CurrentDb
Set t_Card = db.TableDefs("t_Card")
For Each Tarjeta In t_Card
'Para cada registro de la tabla t_card, i toma el valor de i_card de la tabla t_card y
'asigna la variable nbre_channels_occupes en el campo channels_occupes de la tabla t_card
i = i_Card.Value
'Cuenta el número total de canales en la tabla t_Channel para t_card.i_card=t_channel.i_card
nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i & '")
'Cuenta el número de canales no ocupados en la tabla t_Channel para t_card.i_card=t_channel.i_card
nbre_channels_vides = DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")
'Calcula el número de canales ocupados en la tabla t_Channel para t_card.i_card=t_channel.i_card
nbre_channels_occupes = nbre_total_channels - nbre_channels_vides
'Para cada valor de i_Card de la tabla t_Card, el campo Total_Channels toma el valor de la variable nbre_channels_occupes
If t_Card.Fields("i_Card") = i Then
t_Card.Fields("Total_Channels") = nbre_channels_occupes
End If
Next Tarjeta
End Sub
El mensaje se encuentra en el "For Each...", aquí está el error que obtengo:
Operación no permitida para este tipo de objeto.
¿Podrían indicarme un elemento de respuesta? ¡Muchas gracias!
Recientemente aprendí Visual Basic, pero ahora que lo uso con Access tengo algunos problemas, especialmente porque quiero indicar campos en tablas, etc. ya que no es lo mismo que con Excel, me cuesta un poco. Por lo tanto, espero que me perdonen si alguna vez encuentran mis errores groseros.
Antes de explicar mi problema, les explicaré este contexto:
Tengo una tabla llamada "t_Card" en la que tengo una columna llamada "i_Card" (que corresponde a la clave primaria de esta tabla).
Tengo una segunda tabla llamada "t_Channel" en la que también tengo esta columna "i_Card", son dos tablas relacionadas; a cada valor de i_Card en la tabla t_Card le corresponde uno o más registros de la tabla t_Channel.
Me gustaría poder contar el número de registros no vacíos de la tabla t_Channel para cada valor de i_Card de la tabla t_Card y luego asignar este número en una nueva columna de la tabla t_Card para cada registro.
(Disculpen si me explico mal, pero en resumen, me gustaría mostrar para todos los registros de la tabla t_Card el número de registros no vacíos que les corresponden según la tabla t_Channel)
Aquí está el código que he realizado:
Sub ensayo()
Dim Tarjeta As Object
Dim t_Card As DAO.TableDef
Dim db As DAO.Database
Set db = CurrentDb
Set t_Card = db.TableDefs("t_Card")
For Each Tarjeta In t_Card
'Para cada registro de la tabla t_card, i toma el valor de i_card de la tabla t_card y
'asigna la variable nbre_channels_occupes en el campo channels_occupes de la tabla t_card
i = i_Card.Value
'Cuenta el número total de canales en la tabla t_Channel para t_card.i_card=t_channel.i_card
nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i & '")
'Cuenta el número de canales no ocupados en la tabla t_Channel para t_card.i_card=t_channel.i_card
nbre_channels_vides = DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")
'Calcula el número de canales ocupados en la tabla t_Channel para t_card.i_card=t_channel.i_card
nbre_channels_occupes = nbre_total_channels - nbre_channels_vides
'Para cada valor de i_Card de la tabla t_Card, el campo Total_Channels toma el valor de la variable nbre_channels_occupes
If t_Card.Fields("i_Card") = i Then
t_Card.Fields("Total_Channels") = nbre_channels_occupes
End If
Next Tarjeta
End Sub
El mensaje se encuentra en el "For Each...", aquí está el error que obtengo:
Operación no permitida para este tipo de objeto.
¿Podrían indicarme un elemento de respuesta? ¡Muchas gracias!
Enlaces relacionados:
- [Excel vba] Problema de asignación de macro -> objeto
- [VBA Excel] número de celdas no vacías en una columna
- VBA Excel, bloquear el clic en los objetos
- Código VBA Excel: Función para sumar una columna.
- Variable de objeto o variable de bloque no definida: Error de ejecución 91
- tipo definido por el usuario no definido
2 respuestas
-
-
Hola,
Gracias por tu respuesta, desde ayer me han ayudado y he llegado a este código:
Opción Comparar Base de Datos
Opción Explícita
Sub ensayo()
Dim sql As String, i As Integer, nbre_total_channels As Integer, nbre_channels_vides As Integer, nbre_channels_occupes As Integer
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("t_Card")
Do Until rst.EOF = False
i = rst.Fields("i_Card")
'Cuenta el número total de canales en la tabla t_Channel para t_card.i_card=t_channel.i_card
nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] =" & i)
'Cuenta el número de canales no ocupados en la tabla t_Channel para t_card.i_card=t_channel.i_card
nbre_channels_vides = DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")
'Calcula el número de canales ocupados en la tabla t_Channel para t_card.i_card=t_channel.i_card
nbre_channels_occupes = nbre_total_channels - nbre_channels_vides
'Para cada valor de i_Card de la tabla t_Card, el campo Total_Channels toma el valor de la variable nbre_channels_occupes
If rst.Fields("i_Card") Then
rst.Fields("Total_Channels") = nbre_channels_occupes
End If
rst.MoveNext
Loop
End Sub
Solo que ya no hay mensaje de error pero no pasa nada, es decir, que la columna Total_Channels que se supone que se debe llenar con la variable nbre_channels_occupes, está vacía, no entiendo por qué...
¿Podrías ayudarme?
¡Muchas gracias de antemano!-
-
Sí, esto sirve para registrar las modificaciones realizadas, pero no hace dichas modificaciones.
Se necesitaría algo como esto:
If rst.Fields("i_Card") Then Escribe el valor de nbre_channels_occupes en el campo Total_Channels de la tabla t_Card para el registro correspondiente rst.Update End If
Solo que lo que está en cursiva no logro traducirlo en VBA, he intentado hacer esto:
rst.Edit.Fields("Total_Channels") = nbre_channels_vides
Y me aparece este mensaje de error (igual al reemplazar Edit por AddNew):Error de compilación: Se esperaba una función o variable.
En cuanto al ".Edit"
¿Tienes alguna idea?
¡Gracias! -
-
He intentado y creo que voy a volverme totalmente loco... Aquí está el mensaje de error que obtengo:
Error de ejecución '3011': El motor de base de datos Microsoft Jet no pudo encontrar el objeto 't_Card.Total_Channels'. Asegúrese de que el objeto existe y que ha escrito correctamente su nombre y su ruta de acceso.
Sin embargo, mi tabla tiene exactamente ese nombre, al igual que la columna que debe llenarse, la prueba está en la imagen:
http://imagik.fr/view-rl/4756
¡Realmente no sé qué hacer, estoy totalmente perdido! -
-