Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1920to1924
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Tabelle als Bild
06.03.2023 16:21:01
Udo
Hallo
Wieder mal eine Frage ob es diese Möglichkeit überhaupt gibt.
Ich habe eine Excel Mappe (Ligaauswertung) mit mehreren Tabellenblättern,
deren Inhalt kann ich mit einem Makro als PDF in den Ordner, wo die Excel Datei drinnen ist speichern.
Das ist eigentlich perfekt. Nun ist es so das ich die gespeicherten PDF´s immer mit einem Zusatzprogramm (PDF Converter) auf Jpeg umwandle.
Nun zu meiner Frage: ist es möglich den Inhalt des Tabellenblattes (Duckbereich) mittels Makro gleich als Bilddatei zu speichern?
Vielen Dank für eure Antworten
LG

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabelle als Bild
06.03.2023 16:43:11
Nepumuk
Hallo Udo,
teste mal:
Option Explicit
Public Sub MakePicture()
    Dim objChart As Chart, objChartObject As ChartObject
    Dim objWorksheet As Worksheet
    Dim objRange As Range
    Application.ScreenUpdating = False
    Set objChart = Charts.Add
    For Each objWorksheet In ThisWorkbook.Worksheets
        With objWorksheet
            Set objRange = .Range(.PageSetup.PrintArea)
            objRange.CopyPicture Appearance:=xlScreen, Format:=xlPicture
            Set objChartObject = objChart.ChartObjects.Add(0, 0, objRange.Width, objRange.Height)
            With objChartObject
                Call .Activate
                With .Chart
                    Call .Paste
                    Call .Export(Filename:="H:\" & objWorksheet.Name & ".jpg", _
                        FilterName:="JPG", Interactive:=False) 'Pfad anpassen !!!
                End With
            End With
        End With
    Next
    Application.DisplayAlerts = False
    Call objChart.Delete
    Application.DisplayAlerts = True
    Set objRange = Nothing
    Set objChartObject = Nothing
    Set objChart = Nothing
    Application.ScreenUpdating = True
End Sub
Gruß
Nepumuk
Anzeige
AW: Tabelle als Bild
06.03.2023 16:56:16
Udo
Vielen Dank für deine Mühe
Ist leider nicht ganz so wie ich mir es wünsche.
Ich hätte gerne das erstens das Bild im Ordner wo die Excel Datei sich befindet gespeichert wird.
Bei deinem Makro wird ein neues Tabellenblatt angelegt "Diagramm", das möchte ich auch nicht.
Vielleicht ist es auch gar nicht möglich so wie ich mir das vorstelle.
Mein Traum wäre ich klick aufs Makro und in dem Ordner ist der Druckbereich als Bild.
PDF funktioniert einwandfrei, nur möchte ich mir das umwandeln der PDF´s ersparen.
Das ist mein Code für PDF
Sub Spielplan_pdf()
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ThisWorkbook.Path & "\" & Range("ag1") & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
False
End Sub
LG Udo
Anzeige
AW: Tabelle als Bild
06.03.2023 17:02:14
Nepumuk
Hallo Udo,
was stört dich an dem Chart? Es wird doch am Ende wieder gelöscht. Und ich habe doch einen Kommentar eingefügt "Pfad anpassen !!!".
                    Call .Export(Filename:="ThisWorkbook.Path & "\" & Range("AG1") & ".jpg", _
                        FilterName:="JPG", Interactive:=False) 'Pfad anpassen !!!
Gruß
Nepumuk
AW: Tabelle als Bild
06.03.2023 17:16:41
Udo
Habe den Code jetzt so ausgeführt
Option Explicit

Public Sub MakePicture()
  
      Dim objChart As Chart, objChartObject As ChartObject
      Dim objWorksheet As Worksheet
      Dim objRange As Range
  
      Application.ScreenUpdating = False
  
      Set objChart = Charts.Add
  
      For Each objWorksheet In ThisWorkbook.Worksheets
  
          With objWorksheet
  
              Set objRange = .Range(.PageSetup.PrintArea)
  
              objRange.CopyPicture Appearance:=xlScreen, Format:=xlPicture
  
              Set objChartObject = objChart.ChartObjects.Add(0, 0, objRange.Width, objRange.Height)
  
              With objChartObject
  
                  Call .Activate
  
                  With .Chart
  
                      Call .Paste
                         Call .Export(Filename:="ThisWorkbook.Path & "\" & Range("A1") & ".jpg", _
                          FilterName:="JPG", Interactive:=False)
                          
                                
  
                  End With
  
              End With
          End With
      Next
  
      Application.DisplayAlerts = False
      Call objChart.Delete
      Application.DisplayAlerts = True
  
      Set objRange = Nothing
      Set objChartObject = Nothing
      Set objChart = Nothing
  
      Application.ScreenUpdating = True
  
  End Sub
kommt immer Fehler beim komplimieren ?
Kannst du mir da noch weiterhelfen?
Vielen Dank
Anzeige
AW: Tabelle als Bild
06.03.2023 17:21:03
Nepumuk
Hallo Udo,
welche Zeile markiert der Debugger?
Gruß
Nepumuk
AW: Tabelle als Bild
06.03.2023 22:05:36
Udo
Call .Export(Filename:="ThisWorkbook.Path & "\" & Range("A1") & ".jpg", _
FilterName:="JPG", Interactive:=False)
LG Udo
AW: Tabelle als Bild
06.03.2023 22:48:55
onur
.Export Filename:=ThisWorkbook.Path & "\" & Range("A1") & ".jpg", FilterName:="JPG", Interactive:=False

AW: Tabelle als Bild
07.03.2023 13:48:14
Udo
Hallo
Danke für deine Antwort jetzt kommt die Meldung
Laufzeitfehler 1004
Anwendungs- oder objektdefinierter Fehler?
Code sieht nun so aus
Option Explicit

Public Sub MakePicture()
      
          Dim objChart As Chart, objChartObject As ChartObject
          Dim objWorksheet As Worksheet
          Dim objRange As Range
      
          Application.ScreenUpdating = False
      
          Set objChart = Charts.Add
      
          For Each objWorksheet In ThisWorkbook.Worksheets
      
              With objWorksheet
      
                  Set objRange = .Range(.PageSetup.PrintArea)
      
                  objRange.CopyPicture Appearance:=xlScreen, Format:=xlPicture
      
                  Set objChartObject = objChart.ChartObjects.Add(0, 0, objRange.Width, objRange.Height)
      
                  With objChartObject
      
                      Call .Activate
      
                      With .Chart
      
                          Call .Paste
                        .Export Filename:=ThisWorkbook.Path & "\" & Range("A1") & ".jpg", FilterName:="JPG", Interactive:=False
      
                      End With
      
                  End With
              End With
          Next
      
          Application.DisplayAlerts = False
          Call objChart.Delete
          Application.DisplayAlerts = True
      
          Set objRange = Nothing
          Set objChartObject = Nothing
          Set objChart = Nothing
      
          Application.ScreenUpdating = True
      
      End Sub
LG Udo
Anzeige
AW: Tabelle als Bild
07.03.2023 14:01:26
onur
Und wieder einmal verrätst du nicht, WO der Fehler kommt. So eine Fehlermeldung OHNE die Position ist wertlos !!!
AW: Tabelle als Bild
07.03.2023 14:05:04
Udo
Es kommt nur das Fenster mir der Fehlermeldung, es ist keine Zeile markiert.
LG
AW: Tabelle als Bild
07.03.2023 14:06:20
onur
NATÜRLICH NICHT , solange du nicht auf "Debuggen" klickst.....
AW: Tabelle als Bild
07.03.2023 14:10:41
Udo
OK oder Hilfe
mehr kann ich nicht drücken
LG
AW: Tabelle als Bild
07.03.2023 14:15:53
onur
Lass mal all die "Call"s weg - was soll das eigentlich? Das sind doch alles normale VBA-Befehle und keine Subs.
Wenn das nicht hilft, poste die Datei.
AW: Tabelle als Bild
07.03.2023 14:30:52
Nepumuk
Hallo Udo,
teste mal das:
Option Explicit
Public Sub MakePicture()
    Dim objChart As Chart, objChartObject As ChartObject
    Dim objWorksheet As Worksheet
    Dim objRange As Range
    Application.ScreenUpdating = False
    Set objChart = Charts.Add
    For Each objWorksheet In ThisWorkbook.Worksheets
        With objWorksheet
            Set objRange = .Range(.PageSetup.PrintArea)
            On Error Resume Next
            Do
                objRange.CopyPicture Appearance:=xlScreen, Format:=xlPicture
                If Err.Number = 0 Then Exit Do
                Call Err.Clear
            Loop
            On Error GoTo 0
            Set objChartObject = objChart.ChartObjects.Add(0, 0, objRange.Width, objRange.Height)
            With objChartObject
                Call .Activate
                With .Chart
                    Call .Paste
                    Call .Export(Filename:=ThisWorkbook.Path & "\" & objWorksheet.Range("A1").Text & ".jpg", _
                        FilterName:="JPG", Interactive:=False)
                End With
            End With
        End With
    Next
    Application.DisplayAlerts = False
    Call objChart.Delete
    Application.DisplayAlerts = True
    Set objRange = Nothing
    Set objChartObject = Nothing
    Set objChart = Nothing
    Application.ScreenUpdating = True
End Sub
Gruß
Nepumuk
Anzeige
AW: Tabelle als Bild
07.03.2023 14:45:38
Udo
Juhu
Perfekt
Genau wie ich es mir vorgestellt habe
Vielen Dank
AW: Tabelle als Bild
07.03.2023 15:45:05
Udo
Hallo nochmal
Wie gesagt der Code funktioniert einwandfrei.
Wie sieht es aus, wenn ich mehrere Tabellenblätter habe?
Mir ist gerade aufgefallen sobald ich ein neues Tabellenblatt in der Mappe hinzufüge, dass der Code nicht mehr funktioniert.
Wo oder wie spreche ich das gewünschte Tabellenblatt an?
Vielen lieben Dank
AW: Tabelle als Bild
07.03.2023 17:10:10
Nepumuk
Hallo Udo,
momentan werden alle Tabellenblätter gedruckt. Willst du nur bestimmte Tabellen drucken, dann so:
Option Explicit
Public Sub MakePicture()
    Dim objChart As Chart, objChartObject As ChartObject
    Dim vntWorksheet As Variant
    Dim objRange As Range
    Application.ScreenUpdating = False
    Set objChart = Charts.Add
    With ThisWorkbook
        For Each vntWorksheet In Array(.Worksheets("Tabelle1"), .Worksheets("Tabelle2"), .Worksheets("Tabelle3")) 'Anpassen !!!
            With vntWorksheet
                Set objRange = .Range(.PageSetup.PrintArea)
                On Error Resume Next
                Do
                    objRange.CopyPicture Appearance:=xlScreen, Format:=xlPicture
                    If Err.Number = 0 Then Exit Do
                    Call Err.Clear
                Loop
                On Error GoTo 0
                Set objChartObject = objChart.ChartObjects.Add(0, 0, objRange.Width, objRange.Height)
                With objChartObject
                    Call .Activate
                    With .Chart
                        Call .Paste
                        Call .Export(Filename:=ThisWorkbook.Path & "\" & vntWorksheet.Range("A1").Text & ".jpg", _
                            FilterName:="JPG", Interactive:=False)
                    End With
                End With
            End With
        Next
    End With
    Application.DisplayAlerts = False
    Call objChart.Delete
    Application.DisplayAlerts = True
    Set objRange = Nothing
    Set objChartObject = Nothing
    Set objChart = Nothing
    Application.ScreenUpdating = True
End Sub
Gruß
Nepumuk
Anzeige
AW: Tabelle als Bild
07.03.2023 17:27:57
Udo
Wow
Vielen Dank
Perfekt
Nur beim alten code kommt bei mehreren, Laufzeitfehler Meldung.
Egal, jetzt funktionierts super DAAANKE
AW: Tabelle als Bild
08.03.2023 18:24:57
Udo
Hallo Nepumuk
Bin gerade am basteln das ich den Code in meine Tabelle einfüge.
Funktioniert bestens.
Die Bilddateien sind jetzt alle ein bisschen in die breite gezogen, ich denke weil der Druckbereich das ganze Bild ausfüllt.
Meine Frage kann man dies auch verändern? Das wieder der Rand vom Blatt zu sehen ist, das das Bild nicht in die Breite gezogen wird?
LG
AW: Tabelle als Bild
08.03.2023 19:28:02
Nepumuk
Hallo Udo,
teste mal das:
Option Explicit
Private Declare PtrSafe Function OleCreatePictureIndirect Lib "oleaut32.dll" ( _
    ByRef PicDesc As PICT_DESC, _
    ByRef RefIID As GUID, _
    ByVal fPictureOwnsHandle As LongPtr, _
    ByRef IPic As IPicture) As LongPtr
Private Declare PtrSafe Function CopyImage Lib "user32.dll" ( _
    ByVal handle As LongPtr, _
    ByVal un1 As Long, _
    ByVal n1 As Long, _
    ByVal n2 As Long, _
    ByVal un2 As Long) As LongPtr
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32.dll" ( _
    ByVal wFormat As Long) As Long
Private Declare PtrSafe Function OpenClipboard Lib "user32.dll" ( _
    ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetClipboardData Lib "user32.dll" ( _
    ByVal wFormat As Long) As LongPtr
Private Declare PtrSafe Function DeleteObject Lib "gdi32.dll" ( _
    ByVal hObject As LongPtr) As Long
Private Declare PtrSafe Function CLSIDFromString Lib "ole32.dll" ( _
    ByVal lpsz As Any, _
    ByRef pCLSID As GUID) As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32.dll" () As Long
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type
Private Type PICT_DESC
    Size As Long
    Type As Long
    hPic As LongPtr
    hPal As LongPtr
End Type
Private Const PICTYPE_BITMAP As Long = 1
Private Const CF_BITMAP As Long = 2
Private Const IMAGE_BITMAP As Long = 0
Private Const LR_COPYRETURNORG  As Long = &H4
Private Const GUID_IPICTUREDISP As String = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"
Private Const FORMAT_ID_JPG As String = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
Private llngptrCopy As LongPtr
Public Sub SaveRange()
    Dim objPicture As IPictureDisp
    Dim objRange As Range
    Dim objImageFile As Object, objImageProcess As Object
    Dim strPicturePath As String, strTempPicturePath As String
    Dim lngptrhPic As LongPtr
    Dim vntWorksheet As Variant
    strTempPicturePath = Environ$("TMP") & "\Temp.bmp"
    Set objImageFile = CreateObject(Class:="WIA.ImageFile")
    Set objImageProcess = CreateObject(Class:="WIA.ImageProcess")
    With objImageProcess
        Call .Filters.Add(FilterID:=.FilterInfos("Convert").FilterID)
        .Filters.Item(1).Properties("FormatID") = FORMAT_ID_JPG
        .Filters.Item(1).Properties("Quality") = 100
    End With
    With ThisWorkbook
        For Each vntWorksheet In Array(.Worksheets("Tabelle1")) ', .Worksheets("Tabelle2"), .Worksheets("Tabelle3")) 'Anpassen !!!
            With vntWorksheet
                Set objRange = .Range(.PageSetup.PrintArea)
                strPicturePath = ThisWorkbook.Path & "\" & .Range("A1").Text & ".jpg"
            End With
            Call OpenClipboard(CLngPtr(Application.hwnd))
            Call EmptyClipboard
            Call CloseClipboard
            On Error Resume Next
            Do
                Call objRange.CopyPicture(Appearance:=xlScreen, Format:=xlBitmap)
                If Err.Number = 0 Then Exit Do
                Call Err.Clear
                DoEvents
            Loop
            Do
                Set objPicture = Paste_Picture(lngptrhPic)
                If Not objPicture Is Nothing Then Exit Do
                Err.Clear
                DoEvents
            Loop
            On Error GoTo 0
            Call SavePicture(Picture:=objPicture, Filename:=strTempPicturePath)
            Call objImageFile.LoadFile(Filename:=strTempPicturePath)
            Set objImageFile = objImageProcess.Apply(Source:=objImageFile)
            If Dir$(PathName:=strPicturePath) > vbNullString Then Call Kill(PathName:=strPicturePath)
            Call objImageFile.SaveFile(Filename:=strPicturePath)
            Call Kill(PathName:=strTempPicturePath)
            Call DeleteObject(lngptrhPic)
        Next
    End With
    Set objPicture = Nothing
    Set objImageProcess = Nothing
    Set objImageFile = Nothing
End Sub
Private Function Paste_Picture(ByRef prlngptrhPic As LongPtr) As IPictureDisp
    Dim lngReturn As Long, lngptrPointer As LongPtr
    If CBool(IsClipboardFormatAvailable(CF_BITMAP)) Then
        lngReturn = OpenClipboard(CLngPtr(Application.hwnd))
        If lngReturn = 1 Then
            lngptrPointer = GetClipboardData(CF_BITMAP)
            prlngptrhPic = CopyImage(lngptrPointer, _
                IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
            Call CloseClipboard
            If lngptrPointer > 0 Then Set Paste_Picture = _
                Create_Picture(prlngptrhPic, 0&)
        End If
    End If
End Function
Private Function Create_Picture( _
    ByVal pvlngptrhPic As LongPtr, _
    ByVal pvlngptrhPal As LongPtr) As IPictureDisp
    Dim udtPicInfo As PICT_DESC, udtID_IDispatch As GUID
    Dim objPicture As IPictureDisp
    Call CLSIDFromString(StrPtr( _
        GUID_IPICTUREDISP), udtID_IDispatch)
    With udtPicInfo
        .Size = LenB(udtPicInfo)
        .Type = PICTYPE_BITMAP
        .hPic = pvlngptrhPic
        .hPal = pvlngptrhPal
    End With
    Call OleCreatePictureIndirect(udtPicInfo, _
        udtID_IDispatch, 0, objPicture)
    Set Create_Picture = objPicture
    Set objPicture = Nothing
End Function
Gruß
Nepumuk
Anzeige
AW: Tabelle als Bild
08.03.2023 19:39:06
Udo
Vielen Dank!
Funzt einwandfrei
LG
AW: Tabelle als Bild
07.03.2023 14:44:55
Udo
Funktioniert
Vielen Dank!!
AW: Tabelle als Bild
07.03.2023 14:53:26
Udo
Auch wenn in A1 was steht kommt die Laufzeitfehler Meldung.
Danke für deine Mühe, der Code von Nepumuk funktioniert.
Vielen lieben Dank für eure Mühe, ihr seits a Wahnsinn
LG

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige