[RESUELTO] Dividir el contenido de una columna en varias

Discute sobre la aplicación de hojas de cálculo
Responder
ciclyc
Mensajes: 4
Registrado: Vie Dic 02, 2016 5:24 pm

[RESUELTO] Dividir el contenido de una columna en varias

Mensaje por ciclyc »

Hola, tengo una base de datos con una sola columna en la que vienen 5000 códigos, necesito dividir esos 5000 códigos en 60 columnas, ¿habría algún modo de hacerlo?... muchas gracias
Última edición por ciclyc el Jue Dic 08, 2016 10:02 am, editado 2 veces en total.
Open office 4 - windows 10
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Dividir el contenido de una columna en varias

Mensaje por mauricio »

Mira en el menú Datos -> Texto a columnas

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: Dividir el contenido de una columna en varias

Mensaje por PepeOooSevilla »

Hola.
Se podría hacer con fórmulas o con "texto a columnas" dependiendo del formato que tengan.
Sería conveniente que subieras un archivo de ejemplo para ofrecerte una mejor ayuda.
Saludos cordiales.
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
ciclyc
Mensajes: 4
Registrado: Vie Dic 02, 2016 5:24 pm

Re: Dividir el contenido de una columna en varias

Mensaje por ciclyc »

Hola,
con Texto a columnas no se puede o no sé hacerlo.
Adjunto dos archivos para que veais lo que quiero. En el de una columna, viene la base tal y cómo la tendría y en el de dividido en columnas, cómo lo necesitaría...
Muchas gracias
dividido en columnas.ods
(8.45 KiB) Descargado 711 veces
una columna.ods
(8.61 KiB) Descargado 469 veces
Open office 4 - windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Dividir el contenido de una columna en varias

Mensaje por fornelasa »

Es decir, ¿serían 83.3333 códigos aproximadamente por columna?
Saludos.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: Dividir el contenido de una columna en varias

Mensaje por PepeOooSevilla »

Hola.

Una posible solución, de acuerdo con el archivo adjunto, es pegar en A1 de una hoja en blanco la fórmula y arrastrar:

Código: Seleccionar todo

=INDIRECTO("ORIGINAL.A"&FILA()+SI(COLUMNA()<>1;3*(COLUMNA()-1);0))
' "ORIGINAL" es el nombre de la hoja donde están todos los códigos en una sola columna
La constante "3" de la fórmula es porque los datos van de 3 en 3. Tendrías que modificarla de acuerdo con los datos reales, es decir, si como pregunta el compañero fornelasa, son 83 códigos por columna, entonces debes sustituir el 3 por 83.

Saludos cordiales.
Adjuntos
una columna_v2.ods
LibreOffice Calc 5.1.6
(10.74 KiB) Descargado 588 veces
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
ciclyc
Mensajes: 4
Registrado: Vie Dic 02, 2016 5:24 pm

Re: Dividir el contenido de una columna en varias

Mensaje por ciclyc »

Muchísimas gracias,
la verdad es que me has salvado la vida, el código es correcto y me ha servido. Sólo una cosa, he tenido que dividir otra columna con 1000 datos en otras sesenta columnas, el problema es que al dividir 1000 entre 60 me sale a 16,66, por lo que si pongo que son 16 datos por columna, me saca 63 columnas y si le pongo 17 me saca 58 columnas más una y media de ceros ya que no hay datos para ellas. Habría algún modo de indicarle a la formula el número de columnas (en este caso 60) en lugar del número de códigos por columna.

Vuelvo a agradeceros vuestra enorme ayuda.
Open office 4 - windows 10
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: Dividir el contenido de una columna en varias

Mensaje por PepeOooSevilla »

Hola.
ciclyc escribió:Habría algún modo de indicarle a la formula el número de columnas (en este caso 60) en lugar del número de códigos por columna.
Posiblemente sí, ayudándonos de celdas auxiliares donde guardar los elementos que se van copiando. En lugar de ello he programado una macro que lo hace.
El archivo adjunto consta de tres hojas:
  • * Hoja "PARAMETROS": En ella se indicarán el número de elementos a distribuir, así como el número de columnas. También el tipo de dato de los elementos, número o texto.
  • * Hoja "DATOS": En esta hoja se copiarán los elementos a distribuir. Todos en la columna "A" y comenzando en la celda "A1".
  • * Hoja "RESULTADO": Aquí se verá el resultado final de la distribución. Se rellenará el número de columnas especificado excepto si número de elementos es menor que número de columnas (obvio).
Una vez cumplimentados los datos de la hoja "PARAMETROS" y de la hoja "DATOS" se debe pinchar en el botón "Repartir elementos" situado en la hoja "PARAMETROS". Cuando aparezca el mensaje "Macro FINALIZADA" se podrá ver cómo han quedado distribuidos los datos en la hoja "RESULTADO". Este botón llama al procedimiento RepartirCodigos() que se encarga de hacer más comprobaciones y de llamar a otro procedimiento dependiendo de si los datos son números o texto.
Contenido de la macro:

Código: Seleccionar todo

REM  *****  BASIC  *****
Option Explicit

Sub RepartirCodigos()
    Dim HojaParametros As Object
    Dim ControlElementos As Boolean
    Dim ControlColumnas As Boolean
    Dim ControlTipo As Boolean
    
    HojaParametros = ThisComponent.Sheets.getByName("PARAMETROS")
    With HojaParametros
        ControlElementos = (.getCellByPosition(1, 0).getString <> "")
        ControlColumnas = (.getCellByPosition(1, 1).getString <> "")
        ControlTipo = (.getCellByPosition(1, 2).getString <> "") And _
                    (.getCellByPosition(1, 2).getString = "NÚMERO" Or .getCellByPosition(1, 2).getString = "TEXTO")
        If ControlElementos And ControlColumnas And ControlTipo Then
            If .getCellByPosition(1, 2).getString() = "NÚMERO" Then
                Call RepartirNUMEROSHojaDATOS(.getCellByPosition(1, 0).getValue, .getCellByPosition(1, 1).getValue)
            Else
                Call RepartirTEXTOSHojaDATOS(.getCellByPosition(1, 0).getValue, .getCellByPosition(1, 1).getValue)
            End If
        Else
            MsgBox "Las celdas B1, B2 y B3 no pueden estar vacías. Los tipos son NÚMERO o TEXTO", 16, "¡Atención!"
        End If
    End With
End Sub

Sub RepartirNUMEROSHojaDATOS(NumElementos As Long, NumColumnas As Long)
    Dim HojaResultado As Object
    Dim HojaDatos As Object
    Dim NumElemXColumna As Long
    Dim Cociente As Long
    Dim Resto As Long
    Dim ContadorColumna As Long
    Dim ContadorFila As Long
    Dim Elemento As Long
    Dim Fila As Long
    
    On Error Goto TRATAR_ERROR

    If (NumElementos = 0) Or (NumColumnas = 0) Then
        Msgbox "Número_de_Elementos o Número_de_Columnas no pueden ser 0 (cero)", 16, "¡Atención!"
        Exit Sub
    End If
    
    If NumElementos < NumColumnas Then
        Msgbox "Número_de_Elementos < Número_de_Columnas, luego no se rellenarán todas las columnas", 64, "¡Atención!"
    End If
    
    Cociente = Fix(NumElementos/NumColumnas)
    Resto = NumElementos Mod NumColumnas
    
    HojaResultado = ThisComponent.Sheets.getByName("RESULTADO")
    HojaDatos = ThisComponent.Sheets.getByName("DATOS")
    
    If Cociente = 0 Then
        NumColumnas = Resto
        Fila = 0
        For ContadorColumna = 0 To NumColumnas - 1
            HojaResultado.getCellByPosition(ContadorColumna, 0).setValue(HojaDatos.getCellByPosition(0, Fila).getValue())
            Fila = Fila + 1
        Next
    ElseIf Resto = 0 Then
        Fila = 0
        For ContadorColumna = 0 To NumColumnas - 1
            For ContadorFila = 0 To Cociente - 1
                HojaResultado.getCellByPosition(ContadorColumna, ContadorFila).setValue(HojaDatos.getCellByPosition(0, Fila).getValue())
                Fila = Fila + 1
            Next
        Next
    Else
        Fila = 0
        For ContadorColumna = 0 To Resto - 1
            For ContadorFila = 0 To Cociente
                HojaResultado.getCellByPosition(ContadorColumna, ContadorFila).setValue(HojaDatos.getCellByPosition(0, Fila).getValue())
                Fila = Fila + 1
            Next
        Next
        For ContadorColumna = Resto To NumColumnas - 1
            For ContadorFila = 0 To Cociente - 1
                HojaResultado.getCellByPosition(ContadorColumna, ContadorFila).setValue(HojaDatos.getCellByPosition(0, Fila).getValue())
                Fila = Fila + 1
            Next
        Next
    End If
    
    MsgBox "Macro FINALIZADA", 64, "¡Atención!"
    
    Exit Sub
TRATAR_ERROR:
    Msgbox "Se ha producido un ERROR", 16, "¡Atención!"
    On Error Goto 0
End Sub

Sub RepartirTEXTOSHojaDATOS(NumElementos As Long, NumColumnas As Long)
    Dim HojaResultado As Object
    Dim HojaDatos As Object
    Dim NumElemXColumna As Long
    Dim Cociente As Long
    Dim Resto As Long
    Dim ContadorColumna As Long
    Dim ContadorFila As Long
    Dim Elemento As Long
    Dim Fila As Long
    
    On Error Goto TRATAR_ERROR

    If (NumElementos = 0) Or (NumColumnas = 0) Then
        Msgbox "Número_de_Elementos o Número_de_Columnas no pueden ser 0 (cero)", 16, "¡Atención!"
        Exit Sub
    End If
    
    If NumElementos < NumColumnas Then
        Msgbox "Número_de_Elementos < Número_de_Columnas, luego no se rellenarán todas las columnas", 64, "¡Atención!"
    End If
    
    Cociente = Fix(NumElementos/NumColumnas)
    Resto = NumElementos Mod NumColumnas
    
    HojaResultado = ThisComponent.Sheets.getByName("RESULTADO")
    HojaDatos = ThisComponent.Sheets.getByName("DATOS")
    
    If Cociente = 0 Then
        NumColumnas = Resto
        Fila = 0
        For ContadorColumna = 0 To NumColumnas - 1
            HojaResultado.getCellByPosition(ContadorColumna, 0).setString(HojaDatos.getCellByPosition(0, Fila).getString())
            Fila = Fila + 1
        Next
    ElseIf Resto = 0 Then
        Fila = 0
        For ContadorColumna = 0 To NumColumnas - 1
            For ContadorFila = 0 To Cociente - 1
                HojaResultado.getCellByPosition(ContadorColumna, ContadorFila).setString(HojaDatos.getCellByPosition(0, Fila).getString())
                Fila = Fila + 1
            Next
        Next
    Else
        Fila = 0
        For ContadorColumna = 0 To Resto - 1
            For ContadorFila = 0 To Cociente
                HojaResultado.getCellByPosition(ContadorColumna, ContadorFila).setString(HojaDatos.getCellByPosition(0, Fila).getString())
                Fila = Fila + 1
            Next
        Next
        For ContadorColumna = Resto To NumColumnas - 1
            For ContadorFila = 0 To Cociente - 1
                HojaResultado.getCellByPosition(ContadorColumna, ContadorFila).setString(HojaDatos.getCellByPosition(0, Fila).getString())
                Fila = Fila + 1
            Next
        Next
    End If
    
    MsgBox "Macro FINALIZADA", 64, "¡Atención!"
    
    Exit Sub
TRATAR_ERROR:
    Msgbox "Se ha producido un ERROR", 16, "¡Atención!"
    On Error Goto 0
End Sub
Si con esta respuesta consideras que el tema está resuelto, indícalo (¿Cómo marcar como RESUELTO un tema?), ya que, de esta forma, conseguiremos un foro más ordenado.

Saludos cordiales.
Adjuntos
FORO_CALC_Repartir entre varias columnas.ods
LibreOffice Calc 5.1.6
(15.94 KiB) Descargado 455 veces
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Dividir el contenido de una columna en varias

Mensaje por fornelasa »

¡¡Excelente trabajo PepeOooSevilla!! :bravo:
Saludos.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
ciclyc
Mensajes: 4
Registrado: Vie Dic 02, 2016 5:24 pm

Re: Dividir el contenido de una columna en varias

Mensaje por ciclyc »

Muchísimas gracias por la ayuda.
Cierro el tema
saludos
Open office 4 - windows 10
judithv
Mensajes: 1
Registrado: Sab Jul 22, 2017 11:42 pm

Re: [RESUELTO] Dividir el contenido de una columna en varias

Mensaje por judithv »

Hola quiero hacer algo similar con una columna con nombres de personas, quiero dividirla en varias columnas de 27 filas casa una. Como podría utilizar la formula que comparten?
NeoOffice 2.2.3 con MacOS 10.4
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: [RESUELTO] Dividir el contenido de una columna en varias

Mensaje por mauricio »

No es buena idea abrir un tema resuelto, aunque sea similiar, es mejor abrir un nuevo tema, explicando claramente el problema, y tal vez enlazando al tema referido. Un archivo de ejemplo donde se vea lo que quieres lograr, ayudará a quien quiera ayudarte.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Responder