Excel: ¿Cómo combinar celdas automáticamente?

Quiero saber si existe una manera para combinar una celda, con la de la derecha automáticamente, en cada celda por separado en una columna, si se escribe en ella.

Si no se escribe en la celda izquierda, no se combina, y se puede escribir en la celda de la derecha.

Solo si hay escrito algo en la celda derecha, se puede escribir en la de la izquierda, sin combinar.

Columna izq - columna der

Celda izq - celda der

C. Vacía - c. Vacía

C.llena =>combinar con c. Der (auto)

C. Vacía - c. Llena (no combinar)

Si c.der esta llena, c. Der se puede llenar y no combinar:

C.llena - c. Llena

*Se me ocurre hacer una regla que active una macro. Y fórmula de "si".

Lo que no se muy bien es el lenguaje. Solo esta Está idea.

1 respuesta

Respuesta

Para poder conseguir lo que quieres te valdrá este código:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B:B")) Is Nothing Then
If Target.Offset(0, 1).Value = "" Then
Range(Target, Target.Offset(0, 1)).Select
Selection.Merge
With Selection
'PONER AQUI EL RESULTADO DE LA GRABADORA
End With
End If
End If
End Sub

Deberás poner la macro en la hoja donde quieras que se ejecute y realacionada con el evento Worksheet_change

En este ejemplo, la macro se ejecuta cuando cambia el valor de cualquier celda de la columna B. Si te interesa otra columna deberás cambiar ("B:B") por lo que te interese

Si en la columna C no hay valor, se combina, sinó no.

Por último, utiliza la grabadora de macros y combina 2 celdas con el formato que te interese, luego copias lo que te haya dado entre With Selection y End With en el lugar que te he indicado

Hola Gregori, Muchas gracias por la ayuda, 

hice exactamente lo que me has explicado, pero me aparece este error de compilación.

y este fue el código de la Macro que grabé:

Sub Macro1_Combinar_y_Formato()
'
' Macro1_Combinar_y_Formato Macro
' Combina la celda con la celda derecha y cambia el formato alinear a la izquierda.
'
'
    Range("D:E").Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Selection.Merge
    With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
    End With
End Sub

Y en esta parte: 

 Range("D:E").Select

Aparecían los números de celda, y los borré, quizás eso estuvo mal... ("D29:E29")

hice la combinación en las celdas "29" como ejemplo.

Muchas gracias por la ayuda.

No cambie los números del rango.

Y en el codigo Borré Sub Combinar() y el ultimo End sub.

Todo bien, hasta que quise borrar texto.

Me aparece ese error y puse "Depurar"

Y marca en amarillo lo siguiente del código:

If Target.Offset(0, 1).Value = "" Then

Si borro, por que quiero cambiar la Celda que se combino,

Se debería por defecto "separar" de la que se combino automáticamente y volver al formato original de celda. (En mi caso ocupo "Todos los Bordes") Si no queda la celda con borde blanco

Eso falto.

Te has liado un poco, prueba esto:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D:D")) Is Nothing Then
If Target.Offset(0, 1).Value = "" Then
Range(Target, Target.Offset(0, 1)).Select
Selection.Merge
With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
End With
End If
End If
End Sub

Hola Gregori Acabo de probar este código, se soluciona que no combine la celda de grabación de la macro...

El dilema que continua es que cuando se borra la celda que se combinó, se vuelve a combinar con la tercera hacia la derecha así sucesivamente...

La idea es que se automatice también la separación y el formato de celda de los bordes que se borran. (eso ocurre siempre en excel, cada vez que se separa una celda combinada, se borra el borde)

Acción: Borrar celda izquierda => separar + volver cursor a la izquierda + rellenar celdas con "todos los bordes"

Gracias!

Pues para esto deberás añadir una macro que su utilidad será la de borrar.

Puedes crear un shortcut para que te sea más fácil

Sub Unmerge()
Application.EnableEvents = False
Selection.Unmerge
With Selection
 .ClearContents
 .Borders.LineStyle = xlContinuous
End With
Application.EnableEvents = True
End Sub

Ok, Lo puse a continuación pero no sucede nada,

¿O debo colocarlo dentro del Código? si es así, ¿En qué lugar? Para no cometer más errores.

O lo que quieres decir es que debo grabar una macro nueva, ¿esta vez borrando y cambiando el formato?

Muchísimas Gracias Gregori

Son dos macros diferentes, no debes mezclarlas. Crea 2 botones y asignale a cada uno de ellos una de las macros.

Te dejo un enlace donde explica como crear un boton y asignarle una macro

http://www.exceleinfo.com/ejecutar-macro-desde-un-botn-un-control-o-una-forma-en-excel-vba/ 

Pero no quiero Botones, 

esto tiene que ser Automático.

Cuando se borra, en vez de separar las celdas, sigue combinando hacia la derecha... infinitamente... 

Sigamos puliendo :-)

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D:D")) Is Nothing Then
If Target.Offset(0, 1).Value = "" Then
Range(Target, Target.Offset(0, 1)).Select
Selection.Merge
With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
End With
End If
End If
If ActiveCell.Value = "" Then
Selection.UnMerge
ActiveCell.Offset(0, 0).Select
End If
End Sub

Hola Gregori.

Muy bien, funciona para separar las celdas, pero aun no logro que vuelva el formato. 

que se puede hacer?

Muchas gracias

Según lo que grabaste, prueba este:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D:D")) Is Nothing Then
If Target.Offset(0, 1).Value = "" Then
Range(Target, Target.Offset(0, 1)).Select
Selection.Merge
With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
End With
End If
End If
If ActiveCell.Value = "" Then
Selection.UnMerge
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
ActiveCell.Offset(0, 0).Select
End If
End Sub

Gracias, 

lo probé, pero no cambia nada, 

y encontré otro problema, 

cuando se escribe nuevamente en la celda ya combinada, la vuelve a combinar hacia la siguiente celda a la derecha, eso no debería pasar...

Gracias ... otra vez...

El segundo error con esta se arregla:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D:D")) Is Nothing Then
If Target.Offset(0, 1).Column = 5 Then
If Target.Offset(0, 1).Value = "" Then
Range(Target, Target.Offset(0, 1)).Select
Selection.Merge
With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
End With
End If
End If
End If
If ActiveCell.Value = "" Then
Selection.UnMerge
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
ActiveCell.Offset(0, 0).Select
End If
End Sub

De todos modos, cuando borras el valor de la celda y quieres que te aplique un formato específico para las celdas descombinadas, tienes que grabar una macro y decombinar y aplicar el formato que necesites y cambiar este trozo del código

    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas