Trabajar con celdas combinadas y crear reportes p

Para una aplicación que estoy haciendo con excel necesito poder manejar celdas combinadas. Lo que quiero es, en hojas ya creadas, ir testeando celda por celda y en caso de estar combainada, recoger el valor de la combianacion (suele estar en la primera celda de la combinación) y copiarla en las demás celdas.
¿Cómo puedo saber por código (VB o VBA) el rango de las celdas combinadas?
Lo que pretendo es que sustituya y rellene sobre la misma hoja los valores de las celdas. Una vez hecho he de filtrarlos, dependiendo de ciertos valores y crear reportes personalizados (también en excel)

2 Respuestas

Respuesta
1
Entiendo que quieres repasar tus celdas, y comprobar si están combinadas, y si es así copiar el valor que tenga, y ahora es lo que no entiendo "... copiarla en las demás celdas"
¿En qué celdas?
Quieres saber por código el rango que ocupan las celdas combinadas para cambiar los valores que figuran en ellas, vamos a ver aquí el problema viene del proceso que se haya utilizado para introducir los datos y en el momento de la combinación, me explico supongamos que vamos a utilizar para combinar las celdas A1, B1 y C1. Podemos introducir un dato en B1 y posteriormente combinar el rango mencionado, o podemos hacerlo combinando el rango primero y después introducir el dato. Dará igual, tanto el valor de A1 como el de B1 como el de C1 será el valor introducido, en cualquiera de las 3 celdas.
Por lo tanto si repasas tus celdas y recoges los valores en una variable para modificarlos dará igual el rango donde apliques los cambios en las celdas combinadas tomaran tu nuevo valor.
De todas formas si quieres el código para poner la condición Si la celda esta combinada es este:
Range("A1").Select
If Selection.MergeCells=True Then 'Si la celda seleccionada esta combinada
'Tu codigo
End If
Para comprobar cual es el rango que ocupan las celdas combinadas puedes sacarlo así
Range("A1").Select 'Aquí sabemos que rango ocupamos A1
ActiveCell.Offset(0,1).Select 'Nos desplazamos una celda a la derecha
If ActiveCell.Address<>"$B$1" Then 'Si no estamos en la celda B1 que sería la siguiente 'significa que estamos ante una celda combinada
celda=ActiveCell.Address 'Sacamos la posición de la celda
Else 'Si la condición anterior no se cumple es que no es combinada y si estamos en B1
'Aquí pones tu codigo de lo que quieres que haga la macro
End If
Mira a ver si te soluciona tu problema, y si necesitas algo más me lo dices.
>Un saludo
>Julio
Hola Julio
Gracias por la respuesta pero me temo que no me sale bien. Creo que estoy mezclando vb con vba. He de decidir si lo hago al final en vb (más fácil para mi, aunque llevo tiempo sin programar) que en vba (solo he hecho unas pocas macros)
He de comprobar la combinación de celdas. Siempre sera por columnas y puede ser cualquier columna del libro. Si A1 esta Combinada con a2 y a3 he de el valor en las celdas
Me he creado un form vb de prueba(previo a la macro o programilla final. He creado 2 list y un botón
meto lo siguiente al botón
Private Sub Command1_Click()
'Variable de tipo Aplicación de Excel
    Dim objExcel As Excel.Application
    'Una variable de tipo Libro de Excel
    Dim xLibro As Excel.Workbook
Dim col As Integer
Dim Fila As Integer
    Dim k As Integer
    Dim m As Integer
    Dim CadenaTemporal As String
    Dim CadenaCombinada As String
    'creamos un nuevo objeto excel
    Set objExcel = New Excel.Application
    'Usamos el método open para abrir el archivo
    Set xLibro = objExcel.Workbooks.Open("D:\Prueba_MC.xls")
    'Hacemos el Excel Visible
    objExcel.Visible = False
    With xLibro
        ' Hacemos referencia a la Hoja
        With .Sheets(1)
            'Recorremos la fila
            For Fila = 1 To 1000
             ' Nos interesa la columna J (10) y sucesivas
CadenaTemporal = Cells(Fila, 10)
    ' Meto en un list valor antes de comprobar
    List1.AddItem CadenaTemporal
Next
    'compruebo celda combinada=true
'lo meto en un 2º list para comprobar que está bien visualmente(los tengo al lado)
List2.additem=CadenaCombinada
    If CadenaTemporal.MergeCells = True Then
        Fila = Fila + 1
        CadenaCombinada = CadenaTemporal
        List2.AddItem = CadenaCombinada
    Else
        List2.AddItem = CadenaTemporal
    End If
           End With
    End With
End Sub
Me imagino que he mezclado código. ¿Me echas una mano?
Muchas gracias de antemano y perdona las molestias
Julián
Vamos a ver has creado tu botón en un libro y abres otro desde él para que recorra tus filas desde la 1 hasta la 1000 y vaya comprobando si las celdas están combinadas, si es así los valores los vas añadiendo a un List, lo que no entiendo es:
1º Si tus datos los tienes en el libro que tienes que abrir porque no ejecutas la macro directamente desde ese libro sin tener que abrir otro.
2º Tampoco entiendo los dos list si los valores ya están en el primer list cual es la función del segundo, ¿Pones para ver si están bien viualmente?
En general la macro no esta muy mal lo que no entiendo es el proceso que has seguido, veo lo que quieres hacer, voy a intentar armarte la macro yo, te la pongo y la compruebas si te sirve, y sobre los resultados la vamos corrigiendo. No finalices la consulta y yo te volveré a contestar con el resultado.
>Un saludo
>Julio
Hola Julio
Gracias por la respuesta.
Como te comenté hace tiempo que no programo. Cuando lo hacía era en c, c++ o vb. aparte de comprobar las celdas combinadas he de crearme informes personalizados (albaranes de entrega y varios tipos de listados) y "jugar" con los datos (hubiese preferido hacerlo en access o sql server pero quieren que sea en excel. He buscado manuales de vba y estoy viendo como hacerlo con macros.
El utilizar 2 list es para comprobar que me funciona la función. En el primer list leo celda por celda cada columna de la hoja(algunas de las celdas están en blanco ya que al estar combinadas sólo la primera celda de la combinación tiene algún valor), y luego vuelvo a leerlo, comprobando si las celdas están combinadas, y "rellenando" en el segundo list las celdas en blanco por el valor de la combinación completando la lista.por eso pruebo en lo que "malamente" sé, vb, para luego "traducirlo" al vba
Gracias por perder el tiempo conmigo
Saludos
julián
Vamos a ver es que eso no hace falta, si tu en VBA te vas desplazando por las celdas y recoges los valores te darás cuenta que cuando llegas a una celda combinada no se sitúa en la celda correcta sino que se desplaza a la primera de la celda combinada, me explico:
Nos situamos en B3 y vamos bajando una fila ActiveCell. Offset(1,0). select cuando llegamos por ejemplo a B8 si esta combinada con A8:B8 no se situa en B8 sino en A8 y te dá el valor de esa celda, por lo tanto aunque a simple vista la celda B8 esta vacia tiene el valor de A8 y no es posible asignarle un valor a esa celda sin cambiar el de A8.
>Un saludo
>Julio
Respuesta

Excelente respuesta, gracias por tu aporte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas