Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1168to1172
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
Beim Mailversand alle Makros löschen
Vati
Hallo zusammen,
dies ist mein erster Beitrag hier und ich hoffe, Ihr könnt mir helfen.
Als erstes: Ich bin absoluter Leihe und muss mir alles zusammen "klauen", entziffern und abändern...
Also nicht lachen, wenn der Code etwas lächerlich erscheint :)
Hier mein Vorhaben:
Ich habe eine ExcelTabelle, mit:
sheet1: mit diversen Formularschaltflächen, Comandbuttons und Optionsfeldern.
sheet2: mit Datenlisten
Im Ersten sheet befühle ich bestimmte Zellen, klicke die Optionsfelder an usw. und lasse zusätzlich über einen Button einen Screenshot vom Clipboard, an einer bestimmten Stelle einfügen einfügen.
Soweit ist alles ok.
Num lasse ich sheet1 per Comandbutton als Mail versenden...
Der Betreff, die Inhalte des Body und die Bezeichnung des Anhang beim zwischenspeichern, entnehme ich festen Vorgaben, kombiniert mit Zellenangaben.
Soweit alles ok...
Nun zu meinem Problem:
Ich muss irgendwie ALLE Makros vor dem e-Mailversand (mit Outlook) entfernen, da die EMail auch an externe Kunden geht. Ich bekomme das einfach nicht hin... und verzweifle bald.
ich freue mich über jeden Rat.
Vielen Dank & schönen Gruß
Hier mal mein Code, der bis dahin auch wunderbar funktioniert:

Sub Mail_senden()
Application.ScreenUpdating = False
Dim olAPP As Object
Dim olMail As Object
Set olAPP = CreateObject("Outlook.Application")
Set olMail = olAPP.CreateItem(0)
ActiveSheet.Copy
ActiveWorkbook.SaveAs "C:\XXX\XXX\XXX\XXX\" & Sheets(1).Range("c1") & " " & Range("c6") & " " &  _
Range("c14") & " " & Range("e8").Value & ".xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
With olMail
.to = "xxxxxxxxxxxxxxxxxx"
.cc = "XXX@XXX.de; XXX@XXX.de"
.Subject = Range("c6").Value & ":"
.Body = "Hallo" & " " & Range("c6") & "," & Chr(13) & _
"" & Chr(13) & _
"anbei übersenden wir Ihnen zur Kenntnis und Bearbeitung, den nachstehenden Vorgang." & Chr(13)  _
& _
"" & Chr(13) & _
"Für Rückfragen stehen wir selbstverständlich gern zur Verfügung." & Chr(13) & _
"" & Chr(13) & _
"Mit freundlichen Grüßen" & Chr(13) & _
Range("b2") & Chr(13) & _
.Attachments.Add ActiveWorkbook.FullName
.Display
End With
ActiveWorkbook.Close
Dim backupDir
backupDir = "C:\XXX\XXX\XXX\XXX\"
On Error Resume Next
   Shell "C:\XXX\XXX\XXX\XXX\*.*"
Kill (backupDir & "\*.*")
Set olAPP = Nothing
Set olMail = Nothing
Application.ScreenUpdating = True
End Sub

 
ich würde so vor gehen.
30.07.2010 19:50:48
Tino
Hallo,
ich würde alle Makros in den Tabellen auslagern (wenn vorhanden)
Für eine Kopie würde ich alle Tabellen in eine neue Datei kopieren.
Eventuell noch alle Button usw… löschen die nicht benötigt werden.
Diese neue Datei sollte dann VBA sein und zum versandt fedrig sein
Ich kann Dir aber nur dabei helfen wenn Du eine Beispieldatei hast,
mit der ich arbeiten kann.
Persönliche Daten kannst Du ja verfremden.
Gruß Tino
AW: ich würde so vor gehen.
30.07.2010 20:58:30
Vati
Hallo Tino,
Danke, für die prompte Antwort. Genau diesen Weg probiere ich seit 2 Tagen... ohne Erfolg. Ich hab mal auf die schnelle alle Daten entfernt, also wunder dich nicht, wenn nicht alle Listen gehen.
Auch die SpeicherPfade musst du wieder ersetzen usw.
Danke und Viele Grüße
der Vati
https://www.herber.de/bbs/user/70823.xls
Anzeige
ok. hier mal zum testen...
30.07.2010 22:32:20
Tino
Hallo,
ok habe es mal soweit umgebaut.
Was bei mir nicht funktioniert ist Dein Bild wo Du einfügst,
geht aber weder in der Original noch in der umgebauten Datei?!
Im Makro Mail_senden werden die Shapes gelöscht außer Bilder,
müsstest Du eventuell anpassen, was gelöscht und was nicht gelöscht werden darf.
Deine anderen Makros für die Button usw. spielen sich im Klassenmodul Klasse1 ab.
Da waren welche ohne Code, diese habe ich an der entsprechenden stellen ohne Code gelassen.
https://www.herber.de/bbs/user/70827.xls
Gruß Tino
Anzeige
AW: ok. hier mal zum testen...
30.07.2010 22:48:32
Vati
Vielen lieben Dank,
ich teste morgen dann @work und melde mich noch einmal.
Bin schon gespannt :)
Bis dahin & Viele Grüße
der Vati
AW: CommandButton gehen nicht
31.07.2010 11:07:30
Vati
Hallo Tino,
Ich habe die Speicherpfade wieder angepasst. Die OptionsButtons gehen auch gut.
Leider gehen die CommandButton nicht mehr. Wenn ich dann auf Code anzeigen gehe, dass schreibt es die
Private Sub CommandButton2_Click()
End Sub
wieder automatisch in Tabelle1(Maske) rein und ich müsste dort wieder über "Call" das Makro aufrufen...
Wie bekomme ich es hin, dass er die Befehle aus dem KlassenModul nimmt, wo die ja eh schon drin stehen?
Ich blicke grad nicht mehr richtig durch :)
V.G. der Vati
Anzeige
AW: CommandButton gehen nicht
31.07.2010 11:34:33
Vati
Achso...
wenn ich die Makros manuell starte funktioniert alles prima! :)
Er speichert den sheet kurz, packt ihn in die Mail und löscht im Anschluss dass gespeicherte Dokument wieder. Jetzt muss ich es nur noch über die Buttons steuern können...
AW: CommandButton gehen nicht
31.07.2010 11:40:13
Tino
Hallo,
der Code wird nur neu erstellt wenn der Entwurfsmodus aktiv ist.
Diesen müsstest Du dann wieder löschen.
Wenn der Code mal läuft wie Du es haben willst,
brauchst Du ja auch keine Entwicklungsumgebung mehr.
Im Code habe ich den CommandButton4 vergessen zu initialisieren.
Ersetze die Private Sub Workbook_Open() in DieseArbeitsmappe durch diesen Code.
Starten diesen Code von Hand oder öffnen die Datei noch mal neu.
Wenn Du Änderungen im VBA machst, musst Du diese immer neu initialisieren,
also den Code Workbook_Open() ausführen.
Private Sub Workbook_Open()
Dim i As Integer
ReDim ControlTab1(7)
With Tabelle1
Set ControlTab1(0).objCommand = .CommandButton1
Set ControlTab1(1).objCommand = .CommandButton2
Set ControlTab1(2).objCommand = .CommandButton3
Set ControlTab1(3).objCommand = .CommandButton4
Set ControlTab1(4).objOption = .OptionButton1
Set ControlTab1(5).objOption = .OptionButton2
Set ControlTab1(6).objOption = .OptionButton3
Set ControlTab1(7).objOption = .OptionButton4
End With
End Sub
Habe hier mal zu testzwecken in der Klasse1 eine Msgbox eingebaut,
damit kannst Du erkennen dass die Controls in der Klasse entsprechend ansprechen.
Die anderen brauchen wir nicht umbauen, weil diese ja den Code in einem normalen Modul haben und beim kopieren der Tabelle nicht mit kommen.
https://www.herber.de/bbs/user/70828.xls
Gruß Tino
Anzeige
AW: CommandButton gehen nicht
31.07.2010 12:07:55
Vati
Tino,
du bist der größte !!! :)
Es funktioniert super !
Ich passe jetzt nochmal alles an und melde mich nach der "Endkontrolle" noch einmal.
Vielen Dank, für deine Hilfe!
schönen Gruß
Sascha
AW: OptionButtons aus KlassenModul gehen nicht
02.08.2010 09:14:20
Vati
Hallo Tino,
ich bin jetzt soweit fertig und habe es auch hinbekommen, dass ich beim Versand, nach dem löschen der Makros, trotzdem noch die „Werte“ der Optionsfelder und der Commandbuttons in der Tabelle bleiben.
Ich muss ja die geklickten Werte auch irgendwie an den Kunden übermitteln. Also lass ich die Werte in bestimmte Zellen schreiben.
Ein Problem habe ich noch. Im KlassenModul Klasse1, sollen die OptionButtons 3 und 4 angesprochen werden. Irgendwie reagieren die aber nicht auf die hinterlegten Befehle.
Kannst du mir da bitte noch einmal helfen.
v.G. der Vati
Private Sub objOption_Click()
Select Case LCase(objOption.Name)
Case "OptionButton1"
Case "OptionButton2"
Case "OptionButton3"
ActiveSheet.Shapes("ComboBox2").OLEFormat.Object.Visible = False
Case "OptionButton4"
ActiveSheet.Shapes("ComboBox2").OLEFormat.Object.Visible = True
End Select
End Sub

Anzeige
AW: OptionButtons aus KlassenModul gehen nicht
02.08.2010 09:49:28
Tino
Hallo,
schreibe alles klein, dann müsste es funktionieren.
Private Sub objOption_Click()
Select Case LCase(objOption.Name)
Case "optionbutton1"
Case "optionbutton2"
Case "optionbutton3"
ActiveSheet.Shapes("ComboBox2").OLEFormat.Object.Visible = False
Case "optionbutton4"
ActiveSheet.Shapes("ComboBox2").OLEFormat.Object.Visible = True
End Select
End Sub
Gruß Tino
AW: OptionButtons aus KlassenModul gehen nicht
02.08.2010 10:11:47
Vati
Hallo Tino,
auch mit Kleinschreibung der "optionbutton", funktioniert es nicht. :(
Deswegen hatte ich es mal mit der Originalschreibweise "OptionButton" probiert.
V.G. der Vati
Anzeige
AW: OptionButtons aus KlassenModul gehen nicht
02.08.2010 10:44:54
Tino
Hallo,
hast Du den Code Workbook_Open nach der Änderung ausgeführt oder die Datei nochmal neu geöffnet?
In der letzten Beispieldatei ist noch die Msgbox eingebaut, da funktioniert es ja auch!
Gruß Tino
AW: OptionButtons aus KlassenModul gehen nicht
02.08.2010 11:51:30
Vati
Hall oTino,
ich speichere / schließe und öffne nach jeder Änderung neu.
diese MSG-Boxen in der letzten Beispieldatei lagen doch aber nur auf den CommandButtons - oder ?
Die Optionbuttons waren glaub ich 2 mit - und 2 ohne Code... wurden aber alle beim auswählen ignoriert.
Sonst läuft ja alles perfekt.
Viele Grüße
der Vati
AW: OptionButtons aus KlassenModul gehen nicht
03.08.2010 09:18:14
Vati
Hi Tino,
ich habe es gestern auch noch selbst hinbekommen :)
Nun habe ich aber schon die nächste Frage.
Wenn ich das Screen_einfügen Makro starte, dann kann ich im Anschluss keine Buttons mehr benutzen. Ich müsste quasi das
Private Sub Workbook_Open()
in der geöffneten Tabelle ausführen... denke ich... Ist das überhaupt möglich?
Ich musste es ja dann qusi über eines der Makros immer mit aufrufen.
Danke und Viele Grüße
der Vati
AW: OptionButtons aus KlassenModul gehen nicht
03.08.2010 09:41:52
Vati
Hi Tino,
hier noch der code, denn ich kann von hier aus nicht up – oder downloaden.
Ich möchte quasi per Button einen screeneshot aus dem Clipboard einfügen, aber nur, wenn es auch eine „Bilddatei“ ist.
Ansonsten soll eine MSG Box - Fehlermeldung kommen mit Hinweis, dass erst ein Screenshot gemacht werden muss und der Errorhandler für (glaube ich) 1004 & 1015 ausgeführt werden, damit nicht irgendwelche texte eingefügt werden.
Ich weiß, das sind sehr spezielle Wünsche, aber ich bin jetzt mit deiner Hilfe schon so weit gekommen, dass es schade wäre, wenn es daran scheitert.
Danke & viele Grüße
der Vati
Sub Screen_Einfügen()
Application.ScreenUpdating = False
On Error GoTo Errorhandler
Rows("15:23").Select
Selection.RowHeight = 68
Range("A15").Select
ActiveSheet.Paste
On Error GoTo Errorhandler
1004
End
Errorhandler:
If Err = 1004 Then
MsgBox ("Bitte erst Screenshot vom ISL mit ALT + Druck machen !")
Exit Sub
Resume Next
Else
Selection.ShapeRange.Height = 800
Selection.ShapeRange.Width = 1032
Selection.ShapeRange.Left = 10
Selection.ShapeRange.Top = 256
Selection.Name = "Bild1"
Application.ScreenUpdating = True
End If
If Err = 1015 Then
Exit Sub
Resume Next
Else
Selection.ShapeRange.Height = 800
Selection.ShapeRange.Width = 1032
Selection.ShapeRange.Left = 10
Selection.ShapeRange.Top = 256
Selection.Name = "Bild1"
End If
Application.ScreenUpdating = True
End Sub

Anzeige
Bild aus Clipboard, ich würde mal so versuchen
03.08.2010 11:21:14
Tino
Hallo,
Lege diesen in ein Normales Modul.
Aufrufen kannst Du den Code mit
Call Screen_Einfeugen_
Option Explicit
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" ( _
    ByRef PicDesc As PIC_DESC, _
    ByRef RefIID As GUID, _
    ByVal fPictureOwnsHandle As Long, _
    ByRef IPic As IPictureDisp) As Long
Private Declare Function CopyImage Lib "user32.dll" ( _
    ByVal handle As Long, _
    ByVal un1 As Long, _
    ByVal n1 As Long, _
    ByVal n2 As Long, _
    ByVal un2 As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" ( _
    ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32.dll" ( _
    ByVal hWnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32.dll" ( _
    ByVal wFormat As Integer) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare 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 PIC_DESC
    lngSize As Long
    lngType As Long
    lnghPic As Long
    lnghPal As Long
End Type

Private Const PICTYPE_BITMAP = 1
Private Const CF_BITMAP = 2
Private Const IMAGE_BITMAP = 0
Private Const LR_COPYRETURNORG = &H4
Private Const GC_CLASSNAMEMSEXCEL = "XLMAIN"

Private Function Paste_Picture() As IPictureDisp
Dim lngReturn As Long, lngCopy As Long, lngPointer As Long
Dim i As Long
    If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then
        lngReturn = OpenClipboard(FindWindow(GC_CLASSNAMEMSEXCEL, Application.Caption))
        If lngReturn > 0 Then
            lngPointer = GetClipboardData(CF_BITMAP)
            lngCopy = CopyImage(lngPointer, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
            Call CloseClipboard
            If lngPointer <> 0 Then Set Paste_Picture = Create_Picture(lngCopy, 0&, CF_BITMAP)
        End If
    End If
    
End Function

Private Function Create_Picture( _
        ByVal lnghPic As Long, _
        ByVal lnghPal As Long, _
        ByVal lngPicType As Long) As IPictureDisp
    
Dim udtPicInfo As PIC_DESC, udtID_IDispatch As GUID
Dim objPicture As IPictureDisp
    
    With udtID_IDispatch
        .Data1 = &H7BF80980
        .Data2 = &HBF32
        .Data3 = &H101A
        .Data4(0) = &H8B
        .Data4(1) = &HBB
        .Data4(2) = &H0
        .Data4(3) = &HAA
        .Data4(4) = &H0
        .Data4(5) = &H30
        .Data4(6) = &HC
        .Data4(7) = &HAB
    End With
    
    With udtPicInfo
        .lngSize = Len(udtPicInfo)
        .lngType = PICTYPE_BITMAP
        .lnghPic = lnghPic
        .lnghPal = lnghPal
    End With
    
    Call OleCreatePictureIndirect(udtPicInfo, udtID_IDispatch, 0&, objPicture)
    
    Set Create_Picture = objPicture
    
End Function

'Prozedur zum Formatieren ******************************* 
Private Sub Formatiere_Picture(ByVal objPicture As Object)

With objPicture
    .ShapeRange.Height = 800
    .ShapeRange.Width = 1032
    .ShapeRange.Left = 10
    .ShapeRange.Top = 256
    .Name = "Bild1"
End With

End Sub

'Picture aus Zwischenablage in Tabelle ****************** 

Public Sub Screen_Einfeugen_()
Dim objPicture As IPictureDisp
Dim objShabe As Object


Call EmptyClipboard

Set objPicture = Paste_Picture

If Not objPicture Is Nothing Then
    ActiveSheet.Paste
    If TypeName(Selection) <> "Picture" Then
         Set objShabe = Nothing
    Else
         Set objShabe = Selection
    End If
End If

If Not objShabe Is Nothing Then
    Formatiere_Picture objShabe
Else
    MsgBox ("Bitte erst Screenshot vom ISL mit ALT + Druck machen !")
End If
    
End Sub
Gruß Tino
Anzeige
AW: Bild aus Clipboard, ich würde mal so versuchen
03.08.2010 11:53:43
Vati
Hallo Tino,
ich finde keine Worte... klappt alles super :)
DANKESCHÖN!!!!
Das hätte ich niemals hinbekommen... aber ich lerne hier jeden Tag dazu und muss mich bemühen, dass ich nicht den ganzen Tag damit verbringe ;)
Vielen Dank
der Vati

161 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige