Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1864to1868
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

Speichern von Tabellenblättern

Speichern von Tabellenblättern
28.01.2022 12:06:05
Tabellenblättern
Hallo zusammen,
ich bin gerade dabei mir ein Makro zusammen zu schreiben, mit dem ich mehrere Tabellenblätter in eine neue Datei kopieren möchte um diese danach per Mail zu versenden. Einzelne Blätter per Mail versenden hat bisher immer funktioniert und das Kopieren von mehreren Blättern klappt soweit auch schon. Allerdings bricht mir das Makro nach der Abfrage ob ich die Mappe ohne Makros speichern möchte mit dem Fehler 400 ab.
Die Aufgabe meines Makros besteht darin, dass gewissen Blätter aus einer großen Mappe kopiert und versendet werden sollen. Dabei ist mir wichtig, dass die Makros nicht mit gespeichert werden. Zusätzlich muss ich noch zusehen, dass die per PQ erstellten Daten in den kopierten Blättern nicht mehr aktualisiert werden, was zusätzlich beim Aufruf der jeweiligen Seite (Woorksheet.Activate) ständig getan wird.
Was habe ich falsch gemacht bzw. was muss ich ändern, damit das Ganze korrekt abläuft?
Gruß Ulf

Sub TabellenblattKopieren()
Dim strPfad As String, strName As String, strSheets() As String
Dim objWb As Workbook, objWs As Worksheet
Dim lngI As Long
Dim Passwort As String
Dim Mailadresse  As String, Betreff As String
Dim olApp As Object
Dim strOldBody As String
Dim AWS As String
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.Createitem(0)
MailTo = "u@e.com"
Betreff = strName
Anrede = "Sehr geehrte Damen und Herren,
" Text = Anrede & Text1 Text1 = "im Anhang finden Sie die aktuellen Umpackkosten." Passwort = Application.InputBox(prompt:="Geben Sie das Passwort ein", Type:=2) If Passwort "0000" Then Exit Sub With Sheets("LG nach Umpackdatum") strPfad = "\\meinPfad\" strName = .Range("C1") & " " & .Range("C3") & " " & .Range("D3") AWS = strName & ".xlsx" End With ThisWorkbook.RefreshAll For Each objWs In ThisWorkbook.Worksheets If objWs.Name Like "LgGR_?" Then ReDim Preserve strSheets(lngI) strSheets(lngI) = objWs.Name lngI = lngI + 1 End If Next If lngI > 0 Then ThisWorkbook.Sheets(strSheets).Copy Set objWb = ActiveWorkbook With objWb For Each objWs In .Worksheets objWs.UsedRange = objWs.UsedRange.Value Next .SaveAs AWS End With End If With olMail .GetInspector.Display strOldBody = .htmlBody .To = MailTo .Subject = Betreff .htmlBody = "" & Text & "" & strOldBody .Attachments.Add strPfad & AWS .Display End With Set olApp = Nothing End Sub

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Speichern von Tabellenblättern
28.01.2022 14:28:40
Tabellenblättern
Hallo Ulf,
ins Blau: beim Speichern als Datei, wo die Dateiname aus dem Blatt gelesen wird, kommt es oft vor, dass dabei ein Zeichen verwendet wird, das als Teil eines Dateiname nicht erlaubt ist.
Zu diesen Zeichen gehören ~ “ # % & * : ? / \ { | }
In Web-Maniere, wo manche Zeichen nicht als Web-Adresse erlaubt sind, kann man diese in "%" & Hex(Asc(Zeichen)) , bekannteste ist %20: Leerzeichen
Ergibt:
~ %7E
“ %93
# %23
% %25
& %26
* %2A
: %3A
> %3E
? %3F
/ %2F
\ %5C
{ %7B
| %7C
} %7D
VG
Yal
AW: Speichern von Tabellenblättern
28.01.2022 14:37:09
Tabellenblättern
Hallo Yal,
im Pfad werden bei mir keine Zeichen oder Umlaute benutzt, ist aber ansonsten ein berechtigter Einwand. Nach aktueller Recherche und den damit einhergehenden Änderungen am Makro habe ich festgestellt, dass die Variablen nicht richtig übergeben werden. Trage ich alles manuell ein ohne dass das Makro auf Änderungen reagieren könnte klappt es soweit ganz gut. Ich werde also weiter schauen, wo der Hase begraben liegt und meinen Code entsprechend anpassen müssen.
Gruß Ulf
Anzeige
AW: Speichern von Tabellenblättern
28.01.2022 16:54:02
Tabellenblättern
Hallo Ulf,
Freitag ist Klugscheissertag :-)) Mir ist langweilig.
Ich habe dein Code angenommen und nach meinen Gewohnheiten umgestellt. Es ist keinesfalls "besser" als deins. Vielleicht gibt es hier und da einige Anregungen. Wichtig ist, dass Du dich darin wiederfindest.
_ Variablen sparen: feste String als Konstanten
_ Trick "Array of string": String mit Trenner bilden, dann splitten (erspart den ReDim). Ein ""-Split erzeugt einen Array mit UBound = -1.
_ für ein leichtere Übersicht, Mail senden separat, da eigene Variablen und Konstanten.

Sub TabellenBlatt_SpeichernSenden()
Dim Ws As Worksheet
Dim WListe() As String
Dim S As String
Dim Dateiname As String
Const cPFad = "\\meinPfad\"
Const cExt = ".xlsx"
'LgGR_?-Blätter auflisten
For Each W In ThisWorkbook.Worksheets
If Ws.Name Like "LgGR_?" Then S = S & ";" & Ws.Name
Next
WListe = Split(Mid(S, 2), ";")
'Exit, falls kein Treffer
If UBound(WListe) = -1 Then MsgBox "Keine Treffer!": Exit Sub
'Dateiname herstellen
With Sheets("LG nach Umpackdatum")
Dateiname = cPFad & .Range("C1") & " " & .Range("C3") & " " & .Range("D3") & cExt
End With
'Kopieren, durch Wert ersetzen, speichern
ThisWorkbook.Sheets(WListe).Copy
With ActiveWorkbook
For Each W In .Worksheets
W.UsedRange = W.UsedRange.Value
Next
.SaveAs Dateiname
End With
'Mail senden
Mail_senden Dateiname
End Sub
Private Sub Mail_senden(Optional ByVal DateiPfad As String = "")
Dim olApp As Object
Dim olMail As Object
Const cMailTo = "u@e.com"
Const cT1 = "Sehr geehrte Damen und Herren,"
Const cT2 = "im Anhang finden Sie die aktuellen Umpackkosten."
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.Createitem(0)
With olMail
.GetInspector.Display
.htmlBody = cT1 & vbCr & vbCr & cT2 & vbCr & .htmlBody
.To = cMailTo
.Subject = Mid(DateiPfad, InStrRev(DateiPfad, "\") + 1)
If DateiPfad  "" Then .Attachments.Add DateiPfad
.Display
End With
End Sub
VG
Yal
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige