** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Renombrar los campos de una tabla importada Excel
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Renombrar los campos de una tabla importada Excel

 Responder Responder
Autor
Mensaje
Teruel Ver desplegable
Nuevo
Nuevo


Unido: 29/Marzo/2021
Localización: ALCAÑIZ
Estado: Sin conexión
Puntos: 3
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Teruel Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Renombrar los campos de una tabla importada Excel
    Enviado: 30/Marzo/2021 a las 19:55
Buenas tardes, primero me presentare y daré las gracias a todos los usuarios del foro porque antes de registrarme algunos temas me han aportado soluciones..., espero poder ayudar en lo posible..., voy al tema que me esta dando problemas...

Tengo que renombrar los campos de una tabla que importo desde EXCEL a ACCESS, el codigo no me da errores, pero el problema es que solo me actualiza el valor del ultimo campo de los ficheros de importación y como soy mas o menos novato en VBA, no tanto en lo que a ACCES se refiere..., no logro encontrar porque solo me actualiza el ultimo valor. Pego el codigo vba y a ver si alguien me puede decir el problema....

Private Sub Comando23_Click()
'Renombrar los campos de la tabla creada al importar, primero tenemos que encontrar el campo donde coincide con el nombre anterior en la tabla Empresa 

'Defino la base de datos a usar
    Dim dbs As DAO.Database
 
'Defino los archivos de datos 1 y 2 para la tabla empresas rst2 y para la tabla de la importacion rst
    Dim rst As DAO.Recordset
    Dim rst2 As DAO.Recordset
 
'Defino la variable para recorrer los campos de la tabla importada y que me devuelva luego los nombre de campo
    Dim emp_camp As Long
 
'Defino la variable para establecer el nombre del campo que cada vez que se ejecuta for to
    Dim nom_emp_camp As String
 
'Defino variable para registrar el nombre del fichero importado segun el formulario actual
    Dim importa_excel As String
 
'Defino las variables para las consultas a los recordsets que establecere antes de ejecutar for to
    Dim mycondition As String
    Dim mycondition2 As String
        
'Establezco el nombre del archivo importado en la variable para llamarlo mas tarde
    importa_excel = Me.NOMARCHI
      
'Establezco las conciciones de los recordsets en funcion de los valores del formulario (nomarchivo = tabla importada de excel) (EMPRESA = al codigo de empresa dentro de la TABLA EMPRESAS, con el fin de que solo me devuelva una linea de registros y poder  'establecer la comparacion del valor del campo
 
    mycondition = "SELECT * FROM " & Me.NOMARCHI
    mycondition2 = "SELECT * FROM EMPRESAS WHERE CODIGO =" & Me.EMPRESA
    

    Set dbs = CurrentDb

'Defino los recordsets a utilizar
    Set rst2 = dbs.OpenRecordset(mycondition2, dbOpenSnapshot)
    Set rst = dbs.OpenRecordset(mycondition, dbOpenSnapshot)

'Paso por todos los campos para encontar coincidentes
    For emp_camp = 0 To rst.Fields.Count - 1
     
'Vuelvo a declarar el recordset rst ya que sino lo cierro si coinciden despues de encontrar la coincidencia me da error por no poder editar si la tabla esta abierta, ya que quiero modificar los nombres de los campos de la tabla importada.
          Set rst = dbs.OpenRecordset(mycondition, dbOpenSnapshot)

'comparo los campos de la tabla empresas donde previamente he establecido en determinados campos los nombres que corresponderan con la columna (campo) de la tabla importada y que luego utilizare para generar mi archivo de exportacion a otro programa
       If rst2.Fields(emp_camp).Value = dbs.TableDefs(importa_excel).Fields(emp_camp).Name Then

'cierro el recordset para evitar el errror de que esta abierto por otro proceso y poder modificar los nombres de los campos de la tabla
          rst.Close

'Declaro el nombre del campo que quedara establecido para cada for to
          nom_emp_camp = rst2.Fields(emp_camp).Name

'modifico el nombre en la tabla importada de excel
          dbs.TableDefs(importa_excel).Fields(emp_camp).Name = nom_emp_camp
     
       Else
'si no coincide no hago nada
       End If
          
     Next emp_camp
     
'Cierro la dbs y la rst2 para liberar memoria
    dbs.Close
    rst2.Close
    
'reseteo todo a nothing
    Set rst = Nothing
    Set rst2 = Nothing
    Set dbs = Nothing
    
    
End Sub

Igual lo he enrevesado algo pero creo que se ve lo que pretendo... Gracias de nuevo a todos

Saludos.

TERUEL_SDF
Teruel!!! JEJEJE
Arriba
acilu55 Ver desplegable
Habitual
Habitual


Unido: 27/Septiembre/2011
Estado: Sin conexión
Puntos: 154
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita acilu55 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 02/Abril/2021 a las 14:29
¿has probado enrevesarlo mas con 
 For emp_camp = 0 To rst.Fields.Count 
e interceptar el error al no haber mas  campo?  Así guardará también el último
Gracias a todos de antemano
Arriba
Teruel Ver desplegable
Nuevo
Nuevo


Unido: 29/Marzo/2021
Localización: ALCAÑIZ
Estado: Sin conexión
Puntos: 3
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Teruel Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Abril/2021 a las 19:35
Gracias por tu respuesta al final me di cuenta que estaba liando conceptos y conseguí sacar el codigo...

Pego aqui la solucion de lo que queria hacer realmente. (aun asi puede que continue algo enrevesado)

'Renombrar los campos de la tabla creada al importar, primero tenemos que encontrar el campo donde
'coincide con el nombre anterior en la tabla Empresa
 'Defino la base de datos a usar
    Dim dbs As DAO.Database
 
 'Defino los archivos de datos 1 y 2 para la tabla empresas rst2 y para la tabla de la importacion rst
    
    Dim rst2 As DAO.Recordset
 
 'Defino la variable para recorrer los campos de la tabla empresas para obtener el valor que luego comparare con la tabla importada
    Dim emp_camp As Field
    Dim valor_emp_camp As Variant
    
 'Defino la variable para recorrer los campos de la tabla importada y que me devuelva luego los nombre de campo
    Dim camp_excel As Field
    Dim valor_camp_excel As Variant
    
 
 'Defino la variable para establecer el nombre del campo que cada vez que se ejecuta for to
    Dim nom_emp_camp As String
 
 'Defino variable para registrar el nombre del fichero importado segun el formulario actual
    Dim IMPORTA_EXCEL As String
 
 'Defino las variables para las consultas a los recordsets que establecere antes de ejecutar for to
    
    Dim mycondition2 As String
        
 'Establezco el nombre del archivo importado en la variable para llamarlo mas tarde
    IMPORTA_EXCEL = Me.NOMARCHI
    
 
      
 'Establezco las conciciones de los recordsets en funcion de los valores del formulario (nomarchivo = tabla importada de excel)
 '(EMPRESA = al codigo de empresa dentro de la TABLA EMPRESAS, con el fin de que solo me devuelva una linea de registros y poder
 'establecer la comparacion del valor del campo
 
    mycondition2 = "SELECT * FROM EMPRESAS WHERE CODIGO =" & Me.EMPRESA
    
 
    Set dbs = CurrentDb
 'Defino los recordsets a utilizar
    Set rst2 = dbs.OpenRecordset(mycondition2, dbOpenSnapshot)
    
 'Paso por todos los campos para encontar coincidentes
    
    For Each emp_camp In rst2.Fields
 'Establezco la variable para el valor del campo de la tabla empresas
        val_emp_camp = emp_camp
 'Anido la funcion de busqueda dentro de la anterior para que recorra para cada registro de empresas la tabla importada y sus campos
            For Each camp_excel In dbs.TableDefs(IMPORTA_EXCEL).Fields
 'Establezco la variable del campo cada vez que lo recorre para luego usarlo en la comparacion
                 valor_camp_excel = camp_excel.Name
 'Comparo las dos variables y si coinciden le digo que renombre el campo en la tabla importada
                    If val_emp_camp = valor_camp_excel Then

                        nom_emp_camp = emp_camp.Name
                                                
                        dbs.TableDefs(Me.NOMARCHI).Fields(valor_camp_excel).Name = nom_emp_camp
                     
                           
                    End If
                
            Next camp_excel
               
     Next emp_camp
     
        
    'Cierro rst2 para liberar memoria
    rst2.Close
    Set rst2 = Nothing

Teruel!!! JEJEJE
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable