Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
972to976
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
972to976
972to976
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Senden und Speichern Tabellenblatt

Senden und Speichern Tabellenblatt
05.05.2008 13:58:37
Mazilu
Hallo zusammen,
habe ein für mich unlösbares Problem. Ich möchte per Makro eine Datei speichern und danach per E-Mail senden. Dabei soll jedoch nur das Tabellenblatt "Formular" ohne die Makros versendet werden um Speicherplatz zu sparen.
Habe dafür folgendes Makro:
Leider versendet es die Ausgangsdatei mit 3 MB und das ist zuviel das Tabellenblatt hat nur 300 KB

Sub speichern_senden()
ActiveSheet.Unprotect
'Datei speichern
Dim varPfad As Variant
If Workbooks.Count = 0 Then Exit Sub
On Error Resume Next
Sheets("formular").Range("A6").Select
varPfad = Application.GetSaveAsFilename(Date & "_" & Hour(Time) & "." & Minute(Time) & "." &  _
Second(Time) & "_" & [AJ6] & ".XLS")
If varPfad = False Then
Exit Sub
End If
If Dir(varPfad)  "" Then
MsgBox "Die Datei " & varPfad & " existiert bereits." & vbNewLine & vbNewLine & "Bitte  _
wiederholen Sie den Vorgang und vergeben Sie einen anderen Dateinamen oder wählen Sie einen  _
anderen Ordner.", vbOKOnly + vbInformation, "Datei existiert"
Exit Sub
End If
If optBlattSpeichern.Value = True Then
ActiveSheet.Copy
If chkMakrosWeg.Value = True Then Alle_Makros_löschen
ActiveWorkbook.SaveAs varPfad
Else
ActiveWorkbook.SaveAs varPfad
Workbooks.Open varPfad
If chkMakrosWeg.Value = True Then
Alle_Makros_löschen
End If
ActiveWorkbook.Save
End If
If MsgBox("Reisekostenabrechnung an Finance zur Archivierung schicken?" & vbNewLine & "Bitte  _
beachte: die Abrechnung kann nur bearbeitet werden, wenn" & vbNewLine & vbNewLine & "1. Auf  _
jedem Belege, die Belegnummer aus der Belegerfassung steht" & vbNewLine & "2. Bewirtungsbelege alle erforderlichen Angaben enthalten (siehe FAQ´s)" & vbNewLine & "3. Alle Belege auf Papier aufgeklebt wurden" & vbNewLine & vbNewLine & "VIELEN DANK!" & vbNewLine & vbNewLine & "Bitte diese Anforderungen mit JA bestätigen!", vbYesNo) = vbYes Then
'Datei per E-Mail versenden
Dim outl, Mail As Object
AktDatei = ActiveWorkbook.Name
Set outl = CreateObject("Outlook.Application")
Set Mail = outl.CreateItem(0)
Mail.Subject = AktDatei
Mail.To = "Christian.Mazilu@ciao-group.com"
'Wichtigkeit Hoch (1 = normal, 0 = niedrig)
Mail.Importance = 0
'Standardtext
Mail.Body = "Hallo Kollegen!" & vbCrLf & vbCrLf & _
"Neue Reisekostenabrechnung! Bitte archivieren." & vbCrLf & vbCrLf & _
"Vielen Dank!" & vbCrLf & vbCrLf & _
"xxx" & vbCrLf & vbCrLf
'oder: die aktive Exceldatei als Anhang mitsenden...
Mail.Attachments.Add ThisWorkbook.FullName
'Mail anzeigen
Mail.Display
'Ein sofortiger Mail-Versand geht in Firmen wegen Sicherheitseinstellungen oft nicht:
'Mail.Send
'aber es gibt eine Lösung mit SendKeys per Windows Scripting Host (Verweis ins VB-Projekt  _
einfügen!):
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.AppActivate Mail
'Sendet ein "Alt-S", Outlook sendet Mail sofort ohne Sicherheitsabfrage:
WshShell.SendKeys ("%s")
Set Mail = Nothing
Set outl = Nothing
Set WshShell = Nothing
Else
Exit Sub
End If
'Datei drucken
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Sub Alle_Makros_löschen() 'Für das Versenden des Übersichtsblattes
ActiveSheet.Unprotect
Dim objKompo As Object
On Error Resume Next
With ActiveWorkbook.VBProject
For Each objKompo In .VBComponents
Select Case objKompo.Type
Case 1, 2, 3
.VBComponents.Remove .VBComponents(objKompo.Name)
Case 100
With objKompo.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
Next
End With
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub


Vielen DAnk!
Gruß
Christian

34
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Senden und Speichern Tabellenblatt
05.05.2008 14:27:25
mumpel
Hallo!
Du machst das viel zu kompliziert. Damit geht es besser.
Sub AktiveTabelleAlsAnhang()
Application.DisplayAlerts = False
Dim aws As String
Dim olapp As Object
ActiveWorkbook.ActiveSheet.Copy
ActiveWorkbook.Save
aws = ActiveWorkbook.FullName
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
    .to = "mail@server.de" 'Empfänger 
   '.cc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Kopie an 
   '.bcc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Blindkopie an 
  '.ReadReceiptRequested = True ' optional Lesbestätigung anfordern 
   .htmlbody = "Text" 'Optional Body 
   .Subject = "Text" 'Betreff optional 
   .ReadReceiptRequested = True 'optional Lesebestätigung anfordern 
   .Attachments.Add aws
   .display
   'SendKeys "%s", True ' optional Mail sofort senden 
End With
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub


Bitte achte künftig darauf, dass Du zu lange Codezeilen umbrichst. Damit der beitrag nicht wieder unendlich breit wird. Da hat sonst keiner Lust, das zu lesen.
Gruß, Rene

Anzeige
AW: Nachtrag:
05.05.2008 14:40:00
Daniel
Hmmm, ich habe gerade ein ähnliches Problem, den Code in der Kopie löschen die Anweisungen oben nicht und mitkopiert wird er auch, habe ich gerade probiert...

so?
05.05.2008 14:53:00
mumpel
Dann versuchen wir es so:
Sub AktiveTabelleAlsAnhang()
Application.DisplayAlerts = False
Dim aws As String
Dim olapp As Object
ActiveWorkbook.ActiveSheet.Copy
Call Alles_löschen
ActiveWorkbook.Save
aws = ActiveWorkbook.FullName
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
    .to = "mail@server.de" 'Empfänger 
   '.cc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Kopie an 
   '.bcc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Blindkopie an 
  '.ReadReceiptRequested = True ' optional Lesbestätigung anfordern 
   .htmlbody = "Text" 'Optional Body 
   .Subject = "Text" 'Betreff optional 
   .ReadReceiptRequested = True 'optional Lesebestätigung anfordern 
   .Attachments.Add aws
   .display
   'SendKeys "%s", True ' optional Mail sofort senden 
End With
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub

Sub Alles_löschen()
    Call Lösche_Module
    Call Lösche_Userformen
    Call Lösche_Ereignisprozeduren
End Sub

Sub Lösche_Module()
Rem Löscht Module: 
    For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
        If ActiveWorkbook.VBProject.vbComponents(n).Type = 1 Then
            ActiveWorkbook.VBProject.vbComponents(n).Collection.Remove ActiveWorkbook.VBProject.vbComponents(n) 
        End If
    Next
End Sub

Sub Lösche_Userformen()
Rem Löscht Userforms: 
    For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
        If ActiveWorkbook.VBProject.vbComponents(n).Type = 3 Then
            ActiveWorkbook.VBProject.vbComponents(n).Collection.Remove ActiveWorkbook.VBProject.vbComponents(n) 
        End If
    Next
End Sub

Sub Lösche_Ereignisprozeduren()
Rem Löscht Ereignisprozeduren: 
    For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
        For i = 1 To ActiveWorkbook.VBProject.vbComponents(n).CodeModule.CountOfLines
            If ActiveWorkbook.VBProject.vbComponents(n).Type <> 1 And ActiveWorkbook.VBProject.vbComponents(n).Type <> 3 Then _
                ActiveWorkbook.VBProject.vbComponents(n).CodeModule.DeleteLines 1
        Next
    Next
End Sub


Anzeige
AW: so?
05.05.2008 15:09:00
Mazilu
Jetzt löscht er alles, aber versendet nicht! Das von vorhin war schon super er müßte halt nur den Dateinamen den ich vorher dem originaldokument vergeben habe übernehmen!

AW: so?
05.05.2008 15:13:00
mumpel
Bei mir funktioniert es.

Nachtrag:
05.05.2008 15:25:00
mumpel
Den Namen des Originals kann er nicht übernehmen, da immer nicht mehrere Arbeitsmappen mit dem selben Namen geöffnet sein können. Du könntest höchstens eine Zahl dranhängen, z.B.

ActiveWorkbook.ActiveSheet.Copy
ActiveWorkbook.SaveAs Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 4) & "_Kopie" & ".xls"


Anzeige
AW: Senden und Speichern Tabellenblatt
05.05.2008 14:52:00
Mazilu
Hi,
vielen Dank für deinen Code. Jetzt müßte das File nur noch diesen Dateinamen bekommen und die ursprungsdatei unter dem selben Namen im Ordner der Per Hand ausgewählt werden kann abgespeichert werden und dann wärs perfect....
Sheets("formular").Range("A6").Select
varPfad = Application.GetSaveAsFilename(Date & "_" & Hour(Time) & "." & Minute(Time) & "." & Second(Time) & "_" & [AJ6] & ".XLS")

AW: Senden und Speichern Tabellenblatt
05.05.2008 15:14:00
mumpel
Versuchen wir es mal so:
Sub AktiveTabelleAlsAnhang()
Application.DisplayAlerts = False
Dim aws As String
Dim olapp As Object
ActiveWorkbook.ActiveSheet.Copy
Call Alles_löschen
Dim varPfad As Variant
If Workbooks.Count = 0 Then Exit Sub
On Error Resume Next
Sheets("formular").Range("A6").Select
varPfad = Application.GetSaveAsFilename(Date & "_" & Hour(Time) & "." & Minute(Time) & "." & _
Second(Time) & "_" & [AJ6] & ".XLS")
    If varPfad = False Then
        Exit Sub
    End If
    If Dir(varPfad) <> "" Then
    MsgBox "Die Datei " & varPfad & " existiert bereits." & vbNewLine & vbNewLine & "Bitte " & _
    "wiederholen Sie den Vorgang und vergeben Sie einen anderen Dateinamen oder wählen Sie einen" & _
    "anderen Ordner.", vbOKOnly + vbInformation, "Datei existiert"
        Exit Sub
    End If
    If optBlattSpeichern.Value = True Then
        ActiveSheet.Copy
        If chkMakrosWeg.Value = True Then 'Alle_Makros_löschen 
        ActiveWorkbook.SaveAs varPfad
    Else
        ActiveWorkbook.SaveAs varPfad
        Workbooks.Open varPfad
        If chkMakrosWeg.Value = True Then
            'Alle_Makros_löschen 
        End If
        ActiveWorkbook.Save
    End If
 End If
If MsgBox("Reisekostenabrechnung an Finance zur Archivierung schicken?" & vbNewLine & "Bitte " & _
"beachte: die Abrechnung kann nur bearbeitet werden, wenn" & vbNewLine & vbNewLine & "1. Auf " & _
"jedem Belege, die Belegnummer aus der Belegerfassung steht" & vbNewLine & _
"2. Bewirtungsbelege alle erforderlichen Angaben enthalten (siehe FAQ´s)" & vbNewLine & "3. " & _
"Alle Belege auf Papier aufgeklebt wurden" & vbNewLine & vbNewLine & "VIELEN DANK!" & vbNewLine & _
vbNewLine & "Bitte diese Anforderungen mit JA bestätigen!", vbYesNo) = vbYes Then
Rem ActiveWorkbook.Save 
aws = ActiveWorkbook.FullName
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
       .to = "mail@server.de" 'Empfänger 
      '.cc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Kopie an 
      '.bcc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Blindkopie an 
      '.ReadReceiptRequested = True ' optional Lesbestätigung anfordern 
       .htmlbody = "Text" 'Optional Body 
       .Subject = "Text" 'Betreff optional 
       .ReadReceiptRequested = True 'optional Lesebestätigung anfordern 
       .Attachments.Add aws
       .display
       'SendKeys "%s", True ' optional Mail sofort senden 
    End With
  End If
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub

Sub Alles_löschen()
    Call Lösche_Module
    Call Lösche_Userformen
    Call Lösche_Ereignisprozeduren
End Sub

Sub Lösche_Module()
Rem Löscht Module: 
    For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
        If ActiveWorkbook.VBProject.vbComponents(n).Type = 1 Then
            ActiveWorkbook.VBProject.vbComponents(n).Collection.Remove ActiveWorkbook.VBProject.vbComponents(n) 
        End If
    Next
End Sub

Sub Lösche_Userformen()
Rem Löscht Userforms: 
    For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
        If ActiveWorkbook.VBProject.vbComponents(n).Type = 3 Then
            ActiveWorkbook.VBProject.vbComponents(n).Collection.Remove ActiveWorkbook.VBProject.vbComponents(n) 
        End If
    Next
End Sub

Sub Lösche_Ereignisprozeduren()
Rem Löscht Ereignisprozeduren: 
    For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
        For i = 1 To ActiveWorkbook.VBProject.vbComponents(n).CodeModule.CountOfLines
            If ActiveWorkbook.VBProject.vbComponents(n).Type <> 1 And ActiveWorkbook.VBProject.vbComponents(n).Type <> 3 Then _
                ActiveWorkbook.VBProject.vbComponents(n).CodeModule.DeleteLines 1
        Next
    Next
End Sub


Anzeige
AW: Senden und Speichern Tabellenblatt
05.05.2008 15:29:00
Mazilu
Und bei mir erscheint die Fehlermeldung:
Laufzeitfehler 1004

AW: Senden und Speichern Tabellenblatt
05.05.2008 15:52:48
mumpel
In welcher Zeile? Ein paar Informationen mehr könnten es schon sein.

AW: Senden und Speichern Tabellenblatt
05.05.2008 16:05:09
Mazilu
Hi,
ich habs hinbekommen, er speichert und versendet mit dem richtigen Dateiname komischerweise öffnet er aber zusätzlich nochmal die Datei und bennent sie als mappe! Kann man das irgendwie abschalten?
Gruß
Christian

Sub AktiveTabelleAlsAnhang()
Application.DisplayAlerts = False
Dim aws As String
Dim olapp As Object
ActiveWorkbook.ActiveSheet.Copy
Dim varPfad As Variant
If Workbooks.Count = 0 Then Exit Sub
On Error Resume Next
Sheets("formular").Range("A6").Select
varPfad = Application.GetSaveAsFilename(Date & "_" & Hour(Time) & "." & Minute(Time) & "." & _
Second(Time) & "_" & [AJ6] & ".XLS")
If varPfad = False Then
Exit Sub
End If
If Dir(varPfad)  "" Then
MsgBox "Die Datei " & varPfad & " existiert bereits." & vbNewLine & vbNewLine & "Bitte " &  _
_
"wiederholen Sie den Vorgang und vergeben Sie einen anderen Dateinamen oder wählen Sie  _
einen" & _
"anderen Ordner.", vbOKOnly + vbInformation, "Datei existiert"
Exit Sub
End If
If optBlattSpeichern.Value = True Then
ActiveSheet.Copy
If chkMakrosWeg.Value = True Then 'Alle_Makros_löschen
ActiveWorkbook.SaveAs varPfad
Else
ActiveWorkbook.SaveAs varPfad
Workbooks.Open varPfad
If chkMakrosWeg.Value = True Then
'Alle_Makros_löschen
End If
ActiveWorkbook.Save
End If
End If
If MsgBox("Reisekostenabrechnung an Finance zur Archivierung schicken?" & vbNewLine & "Bitte " & _
_
"beachte: die Abrechnung kann nur bearbeitet werden, wenn" & vbNewLine & vbNewLine & "1. Auf " & _
_
"jedem Belege, die Belegnummer aus der Belegerfassung steht" & vbNewLine & _
"2. Bewirtungsbelege alle erforderlichen Angaben enthalten (siehe FAQ´s)" & vbNewLine & "3. " &  _
_
"Alle Belege auf Papier aufgeklebt wurden" & vbNewLine & vbNewLine & "VIELEN DANK!" & vbNewLine  _
& _
vbNewLine & "Bitte diese Anforderungen mit JA bestätigen!", vbYesNo) = vbYes Then
Rem ActiveWorkbook.Save
aws = ActiveWorkbook.FullName
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
.To = "Christian.Mazilu@ciao-group.com" 'Empfänger
'.cc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Kopie an
'.bcc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Blindkopie an
'.ReadReceiptRequested = True ' optional Lesbestätigung anfordern
.htmlbody = "Bitte archivieren" 'Optional Body
.Subject = "Travel Expenses" 'Betreff optional
.ReadReceiptRequested = True 'optional Lesebestätigung anfordern
.Attachments.Add aws
.display
'SendKeys "%s", True ' optional Mail sofort senden
End With
End If
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub


Anzeige
AW: Senden und Speichern Tabellenblatt
05.05.2008 16:09:00
mumpel
Ich vermute mal, das liegt an diesem Block

If optBlattSpeichern.Value = True Then
        ActiveSheet.Copy
        If chkMakrosWeg.Value = True Then 'Alle_Makros_löschen 
        ActiveWorkbook.SaveAs varPfad
    Else
        ActiveWorkbook.SaveAs varPfad
        Workbooks.Open varPfad
        If chkMakrosWeg.Value = True Then
            'Alle_Makros_löschen 
        End If
        ActiveWorkbook.Save
    End If


Benötigst Du das alles wirklich?

Anzeige
AW: Senden und Speichern Tabellenblatt
05.05.2008 16:16:00
Mazilu
Ja leider! Ist es anders wie möglich oder kann ich den block löschen?

AW: Senden und Speichern Tabellenblatt
05.05.2008 16:27:33
mumpel
Dann erkläre mal, wann was passieren soll.
optBlattSpeichern.Value = True? Ich vermute mal, dass optBlattSpeichern.Valuecolor> auf False steht. Dann wird automatisch der Elseblock ausgeführt. Eigentlich kopierst Du das Blatt ja schon weiter oben im Makro. Und die Makros werden auch schon nach dem Erstellen der Kopie gelöscht (Zeilen 4 und 5). Da ist es IMHO nicht notwendig, dass selbe noch einmal zu tun. Daher kannst Du den Block auch weglassen.

AW: Senden und Speichern Tabellenblatt
05.05.2008 16:32:30
Mazilu
Ist auf True und weglassen kann ich Ihn leider auch nicht, da er mir sonst die datei nicht mehr anhängt!!

Anzeige
AW: Senden und Speichern Tabellenblatt
05.05.2008 16:39:19
mumpel
Doch, sollte er machen. Dafür sorgt Attachments.Add aws. Dafür darfst Du die Mappe aber nicht schließen. Also nach dem Kopieren, dem Makrolöschen und dem Speichern der Kopie die Kopie nicht schließen. Dann sollte die Mappe auch angehängt werden. Erst nach dem Anhängen die Datei schließen.
Sub AktiveTabelleAlsAnhang()
Application.DisplayAlerts = False
Dim aws As String
Dim olapp As Object
ActiveWorkbook.ActiveSheet.Copy
Call Alles_löschen
Dim varPfad As Variant
If Workbooks.Count = 0 Then Exit Sub
On Error Resume Next
Sheets("formular").Range("A6").Select
varPfad = Application.GetSaveAsFilename(Date & "_" & Hour(Time) & "." & Minute(Time) & "." & _
Second(Time) & "_" & [AJ6] & ".XLS")
If varPfad = False Then: Exit Sub
If Dir(varPfad) <> "" Then _
    MsgBox "Die Datei " & varPfad & " existiert bereits." & vbNewLine & vbNewLine & "Bitte " & _
    "wiederholen Sie den Vorgang und vergeben Sie einen anderen Dateinamen oder wählen Sie einen" & _
    "anderen Ordner.", vbOKOnly + vbInformation, "Datei existiert": Exit Sub
If MsgBox("Reisekostenabrechnung an Finance zur Archivierung schicken?" & vbNewLine & "Bitte " & _
"beachte: die Abrechnung kann nur bearbeitet werden, wenn" & vbNewLine & vbNewLine & "1. Auf " & _
"jedem Belege, die Belegnummer aus der Belegerfassung steht" & vbNewLine & _
"2. Bewirtungsbelege alle erforderlichen Angaben enthalten (siehe FAQ´s)" & vbNewLine & "3. " & _
"Alle Belege auf Papier aufgeklebt wurden" & vbNewLine & vbNewLine & "VIELEN DANK!" & vbNewLine & _
vbNewLine & "Bitte diese Anforderungen mit JA bestätigen!", vbYesNo) = vbYes Then
Rem ActiveWorkbook.Save 
aws = ActiveWorkbook.FullName
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
       .to = "mail@server.de" 'Empfänger 
      '.cc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Kopie an 
      '.bcc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Blindkopie an 
      '.ReadReceiptRequested = True ' optional Lesbestätigung anfordern 
       .htmlbody = "Text" 'Optional Body 
       .Subject = "Text" 'Betreff optional 
       .ReadReceiptRequested = True 'optional Lesebestätigung anfordern 
       .Attachments.Add aws
       .display
       'SendKeys "%s", True ' optional Mail sofort senden 
    End With
  End If
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub


Anzeige
AW: Senden und Speichern Tabellenblatt
05.05.2008 16:58:37
mumpel
Datei = (Date & "_" & Hour(Time) & "." & Minute(Time) & "." & _
Second(Time) & "_" & [AJ6] & ".XLS")
If Dir(Datei) <> "" Then _
    MsgBox "Die Datei " & varPfad & " existiert bereits." & vbNewLine & vbNewLine & "Bitte " & _
    "wiederholen Sie den Vorgang und vergeben Sie einen anderen Dateinamen oder wählen Sie einen" & _
    "anderen Ordner.", vbOKOnly + vbInformation, "Datei existiert": Exit Sub


Wenn ich mir den obigen Block mal genauer anschaue, muss ich feststellen, dass dieser überflüssig ist, da Du mit sekunden arbeitest. Daher kann diese Datei nie vorhanden sein. Denn jede sekunde ist eine neue Zeit. Daher solltest Du auf die Minuten und sekunden verzichten. Mit dem folgenden Code funktioniert es.
Du kannst natürlich auch mit Sekunden und Minuten speichern. Dann musst Du aber nicht erst prüfen, ob die Datei existiert.

Sub AktiveTabelleAlsAnhang()
Application.DisplayAlerts = False
Dim aws As String
Dim Datei As String
Dim olapp As Object
Datei = (Date & "_" & Hour(Time) & "_" & [AJ6] & ".XLS")
If Dir(Datei) <> "" Then _
    MsgBox "Die Datei " & varPfad & " existiert bereits." & vbNewLine & vbNewLine & "Bitte " & _
    "wiederholen Sie den Vorgang und vergeben Sie einen anderen Dateinamen oder wählen Sie einen" & _
    "anderen Ordner.", vbOKOnly + vbInformation, "Datei existiert": Exit Sub
ActiveWorkbook.ActiveSheet.Copy
Call Alles_löschen
On Error Resume Next
Sheets("formular").Range("A6").Select
ActiveWorkbook.SaveAs (Date & "_" & Hour(Time) & "_" & [AJ6] & ".XLS")
If MsgBox("Reisekostenabrechnung an Finance zur Archivierung schicken?" & vbNewLine & "Bitte " & _
"beachte: die Abrechnung kann nur bearbeitet werden, wenn" & vbNewLine & vbNewLine & "1. Auf " & _
"jedem Belege, die Belegnummer aus der Belegerfassung steht" & vbNewLine & _
"2. Bewirtungsbelege alle erforderlichen Angaben enthalten (siehe FAQ´s)" & vbNewLine & "3. " & _
"Alle Belege auf Papier aufgeklebt wurden" & vbNewLine & vbNewLine & "VIELEN DANK!" & vbNewLine & _
vbNewLine & "Bitte diese Anforderungen mit JA bestätigen!", vbYesNo) = vbYes Then
Rem ActiveWorkbook.Save 
aws = ActiveWorkbook.FullName
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
       .to = "mail@server.de" 'Empfänger 
      '.cc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Kopie an 
      '.bcc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Blindkopie an 
      '.ReadReceiptRequested = True ' optional Lesbestätigung anfordern 
       .htmlbody = "Text" 'Optional Body 
       .Subject = "Text" 'Betreff optional 
       .ReadReceiptRequested = True 'optional Lesebestätigung anfordern 
       .Attachments.Add aws
       .display
       'SendKeys "%s", True ' optional Mail sofort senden 
    End With
  End If
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub


Anzeige
Nachtrag
05.05.2008 17:15:00
mumpel
Im ersten If-Block noch varPfadcolor> noch durch Dateicolor> ersetzen.

AW: Nachtrag
05.05.2008 17:34:00
Mazilu
Hi geht auch ohne ersetzen von varPfad durch Datei komischerweise! Ich zeig dir mal den Cod an der bei mir funktioniert! Und nur dieser Code, den Rest hab ich auch gelöscht.

Sub AktiveTabelleAlsAnhang()
Application.DisplayAlerts = False
Dim aws As String
Dim Datei As String
Dim olapp As Object
Datei = (Date & "_" & Hour(Time) & "." & Minute(Time) & "." & _
Second(Time) & "_" & [AJ6] & ".XLS")
If Dir(Datei)  "" Then _
MsgBox "Die Datei " & varPfad & " existiert bereits." & vbNewLine & vbNewLine & "Bitte " &  _
_
"wiederholen Sie den Vorgang und vergeben Sie einen anderen Dateinamen oder wählen Sie  _
einen" & _
"anderen Ordner.", vbOKOnly + vbInformation, "Datei existiert": Exit Sub
ActiveWorkbook.ActiveSheet.Copy
On Error Resume Next
Sheets("formular").Range("A6").Select
ActiveWorkbook.SaveAs (Date & "_" & Hour(Time) & "_" & [AJ6] & ".XLS")
If MsgBox("Reisekostenabrechnung an Finance zur Archivierung schicken?" & vbNewLine & "Bitte " & _
_
"beachte: die Abrechnung kann nur bearbeitet werden, wenn" & vbNewLine & vbNewLine & "1. Auf " & _
_
"jedem Belege, die Belegnummer aus der Belegerfassung steht" & vbNewLine & _
"2. Bewirtungsbelege alle erforderlichen Angaben enthalten (siehe FAQ´s)" & vbNewLine & "3. " &  _
_
"Alle Belege auf Papier aufgeklebt wurden" & vbNewLine & vbNewLine & "VIELEN DANK!" & vbNewLine  _
& _
vbNewLine & "Bitte diese Anforderungen mit JA bestätigen!", vbYesNo) = vbYes Then
Rem ActiveWorkbook.Save
aws = ActiveWorkbook.FullName
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
.to = "mail@server.de" 'Empfänger
'.cc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Kopie an
'.bcc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Blindkopie an
'.ReadReceiptRequested = True ' optional Lesbestätigung anfordern
.htmlbody = "Text" 'Optional Body
.Subject = "Text" 'Betreff optional
.ReadReceiptRequested = True 'optional Lesebestätigung anfordern
.Attachments.Add aws
.display
'SendKeys "%s", True ' optional Mail sofort senden
End With
End If
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub


AW: Nachtrag
05.05.2008 17:49:00
mumpel
Habe einen Fehler gemacht. Du wolltest doch, dass man den Ordner selber auswählen kann. Dann hier der passende Code.
Sub AktiveTabelleAlsAnhang()
Application.DisplayAlerts = False
Dim aws As String
Dim Datei As String
Dim olapp As Object
Datei = Application.GetSaveAsFilename(Date & "_" & Hour(Time) & "_" & Minute(Time) & Second(Time) & [AJ6] & ".XLS")
If Dir(Datei) <> "" Then
    MsgBox "Die Datei " & Datei & " existiert bereits." & vbNewLine & vbNewLine & "Bitte " & _
    "wiederholen Sie den Vorgang und vergeben Sie einen anderen Dateinamen oder wählen Sie einen" & _
    "anderen Ordner.", vbOKOnly + vbInformation, "Datei existiert"
    Exit Sub
Else
ActiveWorkbook.ActiveSheet.Copy
Call Alles_löschen
On Error Resume Next
Sheets("Tabelle1").Range("A6").Select
ActiveWorkbook.SaveAs Datei
End If
If MsgBox("Reisekostenabrechnung an Finance zur Archivierung schicken?" & vbNewLine & "Bitte " & _
"beachte: die Abrechnung kann nur bearbeitet werden, wenn" & vbNewLine & vbNewLine & "1. Auf " & _
"jedem Belege, die Belegnummer aus der Belegerfassung steht" & vbNewLine & _
"2. Bewirtungsbelege alle erforderlichen Angaben enthalten (siehe FAQ´s)" & vbNewLine & "3. " & _
"Alle Belege auf Papier aufgeklebt wurden" & vbNewLine & vbNewLine & "VIELEN DANK!" & vbNewLine & _
vbNewLine & "Bitte diese Anforderungen mit JA bestätigen!", vbYesNo) = vbYes Then
Rem ActiveWorkbook.Save 
aws = ActiveWorkbook.FullName
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
       .to = "mail@server.de" 'Empfänger 
      '.cc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Kopie an 
      '.bcc = "mail1@server.de,mail2@server.de,mail3@server.de" 'optional Blindkopie an 
      '.ReadReceiptRequested = True ' optional Lesbestätigung anfordern 
       .htmlbody = "Text" 'Optional Body 
       .Subject = "Text" 'Betreff optional 
       .ReadReceiptRequested = True 'optional Lesebestätigung anfordern 
       .Attachments.Add aws
       .display
       'SendKeys "%s", True ' optional Mail sofort senden 
    End With
  End If
ActiveWorkbook.Close
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub


AW: Senden und Speichern Tabellenblatt
05.05.2008 16:47:09
Mazilu
macht er nicht. Ist auch egal dann muß ich mit 2 Dateien leben! Vielen Dank!

AW: Senden und Speichern Tabellenblatt
05.05.2008 15:21:48
Daniel
Also, ich versteh' echt nicht warum, habe die Methode oben jetzt zum wiederholten Male probiert, den Blattschutz schon aus lauter Verzweiflung ausgestellt, aber bullshit... der Code bleibt in der Kopie...
So jetzt poste ich einfach mal den Code... nachfolgend der Code der zu kopierenden Seite:
Option Explicit

Private Sub CommandButton2_Click() 'Email
AktiveTabelleAlsAnhang
End Sub



Private Sub worksheet_activate()
Set_Zoom
TextBox4.Activate
Label1.Caption = Year(Date) - 1
Label2.Caption = Year(Date) - 2
Label3.Caption = Year(Date) - 3
Label4.Caption = Year(Date) - 1
Label5.Caption = Year(Date) - 2
Label6.Caption = Year(Date) - 3
TextBox9.Value = Sheets("AuswertungVorbereitung").Cells(31, 6).Value
TextBox10.Value = Sheets("AuswertungVorbereitung").Cells(31, 7).Value
TextBox11.Value = Sheets("AuswertungVorbereitung").Cells(31, 8).Value
End Sub



Private Sub CommandButton1_Click() 'Startmenü Button
Sheets("startmenu").Visible = True
Sheets("Protokoll").Visible = False
End Sub



Private Sub CommandButton3_Click()     'LoPP Button
Sheets("lopp").Visible = True
Sheets("protokoll").Visible = False
End Sub



Private Sub CommandButton4_Click()   'drucken Button
Drucken1
End Sub


'--------Textboxwechsel per TAB-Taste---------------------------------------------


Private Sub Textbox1_keydown(ByVal keycode As MSForms.ReturnInteger, ByVal shift As Integer)
If keycode = vbKeyTab Then TextBox2.Activate
Etc.
End Sub


Und hiermit versuch ich das aktive Blatt als Mail zu versenden und vorher den Vba Code rauszuwerfen aus der Kopie...
Sub AktiveTabelleAlsAnhang()
Application.DisplayAlerts = False
Dim aws As String
Dim olapp As Object
ActiveWorkbook.ActiveSheet.Copy
Call Alles_löschen
ActiveWorkbook.Save
aws = ActiveWorkbook.FullName
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
.Subject = ActiveWorkbook.FullName
.attachments.Add aws
.htmlbody = "Sehr geehrter Herr ," & "
" & "
" & vbCrLf & "Mit freundlichen Grüssen,"
.display
End With
Set olapp = Nothing
End Sub


Sub Alles_löschen()
Call Lösche_Module
Call Lösche_Userformen
Call Lösche_Ereignisprozeduren
End Sub


Sub Lösche_Module()
Rem Löscht Module:
For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
If ActiveWorkbook.VBProject.vbComponents(n).Type = 1 Then
ActiveWorkbook.VBProject.vbComponents(n).Collection.Remove ActiveWorkbook.VBProject.vbComponents(n)
End If
Next
End Sub


Sub Lösche_Userformen()
Rem Löscht Userforms:
For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
If ActiveWorkbook.VBProject.vbComponents(n).Type = 3 Then
ActiveWorkbook.VBProject.vbComponents(n).Collection.Remove ActiveWorkbook.VBProject.vbComponents(n)
End If
Next
End Sub


Sub Lösche_Ereignisprozeduren()
Rem Löscht Ereignisprozeduren:
For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
For i = 1 To ActiveWorkbook.VBProject.vbComponents(n).CodeModule.CountOfLines
If ActiveWorkbook.VBProject.vbComponents(n).Type 1 And ActiveWorkbook.VBProject.vbComponents(n).Type 3 Then _
ActiveWorkbook.VBProject.vbComponents(n).CodeModule.DeleteLines 1
Next
Next
End Sub


Klappt aber nicht, der Code steht weiterhin im Tabellenblatt und die worksheet_activate geht los...

AW: Senden und Speichern Tabellenblatt
05.05.2008 15:43:55
daniel
? Irgendjemand ne Ahnung wieso dem so ist...

AW: Senden und Speichern Tabellenblatt
05.05.2008 15:51:14
mumpel
Hänge doch mal eine Beispielmappe an. Dann sehen wir mal rein.
Da ich gerade sehe, dass Dein Code aus dem Zusammenhang gerissen ist, hier mal ein Add-In. Damit lässt sich der Code platztsparend unterbringen, wie in meinen letzten Antworten. VBA-Code für Foren in HTML umwandeln. Mit freundlicher Genehmigung von Lukas Mosimann (CH).
Für das Herber-Forum ist das Profil "Für Herber-Forum" optimal vorbereitet. Zum Importieren:
Im VBE auf "VBA zu HTML->Einstellungen" klicken, dann auf "Profile->Profil importieren".
Zum Ordner der Profildatei navigieren, Datei auswählen und auf "Öffnen" klicken.
Die Nachfragen mit Ja bestätigen.
Ähnliches gilt für Office-Loesung.de
Zum konvertieren eines einzelnen Makro: Makro markieren, VBA zu HTML->Auswahl in HTML.
Dann den Code im Antwortfenster einfügen (STRG+V)

AW: Senden und Speichern Tabellenblatt
05.05.2008 17:33:00
Daniel
So, also nach etwas rumexperimentieren ist etwas der Status wie folgt:
der Befehl activeworkbook.activesheet.copy kopiert mir das aktive Blatt in ein neues Workbook und, da ist das Problem, aktiviert es auch... in dem zu kopierenden Sheet ist aber eine Worksheet_activate Prozedur, die unter anderem verschiedene Labels bezeichnet und ein Call für ein Makro, das den Zoom für den Bildschirm abhängig von der Auflösung festsetzt. Wenn ich das Sheet also in eine neue Arbeitsmappe kopiere und erst danach den Code lösche, ist die worksheet_activate schon gelaufen und ich bekomme eben die Fehlermeldungen bezüglich nicht vorhandener Makros, Verweise,etc.
Lösche ich den Code vor der activesheet.copy anweisung, löscht er mir meinen Originalcode aus der zu kopierenden Tabelle...
Wenn ich den Code oder eine Bspmappe posten soll, bitte kurze Meldung, ansonsten hoffe ich die Problematik ist deutlich geworden....
Danke,
Daniel

AW: Senden und Speichern Tabellenblatt
05.05.2008 18:01:00
mumpel
Ändere einfach die Makros in der Originalmappe. Setze dazu in den Makros am Anfang der Makros die Zeile
If ActiveWorkbook.Name "Mappe1" Then Exit Subcolor>. Anstelle von Mappe1 kommt der Name der Originalmappe.

AW: Senden und Speichern Tabellenblatt
06.05.2008 10:07:16
Daniel
Den Ansatz finde ich gut, aber...:
mein code in der Worksheet_activate des zu kopierenden Blattes:

Private Sub worksheet_activate
if activeworkbook.name  "Name der Originalmappe" Then Exit Sub
Set_Zoom
Textbox4.activate
Label1.caption = ...
Label2...
Textbox9.value = sheets("Auswertung").cells(31,6).value
End Sub


Wenn ich den Aufruf Get_Zoom im Original weglasse, dann kopert er das Blatt schön und löscht den Code, lasse ich das get_zoom aber stehen, löscht er den code nicht mehr und versucht das Makro aufzurufen, obwohl in der ersten Zeile eigentlich die Sub verlassen werden sollte, da der activeworkbook.name ja nun Mappe x ist und nicht mehr der in der If Bedingung geforderte Name der Originalmappe.
Mr. Mumpel, you got a clue?

AW: Senden und Speichern Tabellenblatt
06.05.2008 10:31:00
mumpel
Setzte die von mir erwähnte Zeile auch in das Makro "Set_Zoom". Dann verschiebe das Makro in den Codebereich der Tabelle. Wenn Du das Makro auch in anderen Tabellen nutzen möchtest, dann kopiere das Makro in den Codebereich der Tabelle und benenne es um (z.B. Set_Zoom1). Den neuen Namen dann noch im worksheet_activate anpassen. Jetzt sollte beim kopieren des Tabellenblattes dass Makro gefunden und auch abgebrochen werden. Dann sollte es auch zu löschen sein. Beim Namen der Arbeitsmappe darfst Du die Dateiendung nicht mit angeben. Allso nur den reinen Namen der Arbeitsmappe.

Nachtrag:
06.05.2008 10:33:04
mumpel
Hoppla, kleiner Fehler. Die Dateiendung kann angegeben werden, macht gar nichts.

AW: Senden und Speichern Tabellenblatt
06.05.2008 10:33:24
Daniel
Ich hau mal in die Tasten, vielen Dank... Feedback kommt dann gleich

AW: Senden und Speichern Tabellenblatt
06.05.2008 10:35:00
Daniel
Ich hau mal in die Tasten, vielen Dank... Feedback kommt dann gleich

AW: Senden und Speichern Tabellenblatt
06.05.2008 10:50:00
Daniel
Ole ole ole oleeeeee, du Super-Mumpel oleeeee!
Funzt wunderbar, ich bin Dir zu Dank verpflichtet...
Für heute bist du auf jeden Fall mein persönlicher Held...
Danke und Gruß aus Mannheim,
Daniel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige