Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1924to1928
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
Inhaltsverzeichnis

Bitmap in UF

Bitmap in UF
27.03.2023 09:58:13
Fred

Schönen Wochenbeginn, Excel Profis
ich kopiere einen Bereich und füge diesen (in "W1") bisher so ein:

Sub bild1()
   Dim rRange_To_Copy As Range
   Set rRange_To_Copy = Sheets("1Hz").Range("DA1:DK6")
    rRange_To_Copy.CopyPicture xlScreen, xlBitmap
    Range("W1").Select
    ActiveSheet.Paste
    With Selection
     .Height = .Height * 0.895
     .Width = .Width * 0.895
    End With
End Sub

Meine Frage;
Ist es möglich, das Bitmap in Userform zu laden?
Oder zumindest oberhalb vom Tabellenbereich (Menüband) zu positionieren???

Gruss
Fred

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bitmap in UF
27.03.2023 11:10:22
volti
Hallo Fred,

hier eine Idee dazu.
In der Userform ein Image-Objekt anlegen und mit dem PictureSizeMode spielen (Zoom, Stretch).

Der angegebene Bereich muss ggf. größenmäßig in das Image der Userform reinpassen....

Schau mal, ob es kappt.

Code:


Option Explicit Private Declare PtrSafe Function OleCreatePictureIndirect Lib "oleaut32.dll" ( _ ByRef PicDesc As PIC_DESC, ByRef RefIID As GUID, _ ByVal fPictureOwnsHandle As LongPtr, ByRef IPic As IPictureDisp) As Long Private Declare PtrSafe Function CopyImage Lib "user32" ( _ 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" ( _ ByVal wFormat As Long) As Long Private Declare PtrSafe Function GetClipboardData Lib "user32" ( _ ByVal wFormat As Long) As LongPtr Private Declare PtrSafe Function OpenClipboard Lib "user32" ( _ ByVal hWnd As LongPtr) As Long Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Type PIC_DESC lSize As Long lType As Long hPic As LongPtr hPal As LongPtr End Type Private Const PICTYPE_BITMAP = 1 Private Const CF_BITMAP = 2 Private Const IMAGE_BITMAP = 0 Private Const LR_COPYRETURNORG = &H4 Sub Paste_Picture_In_UF() ' Fügt ein Bild aus der Zwischenablage in ein Userform-Control ein Dim oPict As IPictureDisp Dim tPicInfo As PIC_DESC, tID_IDispatch As GUID ThisWorkbook.Sheets("1Hz").Range("DA1:DK6").Copy If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then If OpenClipboard(0&) <> 0 Then With tID_IDispatch .Data1 = &H20400 .Data4(0) = &HC0 .Data4(7) = &H46 End With With tPicInfo .lSize = LenB(tPicInfo) .lType = PICTYPE_BITMAP .hPic = CopyImage(GetClipboardData(CF_BITMAP), _ IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG) CloseClipboard If .hPic > 0 Then _ OleCreatePictureIndirect tPicInfo, tID_IDispatch, 0&, oPict End With If Not oPict Is Nothing Then ' ######### Hier die Userform und Image-Angaben anpassen ######## UserForm1.Image3.Picture = oPict Else MsgBox "Das Bild kann nicht angezeigt werden", vbCritical, "Bild einfügen" End If End If End If UserForm1.Show End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz



Anzeige
AW: Bitmap in UF
27.03.2023 12:32:43
Fred
Hallo Oberschlumpf und Karl Heinz,
anfangs dachte ich an eine Alternative, ein Makro zu schreiben, um das Bild aus der Excel-Arbeitsmappe zu nehmen, es in einer Datei zu speichern und dann aus dieser Datei in das UserForm zu laden. Direkter scheint es aber doch zu gehen.
Den Ansatz von Oberschlumpf konnte ich bisher noch nicht nachgehen, das Makro von Karl Heinz klappt.
Ich möchte noch gerne eine "IF" Anweisung einbauen, das wenn "Sheets("1Hz").Range("G2")=1 dann
ThisWorkbook.Sheets("1Hz").Range("DA1:DK6").Copy
ansonsten

ThisWorkbook.Sheets("1Hz").Range("DJ1:DN6").Copy
Ich muss nun aber leider unterbrechen,- meiner Demenzkranken Mutter geht es im Moment ganz schlecht.
Werde mich aber nochmals melden.

Gruss
Fred


Anzeige
AW: Bitmap in UF
27.03.2023 14:55:06
Fred
Hallo Karl Heinz,
ich habe noch eine Frage zu deinen Makro.
Wie bekomme ich 2 Bild-Bereiche in Image3 und Image4,
bei Kriterium in "E1" =1 oder 2 ??
Das füllen von Image3 ist wohl erledigt,- soweit OK
https://www.herber.de/bbs/user/158462.xlsb
In der Mappe ist das Kriterium "E1", UserForm1 und Bild-Bereiche
Kannst du bitte mal drauf schauen und eine Lösung anbieten?

Gruss
Fred


AW: Bitmap in UF
27.03.2023 15:40:35
volti
Hallo Fred,

meintest Du das so?

Code:


Private Declare PtrSafe Function OleCreatePictureIndirect Lib "oleaut32.dll" ( _ ByRef PicDesc As PIC_DESC, ByRef RefIID As GUID, _ ByVal fPictureOwnsHandle As LongPtr, ByRef IPic As IPictureDisp) As Long Private Declare PtrSafe Function CopyImage Lib "user32" ( _ 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" ( _ ByVal wFormat As Long) As Long Private Declare PtrSafe Function GetClipboardData Lib "user32" ( _ ByVal wFormat As Long) As LongPtr Private Declare PtrSafe Function OpenClipboard Lib "user32" ( _ ByVal hWnd As LongPtr) As Long Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Type PIC_DESC lSize As Long lType As Long hPic As LongPtr hPal As LongPtr End Type Private Const PICTYPE_BITMAP = 1 Private Const CF_BITMAP = 2 Private Const IMAGE_BITMAP = 0 Private Const LR_COPYRETURNORG = &H4 Sub Paste_Picture_In_UF() If Sheets("1Hz").Range("E1") = 1 Then AppActivate UserForm1.Caption, True ' _____________________neu Call Paste_Picture_In_UF_EX(1, "DA1:DE6") Else AppActivate UserForm1.Caption, True ' _____________________neu Call Paste_Picture_In_UF_EX(2, "DM1:DQ6") End If End Sub Sub Paste_Picture_In_UF_EX(iUF As Integer, sBer As String) ' Fügt ein Bild aus der Zwischenablage in ein Userform-Control ein Dim oPict As IPictureDisp Dim tPicInfo As PIC_DESC, tID_IDispatch As GUID ThisWorkbook.Sheets("1Hz").Range(sBer).Copy If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then If OpenClipboard(0&) <> 0 Then With tID_IDispatch .Data1 = &H20400 .Data4(0) = &HC0 .Data4(7) = &H46 End With With tPicInfo .lSize = LenB(tPicInfo) .lType = PICTYPE_BITMAP .hPic = CopyImage(GetClipboardData(CF_BITMAP), _ IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG) If .hPic > 0 Then _ OleCreatePictureIndirect tPicInfo, tID_IDispatch, 0&, oPict End With EmptyClipboard CloseClipboard If Not oPict Is Nothing Then ' ######### Hier die Userform und Image-Angaben anpassen ######## Select Case sUF Case 1: UserForm1.Image3.Picture = oPict Case 2: UserForm1.Image4.Picture = oPict End Select Else MsgBox "Das Bild kann nicht angezeigt werden!", vbCritical, "Bild einfügen" End If End If End If Application.CutCopyMode = False End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz



Anzeige
AW: Bitmap in UF
27.03.2023 16:54:33
volti
Update...
Ich glaube, so war es gemeint.

Code:


Private Declare PtrSafe Function OleCreatePictureIndirect Lib "oleaut32.dll" ( _ ByRef PicDesc As PIC_DESC, ByRef RefIID As GUID, _ ByVal fPictureOwnsHandle As LongPtr, ByRef IPic As IPictureDisp) As Long Private Declare PtrSafe Function CopyImage Lib "user32" ( _ 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" ( _ ByVal wFormat As Long) As Long Private Declare PtrSafe Function GetClipboardData Lib "user32" ( _ ByVal wFormat As Long) As LongPtr Private Declare PtrSafe Function OpenClipboard Lib "user32" ( _ ByVal hWnd As LongPtr) As Long Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Type PIC_DESC lSize As Long lType As Long hPic As LongPtr hPal As LongPtr End Type Private Const PICTYPE_BITMAP = 1 Private Const CF_BITMAP = 2 Private Const IMAGE_BITMAP = 0 Private Const LR_COPYRETURNORG = &H4 Sub Paste_Picture_In_UF() If Sheets("1Hz").Range("E1") = 1 Then AppActivate UserForm1.Caption, True Call Paste_Picture_In_UF_EX(3, "DA1:DE6") Call Paste_Picture_In_UF_EX(4, "DG1:DK6") ElseIf Sheets("1Hz").Range("E1") = 2 Then AppActivate UserForm1.Caption, True Call Paste_Picture_In_UF_EX(3, "DM1:DQ6") Call Paste_Picture_In_UF_EX(4, "DS1:DW6") End If End Sub Sub Paste_Picture_In_UF_EX(iUF As Integer, sBer As String) ' Fügt ein Bild aus der Zwischenablage in ein Userform-Control ein Dim oPict As IPictureDisp Dim tPicInfo As PIC_DESC, tID_IDispatch As GUID ThisWorkbook.Sheets("1Hz").Range(sBer).Copy If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then If OpenClipboard(0&) <> 0 Then With tID_IDispatch .Data1 = &H20400 .Data4(0) = &HC0 .Data4(7) = &H46 End With With tPicInfo .lSize = LenB(tPicInfo) .lType = PICTYPE_BITMAP .hPic = CopyImage(GetClipboardData(CF_BITMAP), _ IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG) If .hPic > 0 Then _ OleCreatePictureIndirect tPicInfo, tID_IDispatch, 0&, oPict End With EmptyClipboard CloseClipboard If Not oPict Is Nothing Then ' ######### Hier die Userform und Image-Angaben anpassen ######## Select Case iUF Case 3: UserForm1.Image3.Picture = oPict Case 4: UserForm1.Image4.Picture = oPict End Select Else MsgBox "Das Bild kann nicht angezeigt werden!", vbCritical, "Bild einfügen" End If End If End If Application.CutCopyMode = False End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz



Anzeige
AW: Bitmap in UF
27.03.2023 19:11:40
Fred
Hallo Karl Heinz,
ich hatte u.a. den Eindruck, das "flüssiger geladen wird,- und ohne Meldung", das das UF öfters den Focus erhalten muss...
Habe nun mehrere "SetFocus" gesetzt (wahrscheinlich unnötig viele) und ich habe den Eindruck, das es nun am besten läuft ...
https://www.herber.de/bbs/user/158469.xlsb

Gruss
Fred


AW: Bitmap in UF
27.03.2023 17:35:33
Fred
Hallo Karl Heinz,
vorweg; Entschuldige bitte, das meine Antwort so viel Zeit dauerte. Ich mußte meine Mutter zum Zahnarzt fahren ...
und vielen Dank für die (individuelle) MakroArbeit!
Leider funzt es nicht. Es kommt immer wieder die Meldung: "Das Bild kann nicht angezeigt werden!"
https://www.herber.de/bbs/user/158466.xlsb
Ich habe die Mappe mit dem "Neuen Makro" nochmals angefügt.
Schaust du - bei Zeit und Lust - nochmals drauf?

Gruss
Fred


Anzeige
AW: Bitmap in UF
27.03.2023 17:47:37
Fred
IKarl Heinz,
ich sehe gerade, das du während ich wieder zuHause bin, mir "die Version aktualisiert hast"
Es ladet nun - gelegentlich flüssig - ein. Manchmal aber auch nicht.
Kann ich das eigentlich so bauen,- da die "erste Version" (mit den Bildern nach Image3) gefühlt flüssiger lief, dieses Makro eben für Image3 nehme und das Makro kopiere und das kopierte Makro auf Image4 einstelle. Dann die Makros nacheinander aufrufe?

Gruss
Fred


AW: Bitmap in UF
27.03.2023 19:33:40
volti
Hi,

ich habe noch ein bisschen was umgestellt. Schau mal, ob es jetzt besser läuft.

Code:


Private Declare PtrSafe Function OleCreatePictureIndirect Lib "oleaut32.dll" ( _ ByRef PicDesc As PIC_DESC, ByRef RefIID As GUID, _ ByVal fPictureOwnsHandle As LongPtr, ByRef IPic As IPictureDisp) As Long Private Declare PtrSafe Function CopyImage Lib "user32" ( _ 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" ( _ ByVal wFormat As Long) As Long Private Declare PtrSafe Function GetClipboardData Lib "user32" ( _ ByVal wFormat As Long) As LongPtr Private Declare PtrSafe Function OpenClipboard Lib "user32" ( _ ByVal hWnd As LongPtr) As Long Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long Private Declare PtrSafe Function CLSIDFromString Lib "ole32.dll" ( _ ByVal lpsz As Any, ByRef pCLSID As GUID) As Long Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Type PIC_DESC lSize As Long lType As Long hPic As LongPtr hPal As LongPtr End Type Private Const PICTYPE_BITMAP = 1 Private Const CF_BITMAP = 2 Private Const IMAGE_BITMAP = 0 Private Const LR_COPYRETURNORG = &H4 Private Const GUID_IPICTUREDISP As String = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}" Sub Paste_Picture_In_UF() If Sheets("1Hz").Range("E1") = 1 Then AppActivate UserForm1.Caption, True Call Paste_Picture_In_UF_EX(3, "DA1:DE6") Call Paste_Picture_In_UF_EX(4, "DG1:DK6") ElseIf Sheets("1Hz").Range("E1") = 2 Then AppActivate UserForm1.Caption, True Call Paste_Picture_In_UF_EX(3, "DM1:DQ6") Call Paste_Picture_In_UF_EX(4, "DS1:DW6") End If End Sub Sub Paste_Picture_In_UF_EX(iUF As Integer, sBer As String) ' Fügt ein Bild aus der Zwischenablage in ein Userform-Control ein Dim oPict As IPictureDisp Dim tPicInfo As PIC_DESC, tID_IDispatch As GUID OpenClipboard (0&) EmptyClipboard CloseClipboard On Error Resume Next Do ThisWorkbook.Sheets("1Hz").Range(sBer).CopyPicture Appearance:=xlScreen, Format:=xlBitmap If Err = 0 Then Exit Do Err.Clear Loop If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then If OpenClipboard(0&) <> 0 Then Call CLSIDFromString(StrPtr(GUID_IPICTUREDISP), tID_IDispatch) With tPicInfo .lSize = LenB(tPicInfo) .lType = PICTYPE_BITMAP .hPic = CopyImage(GetClipboardData(CF_BITMAP), _ IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG) End With If tPicInfo.hPic <> 0 Then _ OleCreatePictureIndirect tPicInfo, tID_IDispatch, 0&, oPict If Not oPict Is Nothing Then Select Case iUF Case 3: UserForm1.Image3.Picture = oPict Case 4: UserForm1.Image4.Picture = oPict End Select Else MsgBox "Das Bild kann nicht angezeigt werden!", vbCritical, "Bild einfügen" End If End If CloseClipboard End If Application.CutCopyMode = False End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz



Anzeige
AW: Bitmap in UF- Super volti
27.03.2023 20:56:42
Fred
Karl Heinz,
nun läuft es wie gewünscht!!
zB "Private Const GUID_IPICTUREDISP As String = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"" und anderes sind wohl echt Insider-Wissen.

Vielen Dank fpr deine Ausdauer und Kompetenz!

Gruss
Fred


Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige