Paste Grupo de Gráficos como Fotos

Quiero enviar una distribución diaria de gráficos en un libro de Excel.

En mi archivo maestro, los rangos de gráficos se actualizan cada día.
Estoy enviando los gráficos como imágenes para ayudar con la visualización más fácil.

Distribuyo los gráficos en 2 columnas, por lo tanto el operador de módulos.
El tamaño de cada tabla es de 25 filas y 13 columnas.

Sub ChartPasteValues()

Dim wb As Workbook, aWs As Worksheet, bWs As Worksheet, cht As ChartObject
Dim PasteRow As Integer, count As Integer

Set wb = ThisWorkbook
Set aWs = wb.Worksheets("Charts Master")
Set bWs = wb.Worksheets("Charts Output")

'delete all the prior day's charts in the output worksheet
    bWs.Pictures.Delete

'paste as pictures all of today's charts
    count = 1
    PasteRow = 2
    For Each cht In aWs.ChartObjects
        cht.Chart.ChartArea.Copy
        If count Mod 2 = 1 Then
            bWs.Range("B" & PasteRow).PasteSpecial xlPasteValues
            count = count + 1
        Else
            bWs.Range("M" & PasteRow).PasteSpecial xlPasteValues
            PasteRow = PasteRow + 25
            count = count + 1
        End If
    Next cht
    
End Sub

Pregunta hecha hace 3 años, 5 meses, 0 días - Por hackharbinger


2 Respuestas:

  • El código que compartiste parece estar intentando pegar los gráficos como imágenes en un libro de Excel, pero hay un pequeño error que necesita ser corregido. En lugar de copiar y pegar el ChartArea del gráfico, en realidad necesitas pegar la imagen del gráfico como Picture en la hoja de cálculo.

    Aquí te dejo una versión actualizada del código que debería funcionar correctamente:

    vba
    Sub ChartPasteValues()
    
        Dim wb As Workbook, aWs As Worksheet, bWs As Worksheet
        Dim cht As ChartObject
        Dim PasteRow As Integer, count As Integer
    
        Set wb = ThisWorkbook
        Set aWs = wb.Worksheets("Charts Master")
        Set bWs = wb.Worksheets("Charts Output")
    
        'borrar todas las imágenes de los gráficos del día anterior en la hoja de salida
        bWs.Pictures.Delete
    
        'pegar como imágenes todos los gráficos de hoy
        count = 1
        PasteRow = 2
    
        For Each cht In aWs.ChartObjects
            cht.Copy
            If count Mod 2 = 1 Then
                bWs.Paste bWs.Range("B" & PasteRow)
            Else
                bWs.Paste bWs.Range("M" & PasteRow)
                PasteRow = PasteRow + 25
            End If
            count = count + 1
        Next cht
    
    End Sub
    

    Con este ajuste, los gráficos deberían pegarse correctamente en la hoja de cálculo como imágenes. ¡Espero que esta solución sea de ayuda para ti! Si tienes alguna otra pregunta o necesitas más ayuda, ¡no dudes en decírmelo!

    Respondida el Dec 17, 2020 a las 21:50 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El código proporcionado es un procedimiento VBA en Microsoft Excel que copia y pega gráficos de una hoja de cálculo ("Charts Master") a otra ("Charts Output") como imágenes. El código funciona iterando sobre todos los objetos de gráfico en la hoja de cálculo "Charts Master" y copiando el área del gráfico al portapapeles. Luego, el área del gráfico se pega como valores en la hoja de cálculo "Charts Output" en una posición específica, alternando entre las columnas B y M según el valor del operador módulo.

    Sin embargo, hay un problema en el código:

    Problema:

    El código no actualiza correctamente el valor de PasteRow cuando se pega un gráfico en la columna M. Como resultado, los gráficos posteriores no se pegarán en las filas correctas.

    Solución:

    Para resolver este problema, necesitamos actualizar correctamente el valor de PasteRow después de pegar un gráfico en la columna M. Aquí está el código corregido:

    vb
    Sub ChartPasteValues()
    
    Dim wb As Workbook, aWs As Worksheet, bWs As Worksheet, cht As ChartObject
    Dim PasteRow As Integer, count As Integer
    
    Set wb = ThisWorkbook
    Set aWs = wb.Worksheets("Charts Master")
    Set bWs = wb.Worksheets("Charts Output")
    
    'delete all the prior day's charts in the output worksheet
        bWs.Pictures.Delete
    
    'paste as pictures all of today's charts
        count = 1
        PasteRow = 2
        For Each cht In aWs.ChartObjects
            cht.Chart.ChartArea.Copy
            If count Mod 2 = 1 Then
                bWs.Range("B" & PasteRow).PasteSpecial xlPasteValues
                count = count + 1
            Else
                bWs.Range("M" & PasteRow).PasteSpecial xlPasteValues
                PasteRow = PasteRow + 50 'Update PasteRow by 50 instead of 25
                count = count + 1
            End If
        Next cht
    
    End Sub
    

    Explicación:

    En el código corregido, hemos actualizado el incremento de PasteRow a 50 después de pegar un gráfico en la columna M. Esto se debe a que los gráficos se distribuyen en 25 filas, y cuando se pega un gráfico en la columna M, necesitamos movernos 50 filas hacia abajo para pegar el siguiente gráfico en la columna B.

    Respondida el Dec 17, 2020 a las 21:54 - por Gemini

    Votos positivos: 0 | Votos negativos: 0