SOLVED

Como crear una relacion 1:1 entre dos tablas en Excel 2016

Brass Contributor

Es posible crear una relación 1:1 entre dos tablas en Excel 2016, sea usando los asistentes que provee Excel o mediante código VBA?. Lo he intentado de diferentes formas y la aplicación siempre crea relaciones uno a varios, sin posibilidad de editarla para cambiarla a 1:1

a7024782_0-1689279940346.png

Esta es la situación, la tabla Coins tiene el campo numérico IdCoin, con valores únicos que sirve para relacionar con la tabla Operaciones, hasta ese punto todo funciona; el problema se presenta cuando intento relacionar las tablas Operación (campo IdOperacion, numérico, valores únicos) con el campo IdOperacion (numérico, valores duplicados) de la tabla Análisis, al crear una consulta en ese escenario por cada registro de la tabla Operaciones que selecciono, me devuelve todos los registros de la Tabla Análisis, estén relacionados o no con el registro seleccionado. A modo de ejemplo, si selecciono el campo fecha en la tabla Operaciones y el campo tendencia de la tabla Análisis, me devuelve una fecha con las 7 opciones que tengo de tendencia, y eso por cada fecha de la tabla Operaciones. Lo que busco es que al seleccionar una fecha de la tabla Operaciones me devuelva el valor único registrado para esa fecha en la tabla análisis. Gracias de antemano por los comentarios

 

 

 

 

 

 

 

 

2 Replies

@a7024782 

En Excel 2016, no es posible crear una relación directa 1:1 entre dos tablas usando los asistentes que proporciona Excel. Los asistentes de relación en Excel están diseñados para establecer relaciones uno a varios (1:N) o varios a varios (N:N) entre las tablas.

Sin embargo, puedes lograr una relación 1:1 entre dos tablas utilizando código VBA. A continuación, te mostraré un ejemplo de cómo puedes hacerlo:

  1. Abre el Editor de Visual Basic presionando Alt + F11.
  2. Inserta un nuevo módulo desde el menú Insertar > Módulo.
  3. En el módulo recién creado, escribe el siguiente código VBA:

vba code:

Sub CrearRelacion1a1()
    Dim rngTabla1 As Range
    Dim rngTabla2 As Range
    Dim ws As Worksheet
    Dim relaciones As WorkbookConnection
    Dim relacion As WorkbookConnection
    
    'Especifica la hoja y el rango de la Tabla 1
    Set ws = ThisWorkbook.Sheets("Hoja1")
    Set rngTabla1 = ws.Range("A1:B10")
    
    'Especifica la hoja y el rango de la Tabla 2
    Set ws = ThisWorkbook.Sheets("Hoja2")
    Set rngTabla2 = ws.Range("A1:B10")
    
    'Crea la conexión entre las dos tablas
    Set relaciones = ThisWorkbook.Connections
    Set relacion = relaciones.Add2("Relacion1a1", "1 a 1")
    relacion.Add(rngTabla1, rngTabla2)
    
    'Actualiza la conexión
    ThisWorkbook.RefreshAll
End Sub
  1. Asegúrate de reemplazar "Hoja1" y "Hoja2" con los nombres reales de las hojas que contienen las tablas.
  2. Ajusta los rangos "A1:B10" para que coincidan con los rangos reales de tus tablas.
  3. Ejecuta el código presionando F5.

Este código creará una conexión entre las dos tablas especificadas, estableciendo una relación 1:1. Asegúrate de tener los datos correctamente organizados en las tablas para que la relación funcione correctamente.

Es importante destacar que, aunque puedes establecer la relación 1:1 mediante código VBA, debes asegurarte de que los datos en las tablas cumplan con las condiciones necesarias para una relación 1:1. Es decir, cada valor en la columna que se utiliza para la relación debe ser único en ambas tablas.

Como nadie me ha respondido, ingresé tu pregunta en varias IA. El texto y los pasos son el resultado de varias IA juntas.

 

¡Mis respuestas son voluntarias y sin garantía!

 

Espero que esta información sea útil y te ayude a lograr tu objetivo.

best response confirmed by a7024782 (Brass Contributor)
Solution

@a7024782 

Data model in Excel doesn't support bi-directional relationships (many-to-many and one-to-one). Moreover, such kind of relationship is not recommended to use in general.

Alternatively you may create explicit measure like

=CALCULATE(myAggregation, CROSSFILTER( Analysis[Id] ,Operations[Id], Both )) 

Even better is to add bridge table with IDs only, hide Id both in Analysis and Operations and use it only from Bridge

image.png

1 best response

Accepted Solutions
best response confirmed by a7024782 (Brass Contributor)
Solution

@a7024782 

Data model in Excel doesn't support bi-directional relationships (many-to-many and one-to-one). Moreover, such kind of relationship is not recommended to use in general.

Alternatively you may create explicit measure like

=CALCULATE(myAggregation, CROSSFILTER( Analysis[Id] ,Operations[Id], Both )) 

Even better is to add bridge table with IDs only, hide Id both in Analysis and Operations and use it only from Bridge

image.png

View solution in original post