aktive Zeile per Mail senden

Moderator: ModerationP

aktive Zeile per Mail senden

Beitragvon wut » 19. Sep 2021, 07:33

Hallo zusammen,

wie es bei mir immer ist - 1 Problem ergibt das nächste.

Ich würde gerne bei einer Änderung in der Zeile A-M eine Mail starten die den Text der Zeile im Mailtext dabei hat (damit ich weis um welche Zeile es sich handelt)

Der Code falls was geändert oder erstellt wird (hinterlegt im Tabellenblatt)
Code: Alles auswählen
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then

   'hier dein Makro einfügen oder dein Makro von hier starten.
   Call aktivedrucken
   
End If
End Sub


Der Mail-Code:

Code: Alles auswählen
Sub aktivedrucken()
Application.DisplayAlerts = False
'Dim aws As String
Dim olapp As Object

Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
    .to = GetAddies 'Empfänger holt er sich hier aus dem V1-V5
   
   .htmlbody = ActiveCell.Text 'Optional Body

   .Subject = "Thema - Dokumentenlenkung" 'Betreff optional
   .ReadReceiptRequested = True 'optional Lesebestätigung anfordern

   .display
   
End With
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub


 Private Function GetAddies() As String
Dim sAddies As String
Dim rCell As Range


For Each rCell In Worksheets("config").Range("e2:Ae6").Cells '
'das gebe ich ein wenn ich keine verknüpften cellen haben will
   sAddies = rCell.Text & ";" & sAddies
Next
GetAddies = Left(sAddies, Len(sAddies) - 1)
End Function


beide funktionieren, mein Problem er gibt nur 1 Zelle aus nicht die kpl Zeile, ich denke das müsste angepasst werden nur wie?
Code: Alles auswählen
.htmlbody = ActiveCell.Text 'Optional Body


habe keinen Schimmer wie ich da einen Range reinbekomme der zb. die aktive Zeile von A bis M in den Text der Mail legt.

Dankeschön im vorraus
Marcus
wut
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 395
Registriert: 21. Sep 2005, 11:32

Re: aktive Zeile per Mail senden

Beitragvon Gast » 19. Sep 2021, 09:29

Schau mal, hiervon könntest ableiten:

viewtopic.php?f=166&t=870059
Gast
 

Re: aktive Zeile per Mail senden

Beitragvon wut » 19. Sep 2021, 10:12

@Gast

entweder sehe ich die Lösung nicht oder es funktioniert nicht

wenn in Zeile x eine Änderung stattfindet dann soll er das Makro starten - das bekomme ich hin
er soll die ganze Zeile (A bis M) soll im Mailtext stehen das bekomme ich nicht hin

Hintergrund wenn jemand was anlegt oder ändert - möchte ich eine Info > Mail, damit ich weis wo ich suchen muss brauche ich einen Bezug zur Zeile
das kann die kpl. oder nur ein Teil sein z.B. A ( da in dieser die fortlaufende Nummer liegt sein

Dankeschön
Marcus
wut
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 395
Registriert: 21. Sep 2005, 11:32

Re: aktive Zeile per Mail senden

Beitragvon @Mase » 20. Sep 2021, 06:47

Jetzt Schreibst mal von A1 bis M1 etwas in jede Zelle und führst folgenden Code aus:

Code: Alles auswählen
    With Application
        MsgBox Join(.Transpose(.Transpose(Range("A1:M1"))), " ")
    End With


Wenn Du hierbei Erfolg hast, musste 'nur noch' Deine Range und die 'Ausgabe' entsprechend anpassen.
@Mase
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 17
Registriert: 08. Sep 2021, 06:51

Re: aktive Zeile per Mail senden

Beitragvon 1Matthias » 20. Sep 2021, 09:18

Moin!
Als Ergänzung zu den bisherigen Tipps.
Deine richtige Zeilenummer kannst du nicht immer mit dem ActiveCell ermitteln. Dafür solltest du das target aus dem Worksheet_Change nehmen. Aus dem kannst du die Zeile mit target.row ermitteln. Die kannst du ja an deine Prozedur activedrucken übergeben. Dann hast du die dort auch und kannst die richtige Range bilden. Aus der Prozedur kannst du sonst nicht mehr auf das target zugreifen (alternativ kannst du das auch in eine globale Variable speichern, falls du die später wo anders nochmal brauchst).
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 963
Registriert: 15. Aug 2017, 18:36

Re: aktive Zeile per Mail senden

Beitragvon wut » 20. Sep 2021, 20:28

@Mase

Danke da gibt er mir aber die Erste Zeile aus und nicht die aktive (wo der Cursor gerade ist)

@1Matthias
bis MOIN! habe ich alles verstanden danach nicht mehr?

ginge es etwas mehr für Anfänger bitte :mrgreen: :badgrin:
wut
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 395
Registriert: 21. Sep 2005, 11:32

Re: aktive Zeile per Mail senden

Beitragvon Mullit » 20. Sep 2021, 21:46

Hallo,

Teufel, :twisted: seit 2005 dabei, da mußt Du einfach mal selbst weiter proggen... :D 8-)
Mase hat geschrieben:Wenn Du hierbei Erfolg hast, musste 'nur noch' Deine Range und die 'Ausgabe' entsprechend anpassen.

okidoki:
Code: Alles auswählen
With WorksheetFunction
   MsgBox Join(.Transpose(.Transpose(Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, 13)))), " ")
End With

Oder besser noch: nimm wie Matthias schon schrieb Target aus der Event-Proc und übergib das als Parameter...ein Ansatz nach dem Moin... :lol:
Code: Alles auswählen
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then

   'hier dein Makro einfügen oder dein Makro von hier starten.
   Call aktivedrucken(Target)
   
End If
End Sub
Sub aktivedrucken(ByRef probjTarget as Range)
'///Mach weiter mit probjTarget ....
End Sub

Gruß, Mullit
Mullit
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 953
Registriert: 16. Jan 2015, 19:31

Re: aktive Zeile per Mail senden

Beitragvon 1Matthias » 21. Sep 2021, 10:09

Moin!
Da ich grad massig Zeit habe, hier mal noch ein wenig ausführlicher.
Du willst dein Versenden ja bei Änderungen der aktuellen Zeile (Spalte A bis M) auslösen. Dazu hast das das Change-Event genutzt. Activecell nimmt die aktive Zelle. Wenn du jetzt im Blatt etwas änderst und dann mit Enter abschließt, startet dein Change Ereignis. Durch das Enter-drücken, springt der Cursor aber in eine andere Zelle (abhängig von den Einstellungen). Diese Zelle ist dann die aktuelle und wird beim Event genutzt. Bringt dir also wenig. Ich hoffe du bist noch dabei. :P
Bei dem Event ist aber von Haus aus schon ein Parameter dabei. Der nennt sich target und steht im Kopf des Events. In dem wird automatisch die geänderte Zelle(n) hinterlegt. Das ist nun wieder ein Objekt mit verschiedenen Eigenschaften, die man abrufen kann. Unter anderem ist dort die Zeile (row) die Spalte (Column) oder die Anzahl der geänderte Zellen (count) auswertbar. Allerdings kannst du auf dieses Objekt nur innerhalb des Change Eventes zugreifen.
Da dein Code zum Versenden nun nicht im Ereignis steht sondern in einer extra Prozedur (aktivedrucken) musst du entweder das Objekt an deine Prozedur übergeben oder halt die Zeile die sich geändert hat. Mullit hat bei seinem Code das komplette Objekt übergeben (steh jetzt in KLammern hinter aktivedrucken). Damit das klappt, musst du in deiner Prozedur im Kopf auch angeben, dass dort ein Argument kommt. Das ist bei Mullit das (Byval Target as Range). Mit dem kannst du jetzt weiter arbeiten. Ich hoffe soweit noch alles verständlich. Wenn nicht einfach nochmal nachfragen.
Ich habe auch mal deinen Code angepasst und ein paar Änderungen eingebaut. Nach deinem EIngangspost habe ich das mit dem .column = 2 weggelassen. (Bitte mal deinen Code mit meinem Vergleichen!). Damit würde der Code nur anspringen, wenn du in Spalte B was änderst. Du wolltest ja aber A bis M. Deshalb geht er jetzt los, wenn die Spaltennummer kleiner als 14 (entspricht Spalte N) ist. Außerdem habe ich noch drin, dass der Code nur anspringt, wenn nur eine Zelle geändert wurde. Das ist das mit dem count = 1. Das kannst du aber wieder rausnehmen. ICh übergebe dann nur die Zeile, die geändert wurde.
In deinem Code erstellte ich dann mit dem Code von Mase den Inhalt. Dazu in der fest vercodeten Zeile A1:M1 die 1 jeweils durch die übergebene Zeilennummer ersetzen. Kannst es dir im Code anschauen. Der ist allerdings jetzt nicht getestet.
Code: Alles auswählen
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column < 14 And Target.Count = 1 Then

'das kleiner 14 bewirkt, dass die Spaltennummer nur 1 bis 13 sein darf, das entspricht A bis M
'das count 1 soll bewirkten, dass nur eine Zelle geändert werden darf - kann aber auch raus


   'hier dein Makro einfügen oder dein Makro von hier starten.
   Call aktivedrucken(Target.Row)
   
End If
End Sub



Sub aktivedrucken(zeile As Long)
Application.DisplayAlerts = False
'Dim aws As String
Dim olapp As Object

Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
    .to = GetAddies 'Empfänger holt er sich hier aus dem V1-V5
   
   .htmlbody = Join(application.Transpose(application.Transpose(Range("A" & zeile & ":M" & zeile))), " ") 'ActiveCell.Text 'Optional Body

   .Subject = "Thema - Dokumentenlenkung" 'Betreff optional
   .ReadReceiptRequested = True 'optional Lesebestätigung anfordern

   .display
   
End With
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub

Wie geschrieben, bei Fragen einfach melden.
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 963
Registriert: 15. Aug 2017, 18:36

Re: aktive Zeile per Mail senden

Beitragvon wut » 21. Sep 2021, 19:02

wo soll das Bier hin, Hammer zu 100% habe ich es noch nicht ganz verstanden aber so ausführlich hat es mir noch keiner erklärt danke danke


und es funktioniert er überträgt mir die benötigten zeilen perfekt in die mail,

der nachteil (aber dafür finde ich eine lösung)
er startet sofort das makro wenn ich in einer neuen zeile was eingebe. daher gestaltet es sich jetzt etwas schwierig mit dem ausfüllen von neuen einträgen :lol:

dankeschön

marcus
wut
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 395
Registriert: 21. Sep 2005, 11:32

Re: aktive Zeile per Mail senden

Beitragvon 1Matthias » 21. Sep 2021, 19:58

Moin!
Ne Idee für den Nachteil:
Von den Spalten A bis M sind bestimmt /hoffentlich / evtl. irgendwelche Spalten Pflicht. Wenn dem so ist, kannst du ja in dem Event vorher noch prüfen, ob die Pflichtspalten gefüllt sind und nur wenn das passt, das Makro wie gewünscht weiterlaufen lassen. Dann kannst du zumindest die Pflichtspalten in Ruhe füllen und nur bei den anderen läuft der Code durch.
Ansonsten baue noch eine Abfrage (msgbox) ein, in der du fragst, ob versandt weden soll. Je nach Klick (OK / abbrrechen), geht der Code weiter oder endet. Dann könnte man das mit einem Enter abbrechen und braucht nicht mal die Hand von der Tastatur zu nehmen.
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 963
Registriert: 15. Aug 2017, 18:36

Re: aktive Zeile per Mail senden

Beitragvon wut » 21. Sep 2021, 20:42

@Matthias

habe diesen Code im Sheet selber drin

Code: Alles auswählen
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column < 14 And Target.Count = 1 Then

'das kleiner 14 bewirkt, dass die Spaltennummer nur 1 bis 13 sein darf, das entspricht A bis M
'das count 1 soll bewirkten, dass nur eine Zelle geändert werden darf - kann aber auch raus


   'hier dein Makro einfügen oder dein Makro von hier starten.
   Call aktivedrucken(Target.Row)
   
End If
End Sub
End If
End Sub


diesen Code habe ich als Modul

Code: Alles auswählen
Sub aktivedrucken(zeile As Long)
Application.DisplayAlerts = False
'Dim aws As String
Dim olapp As Object

Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
    .to = GetAddies 'Empfänger holt er sich hier aus dem V1-V5
   
   .htmlbody = Join(Application.Transpose(Application.Transpose(Range("A" & zeile & ":M" & zeile))), " ") 'ActiveCell.Text 'Optional Body

   .Subject = "Thema - Dokumentenlenkung" 'Betreff optional
   .ReadReceiptRequested = True 'optional Lesebestätigung anfordern

   .display
   
End With
Set olapp = Nothing
Application.DisplayAlerts = True
End Sub


Ergebnis:

egal ob ich eine Änderung oder Neueintrag vornehme der sendet sofort eine Mail zwar mit dem richtigen Bereich aber bei einem Neueintrag - geht die Mail raus bevor ich die Zeilen füllen konnte.

Jetzt habe ich gesucht und diesen Code gefunden und getestet:
Code: Alles auswählen
Public Function Startmakro() As String
 Call Anzeige
 Startmakro = "Gestartet."
End Function
Sub Anzeige()
 MsgBox "Makro wurde gestartet"
End Sub


der sollte die Abfrage hat sich in dem Bereich a-m was geändert starten. bloss wo baue ich den ein?

Ins Sheet
In ein Modul
wohin?

Danke Marcus
wut
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 395
Registriert: 21. Sep 2005, 11:32

Re: aktive Zeile per Mail senden

Beitragvon steve1da » 22. Sep 2021, 06:50

Benutzeravatar
steve1da
Moderator
 
Beiträge: 31552
Registriert: 24. Sep 2003, 10:54

Re: aktive Zeile per Mail senden

Beitragvon HKindler » 22. Sep 2021, 08:20

Hi,

da ich im anderen Forum nicht antworten kann (kein Account), geht es hier weiter. Soll der TE doch selbst mit dem Chaos klar kommen. :mrgreen:

Du könntest einfach dein Makro erst beim Verlassen der Zeile starten. Ungefähr so:
Code: Alles auswählen
Option Explicit
Dim letzteAenderung As Long

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:M")) Is Nothing Then
    letzteAenderung = Target.Row
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If letzteÄnderung Then
    If Target.Row <> letzteAenderung Then
        aktivedrucken letzteAenderung
        letzteÄnderung = 0
    End If
End If
End Sub

Sub aktivedrucken(zeile As Long)
    MsgBox "Drucken Zeile: " & zeile
End Sub
Zuletzt geändert von HKindler am 22. Sep 2021, 09:05, insgesamt 1-mal geändert.
Gruß,
Helmut

----------------------------
Windows 10 Enterprise (64 Bit) / Office 365 ProPlus (32 Bit)
Benutzeravatar
HKindler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 6293
Registriert: 04. Jul 2013, 09:02
Wohnort: Schwarzwald

Re: aktive Zeile per Mail senden

Beitragvon 1Matthias » 22. Sep 2021, 09:03

Moin!
Ich würde jetzt auch hier bleiben, da ich sonst durcheinander komme.
Die Frage wäre, wann ist deine Zeile fertig? Wenn du in allen Feldern was drin hast (deshalb die Frage nach den Pflichtfeldern) bzw. muss das überhaupt geschehen? Und wie legst du eine neue Zeile an?
Bzgl. der Änderung einer schon fertigen Zeile, wäre eine Möglichkeit, beim Versenden in einer ausgeblendeten Spalte) einen Vermerk zu setzen. Dann kannst du bei einer Änderung prüfen, ob die Zeile schon mal fertig war. Dann kannst du sie ja bei jeder Änderung ggf. auch einem LÖschen einer Zeile sofort senden.
Bzgl. der Abfrage wäre das hier mal so eine Idee. Dabei wird geprüft, ob die Spalten A bis M gefüllt sind. Erst wenn das zutrifft, kann man zum Versenden kommen. In der Variante müssen aber alle 13 Spalten gefüllt sein. Zudem kommt dann noch ein Abfrage, ob man schon fertig ist. Die Frage ist so gestellt, dass man mit einem Enterdrücken die Meldung beendet und weiter ändern kann.
Code: Alles auswählen
Private Sub Worksheet_Change(ByVal Target As Range)
Dim spalte As Long, zeile As Long
Dim fertig As Boolean, abfrage As Long

If Target.Column < 14 And Target.Count = 1 Then

'das kleiner 14 bewirkt, dass die Spaltennummer nur 1 bis 13 sein darf, das entspricht A bis M
'das count 1 soll bewirkten, dass nur eine Zelle geändert werden darf - kann aber auch raus

    fertig = True
    For spalte = 1 To 13
        If Cells(Target.Row, spalte) = "" Then
            fertig = False
            Exit For
        End If
    Next

   'hier dein Makro einfügen oder dein Makro von hier starten.
   If fertig Then
        abfrage = MsgBox("Weitere Änderungen vornehmen?", vbOKCancel, "Abfragge")
        If abfrage <> 1 Then Call aktivedrucken(Target.Row)
   End If

   
End If
End Sub


VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 963
Registriert: 15. Aug 2017, 18:36

Re: aktive Zeile per Mail senden

Beitragvon wut » 22. Sep 2021, 22:36

@all wollte kein Chaos machen wegen 2 Foren

@HKindler,

bei deinem Code kommt die Meldung Variable nicht definiert im Abschnitt letzteÄnderung

@1Matthias

bei kommt Fehler beim kompilieren im Abschnitt Call aktivedrucken

was kann das sein?

Habe beide Codes in Kopien getestet
Beide Codes im Worksheet eingetragen

was mache ich da falsch?
wut
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 395
Registriert: 21. Sep 2005, 11:32

Nächste

Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste