Excel VBA сохранить скриншот

Я пытаюсь сделать скриншот листа в Excel с кодом VBA, а затем сохранить его по указанному пути, но мне не удалось сохранить его должным образом...

Sub My_Macro(Test, Path)
  Dim sSheetName As String
  Dim oRangeToCopy As Range
  Dim FirstCell As Range, LastCell As Range

  Worksheets(Test).Activate
  Set LastCell = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _
      SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _
      Cells.Find(What:="*", SearchOrder:=xlByColumns, _
      SearchDirection:=xlPrevious, LookIn:=xlValues).Column)
  Set FirstCell = Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _
      SearchDirection:=xlNext, LookIn:=xlValues).Row, _
      Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _
      SearchDirection:=xlNext, LookIn:=xlValues).Column)

  sSheetName = Test ' worksheet to work on

  With Worksheets(sSheetName)
      .Range(FirstCell, LastCell).CopyPicture xlScreen, xlPicture
      .Export Filename:=Path + Test + ".jpg", Filtername:="JPG"
  End With

End Sub

Excel не хочет выполнять метод .Экспорт... сразу после снятия скриншота. Поэтому я попытался вставить картинку в новую диаграмму. Excel сохраните изображение диаграммы в нужном месте с диаграммой на моей картинке... Я также попытался вставить его во временную таблицу, но Excel не хочет экспортировать он...

идеи

2 ответов


был занят идеей Любоша сука.

просто измените размер диаграммы. См. сценарий ниже.

Sub My_Macro(Test, Path)


 Test = "UNIT 31"
    Dim sSheetName As String
    Dim oRangeToCopy As Range
    Dim FirstCell As Range, LastCell As Range

    Worksheets(Test).Activate

    Set LastCell = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _
        SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _
        Cells.Find(What:="*", SearchOrder:=xlByColumns, _
        SearchDirection:=xlPrevious, LookIn:=xlValues).Column)

    Set FirstCell = Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _
        SearchDirection:=xlNext, LookIn:=xlValues).Row, _
        Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _
        SearchDirection:=xlNext, LookIn:=xlValues).Column)

    sSheetName = Test ' worksheet to work on

    With Worksheets(sSheetName).Range(FirstCell, LastCell)

        .CopyPicture xlScreen, xlPicture
        'Getting the Range height
        PicHeight = .Height
        'Getting the Range Width
        PicWidth = .Width

        ''.Export Filename:=Path + Test + ".jpg", Filtername:="JPG"   'REMOVE THIS LINE


    End With


    With Worksheets(sSheetName)

        'Creating the Chart
        .ChartObjects.Add(30, 44, PicWidth, PicHeight).Name = "TempChart"

        With .ChartObjects("TempChart")

            'Pasting the Image
            .Chart.Paste
            'Exporting the Chart
            .Chart.Export Filename:=Path + Test + ".jpg", Filtername:="JPG"

        End With

        .ChartObjects("TempChart").Delete

    End With

End Sub

Я делал что-то подобное несколько месяцев назад. Мне нужно сделать скриншот определенного диапазона и экспортировать его в файл. После нескольких часов головокружения в таблице я нашел решение с .chart.export что кажется мне наиболее удобным для пользователя. Пожалуйста, взгляните на мой код, я думаю, вы можете легко обновить его с вашими потребностями. Простая мысль-создать диаграмму, вставить все, что вы хотите, чтобы сделать снимок экрана, экспортировать диаграмму в изображение, а затем удалить id. Просто и элегантно. Не стесняйтесь спрашивать, есть ли какая-то проблема!--4-->

Sub takeScreen()
    Dim mainSheet As Worksheet
    Set mainSheet = Sheets("Input-Output")

    Dim path As String
    path = Application.ActiveWorkbook.path

    Application.ScreenUpdating = False


    If Dir(path & "\figures\", vbDirectory) = "" Then
        MsgBox "Directory figures not found. Cannot save image."
        Exit Sub
    End If

    With mainSheet
        .ChartObjects.Add(30, 44, 765, 868).Name = "exportChart"
        With .ChartObjects("exportChart")
            .Chart.ChartArea.Border.LineStyle = xlNone
            .Chart.ChartArea.Fill.Visible = False
            mainSheet.Range(mainSheet.Cells(4, "B"), mainSheet.Cells(60, "L")).CopyPicture
            .Chart.Paste
            .Chart.Export fileName:=path & "\figures\" & "fatigue_summary.png ", FilterName:="png"
        End With
        .ChartObjects("exportChart").Delete
    End With

    Application.ScreenUpdating = True

End Sub

по вашему комментарию, я думаю, вы можете рассчитать размер диаграммы размеры строк и столбцов и их количество. Или вы можете изменить размер диаграммы, используя атрибуты положения и размера ячеек. (look for .cells().width, .cells().height,.cells().top, .cells().left)