Excel Zellen in Outlook-Body kopieren

  • Outlook

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Excel Zellen in Outlook-Body kopieren

    Guten Morgen,

    einen bestimmten Bereich an Zellen in Excel möcht ich auswählen, deren Inhalt addieren und in eine mittels Outlook-VBA per Makro erstellte Mail einfügen. Bevor es an den Teil der Addition geht ist mein erstes Problem das Einfügen in den Body. Die Mail selbst funktioniert.

    Ich bastel schon eine ganze Weile daran herum und habe nun zwei verschiedene Varianten, die allerdings beide nichts einfügen.

    Quellcode

    1. Dim xl As Object
    2. Set xl = CreateObject("Excel.Application")
    3. With xl
    4. .Workbooks.Open ("C:\[...]\abc.xls")
    5. .DisplayAlerts = False
    6. .Visible = True
    7. .Range("K16:K17").Select 'Test Range
    8. .Selection.Copy
    9. End With
    10. With itm
    11. .To = "a@b.c"
    12. .Subject = "TEST"
    13. .Body = xl.Selection.Paste 'funktioniert auch nicht mit nur .Body = .Paste, .Body = .Selection.Paste, ohne den Punkt hinter = oder in der nächsten Zeile
    14. '.Paste
    15. .Display
    16. End With


    Meine zweites Stück, das ich auch in verschiedensten Varianten probiert habe:

    Quellcode

    1. Dim xl As Object
    2. Set xl = CreateObject("Excel.Application")
    3. Dim rng As Variant
    4. Dim cl As Variant
    5. Dim ws As Variant
    6. With xl
    7. .Workbooks.Open ("C:\[...]\abc.xls")
    8. .DisplayAlerts = False
    9. .Visible = True
    10. Set ws = ActiveSheet
    11. rng = .Range("K16:K17"). 'Test Range
    12. '.Selection.Copy
    13. '.Selection.Paste
    14. With rng
    15. .Parent.Select
    16. Set cl = ActiveCell
    17. .Select
    18. ActiveWorkbook.EnvelopeVisible = True
    19. With .Parent.MailEnvelope
    20. .Introduction = "Hallo" 'Diese Zeile hat gar keine Auswirkungen!?
    21. With itm
    22. .To = "a@b.c"
    23. .Subject = "TEST"
    24. .Send
    25. End With
    26. End With
    27. End With
    28. End With


    Außerdem habe ich versucht, das Problem mittels der Object Library zu lösen, aber da scheitert es bereits an der Referenz zu selbiger.

    Quellcode

    1. ReferenceFromFile "C:\Windows\system32\FM20.DLL"
    2. Dim myClpObj As DataObject '"Benutzerdefinierter Typ nicht definiert"
    3. Set myClpObj = New DataObject
    4. ...
    5. With itm
    6. myClpObj.GetFromClipboard
    7. .Body = myClpObj.GetText(1)
    8. ...
    9. End Sub
    10. Function ReferenceFromFile(strFileName As String) As Boolean
    11. Dim ref As Reference
    12. On Error Goto Error_ReferenceFromFile
    13. References.AddFromFile (strFileName)
    14. ReferenceFromFile = True
    15. Exit_ReferenceFromFile:
    16. Exit Function
    17. Error_ReferenceFromFile:
    18. ReferenceFromFile = False
    19. Resume Exit_ReferenceFromFile
    20. End Function


    Ich bin VBA-Neuling insofern möge mir etwagiger Schwachsinn verziehen werden. ;)

    Gruß André
    Lass doch gleich Excel rechnen und vor allem: Übergib das Ganze per Variable zwischen den Anwendungen

    Visual Basic-Quellcode

    1. Set wb = xl.Workbooks.Open ("C:\[...]\abc.xls")
    2. MyExcelCalculatedSum = xl.WorksheetFunction.Sum(wb.Sheets(1).Range("K16:K17"))
    3. wb.Close False
    4. With itm
    5. .To = "a@b.c"
    6. .Subject = "TEST"
    7. .Body = MyExcelCalculatedSum
    8. .Display
    9. End With


    Alternative mit direkter Zuweisung zwischen den Anwendungen itm.Body = xl.WorksheetFunction.Sum(wb.Sheets(1).Range("K16:K17"))
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Hallo und danke für deine Antwort und Hilfe.

    Eines irritiert mich daran allerdings sehr. Nun sind nicht mehr die beiden K-Zellen markiert, sondern die Zellen der Zeile C - und nicht nur die zwei, sondern ALLE Zellen der Spalte C mit relevanten Daten, obwohl in der Function (noch) an überhaupt keiner Stelle auf Range C-irgendwas steht!

    Dennoch kommt das richtige Ergebnis in der Mail an. Soweit so gut, aber wie gesagt, dennoch verwirrt mich das. Vorher waren immer nur die beiden K-Zellen markiert.

    Zu meinem nächsten Zwischenschritt: Es muss für mehrere Gruppen aus der Spalte C die Addition der Zahlen aus K die Addition durchgeführt werden.

    Zum folgenden Teil habe ich noch nicht rumprobiert, insofern kann der auch erst mal unbeachtet bleiben und der graue Teil ist sowieso nicht so wichtig.

    Überlegung zum Zwischenschritt: Ich nehme mal an, dass es möglich wäre, mit einer IF-Schleife für verschiedene C-Typen verschiedene K-Summen zu berechnen, diese jedoch nicht in den Body zu übergeben, richtig?

    Besonderheit ist hierbei außerdem, dass manchmal z.B. erstes Zeichen in C = 4&5 im Body mit zugehörigen K gefüttert werden soll, wobei das dann ja auch vorstellbar wäre mit .Body = "xyz " & IF i = 4&5, THEN sum = [Addition von K] bzw. sum von i=4 und i=5 einfach im Body addieren. Wie gesagt nehme ich aber an, dass sowas prinzipiell nicht im Body geht, da darin fast nix an Code möglich ist, richtig? Abgesehen davon müsste hier ich dann nach dem itm ja wieder zu der IF-Schleife zurückspringen oder eventuell die IF-Schleife um With itm herum schreiben, also davor beginnen, danach beenden?


    Die Idee: IF erstes Zeichen in Range("C16:C*") = i THEN [Addition in K]

    * (letzte) Zelle != kein Inhalt bzw. = letzte Zelle mit Inhalt


    Wenig hübsch wäre nun der Weg, für jede C-Gruppe eine eigene Summe zu dimensionieren, aber wenn es nicht schöner geht, natürlich auch ok.

    Ich nehme mal an, dass der Bezug zu den C-Gruppen über eine IF-Schleife gehen sollte und werde das nun mal austesten.

    Gruß André
    Nun sind nicht mehr die beiden K-Zellen markiert
    Verabschiede dich von Methoden wie Select und Activate.
    Es ist überhaupt nicht nötig, irgendwas zu selektieren oder zu aktivieren, um auf die Daten zuzugreifen.
    Wenn die Spalte C vorher markiert war, ist sie es danach auch. Mein Code jedenfalls markiert nichts.

    Aschrum schrieb:

    IF erstes Zeichen in Range("C16:C*") = i THEN [Addition in K]
    * (letzte) Zelle != kein Inhalt bzw. = letzte Zelle mit Inhalt

    Ansatz:

    Visual Basic-Quellcode

    1. Set ws = wb.Sheets(1) 'setze erst mal eine Variable auf dein Worksheet, so lässt sich leichter adressieren
    2. For Each c in ws.Range(ws.Range("C16", ws.Cells(ws.Rows.Count,3).End(xlup))
    3. If Left(c.Value,1) = "4" Then
    4. MyExcelCalculatedSum = xl.WorksheetFunction.Sum(ws.Range("K16:K17"))
    5. ElseIf Left(c.Value,1) = "5" Then
    6. MyExcelCalculatedSum = xl.WorksheetFunction.Sum(ws.Range("K13:K14"))
    7. Else
    8. ' was auch immer
    9. Endif
    10. Next
    Die Logik wann du was machst, musst du selbst herausfinden. Das sind fachliche Vorgaben, die dir keiner abnimmt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,

    ich schrieb ja bereits, dass ich an dem nächsten Schritt noch nicht dran war und somit war alles dazu sozusagen laut vor mich hin schreiben. ;)

    Danke für deine Hilfestellung. Ich werde dann mal gucken, was ich daraus zaubern kann. :)

    For Each c in ws.Range(ws.Range("C16", ws.Cells(ws.Rows.Count,3).End(xlup))




    Kann man an der fetten Stelle nicht direkt C statt 3 schreiben? Bringt deine Schreibweise einen Vorteil? Auf jeden Fall super, dass es für das Auffinden vom "Ende" bzw. der ersten befüllten Zelle und das Auslesen der linksten Stelle(n) jeweils eine Funktion in VB gibt. :)

    Mein erstes Problem dabei ist nun die einzelnen Summen in den Body zu übergeben, da man im Body nicht sowas wie IF einbauen kann, aber das ließe sich ja dadurch lösen, einfach mehrere "sum" zu deklarieren. Das größere Problem ist, wie ich den Bezug von z.B. Left(c.Value,1) = "4" zu den zugehörigen K schreiben kann. Dazu habe ich bisher noch nichts brauchbares rausfinden können, aber vielleicht wird das ja noch.

    Gruß André

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Aschrum“ ()

    Mein erstes Problem dabei ist nun die einzelnen Summen in den Body zu übergeben, da man im Body nicht sowas wie IF einbauen kann, aber das ließe sich ja dadurch lösen, einfach mehrere "sum" zu deklarieren.
    Problem dabei ist, dass For Each scheinbar nur ein mal durchläuft. Jedenfalls werden dabei für die ganzen mysums unter ElseIf keine Werte berechnet.

    Quellcode

    1. For Each c In ws.Range("C16", ws.Cells(ws.Rows.Count, 3).End(xlup))
    2. If Left(c.Value, 1) = "1" Then
    3. mysum1 = xl.WorksheetFunction.sum(ws.Range("K16:K18"))
    4. ElseIf Left(c.Value, 1) = "2" Then
    5. mysum2 = xl.WorksheetFunction.sum(ws.Range("K19:K24"))
    6. ElseIf Left(c.Value, 1) = "3" Then
    7. mysum3 = xl.WorksheetFunction.sum(ws.Range("K25:K27"))
    8. ElseIf Left(c.Value, 1) = "4" Or "5" Then
    9. mysum45 = xl.WorksheetFunction.sum(ws.Range("K28:K34"))
    10. ElseIf Left(c.Value, 1) = "6" Or "7" Then
    11. mysum67 = xl.WorksheetFunction.sum(ws.Range("K35:K42"))
    12. ElseIf Left(c.Value, 1) = "8" Or "9" Then
    13. mysum89 = xl.WorksheetFunction.sum(ws.Range("K43:K44"))
    14. End If
    15. Next c 'Ob nur Next oder Next c macht keinen Unterschied. So oder so scheint die Schleife nur ein mal zu laufen.

    Das größere Problem ist, wie ich den Bezug von z.B. Left(c.Value,1) = "4" zu den zugehörigen K schreiben kann. Dazu habe ich bisher noch nichts brauchbares rausfinden können, aber vielleicht wird das ja noch.
    Hat jemand dazu eine Idee?

    Aschrum schrieb:

    Problem dabei ist, dass For Each scheinbar nur ein mal durchläuft.
    Was heisst scheinbar?
    Hast du das im Debugger beobachtet oder worauf beruht diese Erkenntnis.

    Du kannst ja mal im Direktfenster ?ws.Range("C16", ws.Cells(ws.Rows.Count, 3).End(xlup).Address eingeben, dann siehst du, was er durchlaufen sollte.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --