Thema Datum  Von Nutzer Rating
Antwort
15.12.2024 09:45:49 Sonja
NotSolved
15.12.2024 10:58:01 ralf_b
NotSolved
Rot Einfügen von Grafiken verhinertn
15.12.2024 19:06:39 volti
NotSolved
16.12.2024 19:00:07 xlKing
NotSolved
01.01.2025 22:08:27 Gast7777
NotSolved

Ansicht des Beitrags:
Von:
volti
Datum:
15.12.2024 19:06:39
Views:
50
Rating: Antwort:
  Ja
Thema:
Einfügen von Grafiken verhinertn

Hallo Sonja,

das läßt sich m.E. nicht so einfach verhindern. Ich kenne keine Methode.

Leider bietet Excel kein BeforeInsert-Event...
Dann könnte man die Zwischenablage auf unerwünschte Formate abklopfen und Dein Wunsch wäre erfüllt.

Leider bietet Excel auch kein AfterInsert-Event...
Dann könnte man den eingefügten Inhalt bei Bedarf rückgängig machen oder in einer Schleife alle Objekte ermitteln und ggf. löschen.
Das Change-Event dagegen spricht nur auf Zelleninhalte an, reicht also auch nicht.

Außerdem stellt sich mir die Frage, ob ggf. überhaupt nur unformatierter Text eingefügt werden soll oder ob formatierter Text erlaubt ist...

Als Trigger könnte man  ggf. das Activate-Event nehmen, dann werden aber nur Inhalte von anderen Blättern gecheckt. Einfügen aus anderen Anwendungen funktioniert dagegen wieder.

Bliebe also nur eine Timerlösung. Die aber frißt zu viel Ressourcen um ein eher seltenes Phänomem abzufangen.

Hier mal eine andere Idee. Noch recht frisch und ohne Gewähr. Müsste also mal ausgiebig getestet werden.

So funktioniert es:
Die Sub KopiereClipboardAlsText checkt den Inhalt der Zwischenablage.
Enthaltener formatierter Text wird durch unformatierten Text innerhalb der Zwischenbalage ersetzt, bei anderen Inhalten wird die Zwischenablage geleert.
Auf eine mögliche temporäre MsgBox habe ich verzichtet, der User merkt schon, dass da nichts zu machen ist.

Damit auch Einfügungen aus anderen Anwendungen geblockt werden, reicht Worksheet/book-Activate nicht aus. Hier muss eine Eventhookinglösung her...

Hinweis: Bevor anderer Code läuft, sollte das Eventhooking für diese abgeschaltet werden...

Probiere es halt mal aus, vielleicht bringt es ja was.

Code:
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
 
' ### In ein normales Modul ###
Option Explicit

Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
        ByVal dwBytes As LongPtrAs LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32" ( _
        ByVal hMem As LongPtrAs LongPtr
Private Declare PtrSafe Function GlobalSize Lib "kernel32" ( _
        ByVal hMem As LongPtrAs LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" ( _
        ByVal hMem As LongPtrAs Long
Private Declare PtrSafe Function lstrcpy Lib "kernel32" ( _
        ByVal lpString1 As AnyByVal lpString2 As AnyAs LongPtr
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" ( _
        ByVal wFormat As LongAs Long
Private Declare PtrSafe Function SetClipboardData Lib "user32" ( _
        ByVal wFormat As LongByVal hMem As LongPtrAs LongPtr
Private Declare PtrSafe Function GetClipboardData Lib "user32" ( _
        ByVal wFormat As LongAs LongPtr
Private Declare PtrSafe Function OpenClipboard Lib "user32" ( _
        ByVal hwnd As LongPtrAs Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function SetWinEventHook Lib "user32" ( _
        ByVal eventMin As LongByVal eventMax As Long, _
        ByVal hmodWinEventProc As LongPtr, _
        ByVal lpfnWinEventProc As LongPtrByVal idProcess As Long, _
        ByVal idThread As LongByVal dwflags As LongAs LongPtr
Private Declare PtrSafe Function UnhookWinEvent Lib "user32" ( _
        ByVal hWinEventHook As LongPtrAs Long
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Dim mhEventHook As LongPtr                                   ' Handle des Eventhooking

Public Sub StartZACheck()
  Call KopiereClipboardAlsText
  If mhEventHook = 0 Then
     mhEventHook = SetWinEventHook(330AddressOf EventProc, 000)
  End If
End Sub

Public Sub StopZACheck()                                     ' Beendet den Eventhook
  If mhEventHook <> 0 Then UnhookWinEvent mhEventHook: mhEventHook = 0
End Sub

Private Function EventProc(ByVal hWinEventHook As LongPtrByVal WinEvent As Long, _
  ByVal hwnd As LongPtrByVal idObject As Long, _
  ByVal idChild As LongByVal dwEventThread As Long, _
  ByVal dwmsEventTime As LongAs Long
  If hwnd = Application.hwnd Then Call KopiereClipboardAlsText
End Function

Private Sub KopiereClipboardAlsText()
' Kopiert Zwischenablageinhalt als Text oder löscht Grafiken
  Dim hMem As LongPtr, lpGMem As LongPtr, sCliptext As String, i As Long

  Const CF_TEXT   As Long = 1
  Const CF_BITMAP As Long = 2

  If IsClipboardFormatAvailable(CF_BITMAP) > 0 Then          ' Daten vorhanden?
     For i = 1 To 2
         OpenClipboard 0&                                    ' Zwischenablage öffnen
         If i = 1 Then
            hMem = GetClipboardData(CF_TEXT)                 ' TEXT aus Zwischenablage
            If hMem = 0 Then                                 ' Kein Text
               Application.StatusBar = "Objekte einfügen ist nicht erlaubt!!!"
               Call EmptyClipboard                           ' Zwischenablage leeren
               Call CloseClipboardExit Sub                 ' Zwischenablage schließen
            End If
         Else
            hMem = GlobalAlloc(&H42Len(sCliptext))         ' Speicher reservieren
         End If
         If hMem > 0 Then
            lpGMem = GlobalLock(hMem)                        ' Speicher blockieren
            If i = 1 Then
               sCliptext = Space(CLng(GlobalSize(hMem)))     ' Platz reservieren
               lstrcpy sCliptext, lpGMem                     ' Daten kopieren
               GlobalUnlock hMem                             ' Speicher freigeben
               EmptyClipboard                                ' Zwischenablage leeren
            Else
               lpGMem = lstrcpy(lpGMem, sCliptext)           ' Daten kopieren
               If GlobalUnlock(hMem) = 0 Then _
               SetClipboardData CF_TEXT, hMem                ' TEXT in Zwischenablage
            End If
         End If
         CloseClipboard                                      ' Zwischenablage schließen
     Next i
  End If
End Sub



' ### In das/die gewünschte(n) Tabellenblattmodul(e) ###
Private Sub Worksheet_Activate()
  Call StartZACheck
End Sub

Private Sub Worksheet_Deactivate()
  Call StopZACheck
End Sub


' ### In das DieseArbeitsmappemodul ###
Private Sub Workbook_Open()
  If ActiveSheet.Name = "Tabelle1Then
     Call StartZACheck
  End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Call StopZACheck
End Sub
_________
viele Grüße
Karl-Heinz

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
15.12.2024 09:45:49 Sonja
NotSolved
15.12.2024 10:58:01 ralf_b
NotSolved
Rot Einfügen von Grafiken verhinertn
15.12.2024 19:06:39 volti
NotSolved
16.12.2024 19:00:07 xlKing
NotSolved
01.01.2025 22:08:27 Gast7777
NotSolved