Ayuda libro excel

Hola estoy realizando un trabajo y me ha surgido la siguiente cuestión, creo que muy complicada y no estoy segura de que en excel se pueda hacer.
Resulta que tengo varias hojas, en ellas hay diversos datos y la última hoja "que yo la llamo hoja resumen" debe de recoger, introduciendo únicamente el nombre de una de las hojas, los datos más importantes de la misma (los que yo le marque). ¿Cómo lo hago?
Y además querría ir introduciendo más hojas y que la fórmulas de la hoja resumen también tuviera en cuenta las nuevas hojas.
No sé si me he explicado bien.
Muchas gracias Experto

1 Respuesta

Respuesta
1
Sinceramente no acabo de entender lo que quieres hacer.
Dices que tienes una hoja de cálculo con varias páginas y un resumen final. Ahora, ¿cómo indicas en nombre de la página para incluir el resumen? ¿Y los datos que quieres 'marcar'?
¿Qué problema existe en que haya 3 páginas o 58 si tu sólo vas a resumir los datos de la hoja que hayas marcado?
Detállame más el problema y seguro que tiene solución. Posiblemente no sea una solución de 4 fórmulas en unas celdas, pero algo se podrá hacer 'casi seguro'.
Ya, es que me resulta un poco complicado incluso explicarlo.
Tengo, por ejemplo, dos hojas: la hoja "A" y la hoja "B" y una tercera que se llama "Resumen".
En las hojas A y B voy a meter ciertos datos y quiero que cuando vaya a la hoja "Resumen" y ponga "A" me recoja los datos que yo le ordene de A, lo mismo con B.
Luego, quiero que esta misma fórmula me valga para cuando vaya introduciendo nuevas hojas sin tener que modificar dicha fórmula. Es decir que yo deje el libro de Excel preparado para que otros compañeros, que no saben utilizar Excel, introduzcan nuevas hojas "C", "D"... y la hoja resumen siga funcionando.
¿Me he explicado adecuadamente? ¿Es muy complejo verdad?
Si me sacas de esto eres un crack. Muchas gracias
Seguro que no es para tanto.
Entiendo que quieres que la hoja "Resumen" te presente una serie de datos de la hoja 'A' (o de la 'B' o la que sea).
Vamos a empezar por el principio. Supongamos que el nombre de la hoja que quieres resumir lo escribes, por poner un sitio cualquiera, en la celda B1 (también se podría preguntar con una ventana), y quieres que te copie todos los datos de la página indicada a partir de la celda A3.
Voy a seguir suponiendo que los datos que quieres copiarte de la hoja indicada son los de las columnas A, B, DE, E, F y J (números 1, 2, 4, 5, 6 y 10 respectivamente).
Hasta ahora sólo he hecho suposiciones de lo que podrías querer hacer. Si es otra cosa después haremos los cambios.
Para hacer lo que he supuesto como ejemplo, yo crearía una macro que se ejecute automáticamente en Visual Basic. Sería la siguiente:
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim nomHoja As String
    Dim nLin As Long
    Dim shOri As Worksheet
    Dim shDes As Worksheet
    Dim aux As String
    ' Si se ha modificado alguna celda que no sea la B1 de la página resumen... salimos
    If UCase$(Target.Worksheet.Name) <> "RESUMEN" Or Target.Address <> "$B$1" Then Exit Sub
    ' Asignamos la página del resumen a su variable
    Set shDes = Sheets(Target.Worksheet.Name)
    ' Borramos todas las filas desde la 3 hasta el final
    nLin = shDes.Cells.SpecialCells(xlCellTypeLastCell).Row
    If nLin >= 3 Then shDes.Rows("3:" & Format$(nLin)).Delete
    ' Resuperamos el nombre de la hoja tecleada
    nomHoja = Target.Value
    ' Asignamos esa página a la variable (si hay error es que el nombre no vale)
    On Error Resume Next
    Set shOri = Sheets(nomHoja)
    If Err <> 0 Then
        MsgBox "El nombre de página tecleado no existe"
        On Error GoTo 0
        Exit Sub
    End If
    ' Copiamos todos los datos de las columnas A, B, D, E, F y J (1, 2, 4, 5, 6 y 10 respectivamente)
    nLin = shOri.Cells.SpecialCells(xlCellTypeLastCell).Row
    ' Construimos el nombre de los rangos de celdas a copiar. Agrupamos las columnas
' que estén contiguas (A-B, D-E-F)
    aux = "A1:B" & Format$(nLin) & ",D1:F" & Format$(nLin) & ",J1:J" & Format$(nLin)
    shOri.Range(aux).Copy
    shDes.Range("A3").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    shDes.Cells(3, 1).Select
End Sub
Este código lo tienes que grabar en el editor de Visual Basic (se entra con <Alt><F11>), dentro del 'Workbook'. Para ello tienes que hacer doble click en 'ThisWorkBook' que aparece (si no pulsa <Ctrl><R>) en el explorador de Proyectos.
Una vez grabada la macro, cada vez que modifiques la celda B1 de la página 'resumen' te ejecutará este código.
Pruébalo y me comentas si vamos acercándonos a lo que quieres o no.
Experto:
Lo he probado y tiene una pinta buenísima ya que me funciona exactamente como me has dicho y sí, es lo que buscaba.
Voy a adaptarlo a los datos que voy a ir incluyendo supongo que te tendré que hacer más preguntas según necesite cambiar de celdas por que yo no sé programar.
Muchísimas gracias por tu ayuda. La verdad es que admiro mucho a personas como tu.
Gracias otra vez
Me alegro que vayamos por el buen camino. Muchas veces me pongo a escribir código sin saber si valdrá para algo y eso es bastante tedioso.
Ya me contarás.
Hola de nuevo experto.
Ya he dado formato a mis hojas y como no sé programar, ruego me adaptes la macro a mi libro definitivo que quedaría de la siguiente manera.
En la hoja "resumen", la casilla en la que se definiría cada vez el nombre de la hoja "A", "B", "C"... sería la F1. A partir de ahí querría que me devolviese los datos de esa hoja(A, B...) de la siguiente manera:
Hoja resumen Hoja A(b, c...)
F2 B4
F3 C4
F4 D4
... y así sucesivamente hasta la
F17 R4
Muchísima gracias por tu ayuda, ya me dirás si es posible.
Un saludo
Si no me equivoco, el código sería este:
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim nomHoja As String
    Dim nLin As Long
    Dim shOri As Worksheet
    Dim shDes As Worksheet
    Dim aux As String
    ' Si se ha modificado alguna celda que no sea la F1 de la página resumen... salimos
    If UCase$(Target.Worksheet.Name) <> "RESUMEN" Or Target.Address <> "$F$1" Then Exit Sub
    ' Asignamos la página del resumen a su variable
    Set shDes = Sheets(Target.Worksheet.Name)
    ' Borramos todas las filas desde la 3 hasta el final
    nLin = shDes.Cells.SpecialCells(xlCellTypeLastCell).Row
    If nLin >= 3 Then shDes.Rows("3:" & Format$(nLin)).Delete
    ' Resuperamos el nombre de la hoja tecleada
    nomHoja = Target.Value
    ' Asignamos esa página a la variable (si hay error es que el nombre no vale)
    On Error Resume Next
    Set shOri = Sheets(nomHoja)
    If Err <> 0 Then
        MsgBox "El nombre de página tecleado no existe"
        On Error GoTo 0
        Exit Sub
    End If
    ' Copiamos los datos del rango B4-R4 en F2-F18
    shOri.Range("B4:R4").Copy
    shDes.Range("F2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
    shDes.Range("F2").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=True
    Application.CutCopyMode = False
    shDes.Cells(2, 6).Select
End Sub
Por cierto, R4 se copia sobre F18 y no en F17.
Experto:
Feliz año para ti también y un millón de gracias por tus prontas respuestas. ¿En la valoración existen las 6 estrellas?
Creo que te he liado, lo he probado y es justo al revés.
En la hoja resumen me devuelve los datos de b4, c4... en la columna F. Yo lo quiero justo a la inversa. En la hoja resumen debe darme los datos de F2, F3... de la hoja A (b, c..) de las columnas b, c, d... Y fundamentalmente es porque el dato de la casilla que define el nombre de las hojas que es A4 en vez de F1, me equivoqué y eso te ha liado.
Y sí, la F18 corresponde a R4
¿Me lo puedes modificar?
Experto:
He estado trasteando y creo que lo he modificado. Parece que funciona. ¿Le puedes echar un vistazo a ver si es correcto?
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim nomHoja As String
Dim nLin As Long
Dim shOri As Worksheet
Dim shDes As Worksheet
Dim aux As String
' Si se ha modificado alguna celda que no sea la F1 de la página resumen... salimos
If UCase$(Target.Worksheet.Name) <> "RESUMEN" Or Target.Address <> "$F$1" Then Exit Sub
' Asignamos la página del resumen a su variable
Set shDes = Sheets(Target.Worksheet.Name)
' Borramos todas las filas desde la 3 hasta el final
nLin = shDes.Cells.SpecialCells(xlCellTypeLastCell).Row
If nLin >= 3 Then shDes.Rows("3:" & Format$(nLin)).Delete
' Resuperamos el nombre de la hoja tecleada
nomHoja = Target.Value
' Asignamos esa página a la variable (si hay error es que el nombre no vale)
On Error Resume Next
Set shOri = Sheets(nomHoja)
If Err <> 0 Then
MsgBox "El nombre de página tecleado no existe"
On Error GoTo 0
Exit Sub
End If
' Copiamos los datos del rango F2-F18 en B4-R4
shOri.Range("F2:F18").Copy
shDes.Range("B4").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
shDes.Range("B4").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=True
Application.CutCopyMode = False
shDes.Cells(2, 6).Select
End Sub
Por otro lado, tengo dos consultas más:
-Si en las hoja resumen quiero conservar un encabezado para las filas 1,2 y 3 y que no se modifiquen ¿cómo puedo hacerlo?
-Si todo lo que hemos hecho antes, es decir lo de hacer corresponder
F2 B4
F3 C4
F4 D4
... y así sucesivamente hasta la
F18 R4
Lo quisiera hacer con celdas salteadas, es decir, que no fueran sucesivas ¿cómo puedo hacerlo?
Ya ves, un montón de preguntas.
Muchas gracias por tu paciencia
Puedes cambiar el apartado que realiza la copia:
' Copiamos los datos del rango F2-F18 en B4-R4
shOri.Range("F2:F18").Copy
shDes.Range("B4").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
shDes.Range("B4").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=True
Application.CutCopyMode = False
Por otra forma de hacerlo que sería algo así:
    ' Copiamos los datos de la página origen a la destino
    shDes.Range("B4") = shOri.Range("F2")
    shDes.Range("C4") = shOri.Range("F3")
    shDes.Range("D4") = shOri.Range("F4")
    shDes.Range("E4") = shOri.Range("F5")
    shDes.Range("F4") = shOri.Range("F6")
    shDes.Range("G4") = shOri.Range("F7")
    ...
    ...
De esta manera copias las celdas de una en una y eliges cual coges y dónde la pones.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas