将图表从一个 excel 电子表格提取到另一个,更改字体大小并使用 VBA 正确重新定位

Extract Charts from one excel spreadsheet to another, change the font size and reposition correctly using VBA

我想制作一个宏来使图表 moving/position 更容易一些,但是我的宏目前非常费力和缓慢 - 我相信这是一种更有效的方法!

问题 - 我有 2 个电子表格、绘图和 plotspdf。 Plots 电子表格有 10 个图表,另一个 (plotspdf) 是空白的。我希望宏使用简单的复制粘贴将 select 几个图表(为了参数的缘故,假设 1、3、5 和 8)移动到另一个电子表格。然后我想将字体大小更改为 8,将每个图表的格式(高度和宽度)更改为 7cm X 13cm。最后,我想重新定位图表,以便它们很好地适合页面 - 例如图表 1 正在移动到单元格 A1;图表 3 移动到单元格 G35 等

这就是我目前拥有的...有没有办法使这段代码 neater/more 更高效。提前谢谢你。

Sub ArrangeCharts()
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveSheet.Shapes.Range(Array("Chart 1", "Chart 2")).Select
    ActiveSheet.Shapes.Range(Array("Chart 1", "Chart 2", "Chart 3")).Select
    ActiveSheet.Shapes.Range(Array("Chart 1", "Chart 2", "Chart 3", "Chart 4")).Select
    Selection.Copy
    Sheets("plotspdf").Select
    Range("A2").Select
    ActiveSheet.Paste
    Selection.ShapeRange.Height = 198.4251968504
    Selection.ShapeRange.Width = 255.1181102362
    Range("E7").Select
    ActiveSheet.ChartObjects("Chart 4").Activate
    ActiveSheet.Shapes.Range(Array("Chart 4", "Chart 5")).Select
    ActiveSheet.Shapes.Range(Array("Chart 4", "Chart 5", "Chart 6")).Select
    Range("E4").Select
    ActiveSheet.ChartObjects("Chart 4").Activate
    ActiveSheet.Shapes("Chart 4").TextFrame2.TextRange.Font.Size = 8
    ActiveSheet.ChartObjects("Chart 5").Activate
    ActiveSheet.Shapes("Chart 5").TextFrame2.TextRange.Font.Size = 8
    ActiveSheet.ChartObjects("Chart 6").Activate
    ActiveSheet.Shapes("Chart 6").TextFrame2.TextRange.Font.Size = 8
    ActiveSheet.ChartObjects("Chart 7").Activate
    ActiveSheet.Shapes("Chart 7").TextFrame2.TextRange.Font.Size = 8
    ActiveSheet.ChartObjects("Chart 4").Activate
    ActiveSheet.ChartObjects("Chart 4").Activate
    ActiveSheet.Shapes("Chart 4").IncrementLeft 62
    ActiveSheet.Shapes("Chart 4").IncrementTop 12
    ActiveSheet.ChartObjects("Chart 5").Activate
    ActiveChart.PlotArea.Select
    ActiveChart.ChartArea.Select
    ActiveSheet.Shapes("Chart 5").IncrementLeft -125
    ActiveSheet.Shapes("Chart 5").IncrementTop 228
    ActiveSheet.ChartObjects("Chart 7").Activate
    ActiveSheet.Shapes("Chart 7").IncrementLeft -269
    ActiveSheet.Shapes("Chart 7").IncrementTop 174
    ActiveSheet.ChartObjects("Chart 7").Activate
    ActiveSheet.Shapes("Chart 7").IncrementLeft -48
    ActiveSheet.Shapes("Chart 7").IncrementTop 16
End Sub

此代码还会在尝试复制之前检查图表是否存在

Option Explicit
Sub arrangecharts()

    Const H_MM = 70 ' 70 mm
    Const W_MM = 130
    Const FACTOR = 2.835
    Const FONT_SIZE = 8

    Dim CHART_NAME As Variant, CHART_CELL As Variant
    CHART_NAME = Array("Chart 11", "Chart 3", "Chart 4", "Chart 7", "Chart 8")
    CHART_CELL = Array("A2", "I2", "A17", "I17", "A32")

    Dim wb As Workbook, wsSource As Worksheet, wsTarget As Worksheet
    Dim chtObj As ChartObject, dictCharts As Object
    Dim msg As String, i As Integer, count As Integer

    Set wb = ActiveWorkbook 'ThisWorkbook
    Set wsSource = wb.Sheets("plots")
    Set wsTarget = wb.Sheets("plotspdf")

    Set dictCharts = CreateObject("Scripting.Dictionary")
    With wsSource
        For Each chtObj In .ChartObjects
            dictCharts.Add chtObj.Name, chtObj.Index
            msg = msg & vbCr & chtObj.Index & vbTab & chtObj.Name
        Next
    End With
    MsgBox msg, vbInformation, "Charts on " & wsSource.Name

    ' check for charts
    msg = ""
    For i = 0 To UBound(CHART_NAME)
        If Not dictCharts.exists(CHART_NAME(i)) Then
            msg = msg & CHART_NAME(i) & vbCr
        End If
    Next

    ' confirm ignore errors
    If Len(msg) > 0 Then
      msg = "Charts not found" & vbCr & msg & "Continue ?"
      If vbNo = MsgBox(msg, vbYesNo, "Charts not found") Then Exit Sub
    End If

    count = 0
    wsTarget.Activate
    With wsTarget

        ' copy
        For i = 0 To UBound(CHART_NAME)
             'Debug.Print CHART_NAME(i)
             If dictCharts.exists(CHART_NAME(i)) Then
                wsSource.ChartObjects(CHART_NAME(i)).Copy
                .Range(CHART_CELL(i)).Select
                ActiveSheet.Paste
                Application.CutCopyMode = False
                count = count + 1
             End If
        Next

        ' format
        For Each chtObj In .ChartObjects
            'Debug.Print i, chtObj.Name   '
            chtObj.HEIGHT = H_MM * FACTOR
            chtObj.width = W_MM * FACTOR
            chtObj.Chart.ChartArea.Font.Size = FONT_SIZE
        Next

    End With
    MsgBox count & " charts copied", vbInformation, "Finished"

End Sub