Lista maili w Excelu

Pytania, problemy, uwagi związane ze starszymi wersjami Microsoft Outlook 2003, 2002 (XP), 2000, 98

Moderator: Moderatorzy

Lista maili w Excelu

Postprzez maika3 » Śr 28.11.2018 11:21

Witam,

Połączyłam wskazówki z kilku postów na forum i napisałam makro które robi listę plików do Excela gdy nadejdzie nowy mail. - błędu nie ma maile się zapisują ale
ale nie mam pojęcia czemu
ta komenda
Kod: Zaznacz cały
 y = .Range("A1").End(xlDown).Row +1

nie chce mi wyszukać poprawnie ostatniej zapisanej komórki
albo pokazuje ostatnią albo 2 gdy używam wyszukiwania z xlUP.

Co jest źle POMOCY :)


Kod: Zaznacz cały
Option Explicit

Public Sub Lista_Maili(MItem As Outlook.MailItem)
'Wlaczyc referencje Microsoft Excel

    Dim ile As Integer, NazwaZal As String, ilezal As Long, x As Integer
    Dim Zakres() As String, i As Integer, NowyText As String
    Dim oMail As Object, y As Long
    Dim xApp As New Excel.Application
    Dim xWorkBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet

   'Set xWorkBook = xApp.Workbooks.Add
   Set xWorkBook = xApp.Workbooks.Open("C:\Temp\ListaMaili.xlsx")
   Set xlSheet = xApp.Sheets("Ark1")

    On Error GoTo blad
    With xlSheet
     y = .Range("A1").End(xlDown).Row
       
            xlSheet.Cells(y, 1).Value = MItem.CreationTime
            xlSheet.Cells(y, 2).Value = MItem.SenderName
            xlSheet.Cells(y, 3).Value = MItem.SenderEmailAddress '.SenderName 'drugi parametr podaje nazwe wyswietlana
            xlSheet.Cells(y, 4).Value = MItem.Subject
            xlSheet.Cells(y, 5).Value = "Faktura"
            ilezal = MItem.Attachments.Count
            .Cells(y, 6).Value = ilezal
           
            With MItem
                If ilezal > 0 Then
                   
                    For ile = 1 To ilezal
                        If ile = 1 Then
                            NazwaZal = .Attachments.Item(ile).FileName & NazwaZal
                        Else
                            NazwaZal = NazwaZal & "; " & .Attachments.Item(ile).FileName
                        End If
                    Next
                Else
                    NazwaZal = ""
                End If
            End With
           
            Zakres = Split(NazwaZal, ";")
               
                For i = LBound(Zakres) To UBound(Zakres)
                    NowyText = Zakres(i)
                    .Cells(y, 7 + i).Value = Trim(NowyText)
                Next
                y = y + 1
End With

koniec:
On Error Resume Next
With xWorkBook
        .Save
        .Close
    End With
    Set xlSheet = Nothing
    Set xWorkBook = Nothing
Exit Sub
blad:
    MsgBox "Blad wykonania procedury ''Zapisz_do_Excela''" & vbCr, _
            vbInformation, "Informacja o bledzie."
Resume koniec

End Sub
maika3
 
Posty: 6
Dołączył(a): Śr 28.11.2018 10:44

Lista maili w Excelu

Postprzez maika3 » Śr 28.11.2018 12:18

Tak mi się jeszcze nasunęło.... czy jak mi przyjdzie kilka maili na raz nie trzeba jakiejś pętli..?
Zastanawiam się bo załączniki zapisują mi się w pętli z przychodzących maili.
poniżej kod
I może tak samo trzeba z listą mail? Ale jak to połączyć nie mam pojęcia.

Po 3h prób poddaje się proszę o wsparcie :)

Kod: Zaznacz cały
Public Sub ZapiszZalacznikDoFolderu(MItem As Outlook.MailItem)
    Dim oAttachment As Outlook.Attachment
    Dim sSaveFolder As String
    sSaveFolder = "C:\Temp\Faktury PDF\"
    For Each oAttachment In MItem.Attachments
        If Right(oAttachment, 3) = "pdf" Then
            oAttachment.SaveAsFile sSaveFolder & oAttachment.DisplayName
        End If
    Next
End Sub
maika3
 
Posty: 6
Dołączył(a): Śr 28.11.2018 10:44

Re: Lista maili w Excelu

Postprzez OShon » Śr 28.11.2018 15:05

Trochę mieszasz z tymi kropkami.
Polecenie With ZmiennaArkusza zapamiętuje obiekt (ten arkusz w tym przypadku) aby można było uprościć kod i następnie stosować kropkę jako odniesienie do parametrów tego obiektu.
I tak można by napisać
Kod: Zaznacz cały
xlSheet.Cells(y, 1).Value = MItem.CreationTime

a mozna też
Kod: Zaznacz cały
With xlSheet
   .Cells(y, 1).Value = MItem.CreationTime
And with

U ciebie jest bałagan, choć to nie problem.

Poza tym robisz dziwną rzecz z załącznikami. Załączniki to kolekcja czyli można wykonać pętle po nich a nie łączyć stringa aby potem go ciąć na kawałki w tablicy i wyznaczać jej granice.
Czyli nie jakieś
ilezal = MItem.Attachments.Count
.Cells(y, 6).Value = ilezal
..
For ile = 1 To ilezal
..
Zakres = Split(NazwaZal, ";")
..

itd tylko
Kod: Zaznacz cały
Dim ath as Attachment
i = 0
for each ath in MItem.Attachments
  .Cells(y, 7 + i).Value  = ath.Filename
 i = i +1
next

Wyznaczenie ostatniego dla Y powinno działać, ale lepiej nie od góry ale od dołu:
Kod: Zaznacz cały
With xlSheet
     y = .cells(rows.count, "a").End(xlup).Row +1
...
end with
Obrazek
Oskar Shon - MVP Office System/Development 11/19, 3x MCC
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 9677
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Re: Lista maili w Excelu

Postprzez maika3 » Śr 28.11.2018 20:41

Dziękuję Oshon faktycznie zamotałam z tymi załącznikami ale nie nie umialm inaczej wspomniałeś w którymś z postów że najlepiej do stringa załadować więc pokombinowałam :) To moje pierwsze kody w Outlook
nie znam komend :/
a co do "y" w pracy mi nie działało a w domu jakoś chwyciło.... czemu nie mam pojęcia

pytanie w tym twoim kodzie przed rows nie powinno być kropki?

Kod: Zaznacz cały
With xlSheet
     y = .cells(rows.count, "a").End(xlup).Row +1
...
end with


Fakt w kodzie bałagan był bo kombinowałam..

Poprawiałam wg wskazówek
Tylko sobie pomyślałam że ta lista będzie mi się robiła do pliku który czasem jest otwarty a czasem zamknięty - w innych arkuszach będę mieć inne rzeczy

Kroki:
1. Przychodzi mail reguła uruchamia makro i sobie sprawdza czy plik excel otwarty czy zamknięty
2. Jeśli zamknęty to otwiera zapisuje i zamyka a gdy otwarty to tylko zapisuje i NIE zamyka

Mam takie procedury z Excela ale coś mi tu nie działa jakby nie wchodzi mi w funkcję przeszukiwania arkuszy...hmm może w Outlook sie tak nie robi....

Oshon pomożesz?
I pytanie czy jak przyjdzie więcej maili to to rozwiązanie będzie działać? kumulacja może być np. po weekendzie.

Kod: Zaznacz cały
Option Explicit
Public mypath As String

Public xApp As New Excel.Application
Public xWorkBook As Excel.Workbook
Public xlSheet As Excel.Worksheet
Public Const wbLista As String = "bbb.xlsx"

Function IsWorkbookOpen(ByVal wbName As String) As Boolean
    Dim wb As Excel.Workbook
   
    IsWorkbookOpen = False
    For Each wb In Excel.Workbooks
        If wb.Name = wbName Then
            IsWorkbookOpen = True
            Exit For
        End If
    Next
End Function

Sub OpenPlik(nazwa As String)

mypath = "c:\Temp\"

If Not IsWorkbookOpen(nazwa) Then
    Select Case nazwa
        Case wbLista: Set xWorkBook = xApp.Workbooks.Open(mypath & wbLista)
    End Select
Else
    Select Case nazwa
        Case wbLista: Set xWorkBook = xApp.Workbooks(wbLista)
    End Select
End If

End Sub

Public Sub Lista_Maili(MItem As Outlook.MailItem)
Dim y As Long, i As Integer
Dim ath As Attachment

Call OpenPlik(wbLista)

Set xlSheet = xWorkBook.Sheets("Ark1")
On Error GoTo blad

With xlSheet

    y = .Cells(Rows.Count, "A").End(xlUp).Row + 1

    .Cells(y, 1).Value = MItem.CreationTime
    .Cells(y, 2).Value = MItem.SenderName
    .Cells(y, 3).Value = MItem.SenderEmailAddress '.SenderName 'drugi parametr podaje nazwe wyswietlana
    .Cells(y, 4).Value = MItem.Subject
    .Cells(y, 5).Value = "Faktura"
    .Cells(y, 6).Value = MItem.Attachments.Count
    i = 0
    For Each ath In MItem.Attachments
        .Cells(y, 7 + i).Value = ath.FileName
    i = i + 1
    Next
End With


koniec:
On Error Resume Next
xWorkBook.Close SaveChanges:=True

Set xlSheet = Nothing
Set xWorkBook = Nothing
Exit Sub

blad:
    MsgBox "Blad" & vbCr, vbInformation, "Informacja o bledzie."
Resume koniec

End Sub
maika3
 
Posty: 6
Dołączył(a): Śr 28.11.2018 10:44

Re: Lista maili w Excelu

Postprzez OShon » Śr 28.11.2018 21:43

Święta idą książka potrzebna. Akurat na Mikołaja jakaś by się przydała.
Do Outlooka nie znajdziesz bo poprostu ich nie ma ale do excela owszem. Budowa obiektowa inna, ale zasady takie same bo składania VBA identyczna.
Namawiam

Główną twoją procedura jest: Lista_Maili(MItem As Outlook.MailItem)
Parametrem wejściowym jest MItem który reprezentuje pocztę przychodzącą. A przychodzą one pojedynczo (nie na raz), tzn jeden po drugim, a więc podłączając tą procedurę pod reguły każda będzie przetwarzana i zapisywana w Excelu.

Z czym masz konkretnie problem, bo nie mam czasu zbytnio całości dla ciebie przerabiać, a i tak się nauczysz więcej jak będę podawał wskazówki niż gotowca.
Obrazek
Oskar Shon - MVP Office System/Development 11/19, 3x MCC
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 9677
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Re: Lista maili w Excelu

Postprzez maika3 » Śr 28.11.2018 22:42

Książek plików mam już trochę cigle się uczę:) a takie przykłady śa najelepsze do nauki

Powtorzę
Kroki:
1. Przychodzi mail reguła uruchamia makro i sobie sprawdza czy plik excel otwarty czy zamknięty
2. Jeśli zamknęty to otwiera zapisuje i zamyka a gdy otwarty to tylko zapisuje i NIE zamyka

Co mi nie działa
Jak wchodzi do funkcji poniżej to wydaje mi się że tu coś jest żle bo
dochodzi do tej linijki

Kod: Zaznacz cały
IsWorkbookOpen = False

i idzie na koniec....
wogole czy tak się sprawdza czy plik excela jest otwarty? jak nie tak to jak to sie robi?

Kod: Zaznacz cały
Function IsWorkbookOpen(ByVal wbName As String) As Boolean
    Dim wb As Excel.Workbook
   
    IsWorkbookOpen = False
    For Each wb In Excel.Workbooks
        If wb.Name = wbName Then
            IsWorkbookOpen = True
            Exit For
        End If
    Next
End Function
maika3
 
Posty: 6
Dołączył(a): Śr 28.11.2018 10:44

Re: Lista maili w Excelu

Postprzez OShon » Cz 29.11.2018 13:24

OK twoja funkcja sprawdza czy jest otwarty i nic więcej podając status.
Nie przypisuje do zmiennej tego pliku w danej instancji, nie otwiera też skoroszytu przypisując go do zmiennej jako nowo otwarty.
Zauważ że funkcja ma parametr wyjściowy Boolean czyli w odpowiedzi dostajesz Tak/Nie nic więcej, a tobie przydałaby się raczej właściwość:
Otwórz i przypisz do zmiennej, jeśli już mam otwarty poszukaj w aktywnej instancji i też przypisz do zmiennej*, ponieważ potem używasz tej zmiennej aby określić arkusz a potem komórki do których dane mają trafiać.
Jeśli nie będzie w twojej instancji to znaczy że ktoś inny ma otwarty ten plik i faktycznie należy reszty nie realizować.

Czy już go masz otwartego to wystarczy przypisać do obiektu typu workbook po nazwie skoroszytu (czyli nie .open)
Kod: Zaznacz cały
on error resume next
set xWorkBook = xApp.Workbooks(wbLista)
if xWorkBook is nothing then
   msgbox("nie masz otwartego tego pliku " & wbLista & " więc open")
   set xWorkBook = xApp.Workbooks.Open(mypath & wbLista)
   if xWorkBook is nothing then msgbox("ktoś trzyma ten plik i nie da sie otworzyć")
end if
on error goto 0

Sprawdź tą myśl...
Obrazek
Oskar Shon - MVP Office System/Development 11/19, 3x MCC
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 9677
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Re: Lista maili w Excelu

Postprzez maika3 » Cz 29.11.2018 23:51

Dzięki za wskazówki

Niby mi działa...

ale mam jeszcze pytanie
czy muszę miec ten kod? sama sobie to wymysliam bo bez niego raz mi działało a raz nie a jak to wstawilam to nie wyrzucało błędu....

Kod: Zaznacz cały
Set xApp = Excel.Application


a do czego ma służyć ta linijka
Kod: Zaznacz cały
if xWorkBook is nothing then msgbox("ktoś trzyma ten plik i nie da sie otworzyć")

potrzebne mi to?

i nie wiem czemu jesli plik jest otwarty to przy zapisywnaiu wyskakuje mi zapisz jako a stoi zapisz
Kod: Zaznacz cały
 xWorkBook.Save


Kod całej procedury czy jest ok? Sprawdź proszę
Kod: Zaznacz cały
Option Explicit

Public xApp As Excel.Application
Public mypath As String

Sub Sprawdz(MItem As Outlook.MailItem)
Dim y As Long, i As Integer
Dim ath As Attachment
Dim xWorkBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim wbLista As String
Dim otw As Boolean

mypath = "C:\Temp\"
wbLista = "bbb.xlsx"


Set xApp = Excel.Application

On Error Resume Next
    Set xWorkBook = xApp.Workbooks(wbLista)
    'xApp.Visible = True
    otw = True

If xWorkBook Is Nothing Then
    'xApp.Visible = True
    Set xWorkBook = xApp.Workbooks.Open(mypath & wbLista)
    otw = False
End If
On Error GoTo 0

Set xlSheet = xWorkBook.Sheets("Ark1")
On Error GoTo blad

With xlSheet

    y = .Cells(.Rows.Count, "A").End(xlUp).Row + 1

    .Cells(y, 1).Value = MItem.CreationTime
    .Cells(y, 2).Value = MItem.SenderName
    .Cells(y, 3).Value = MItem.SenderEmailAddress '.SenderName 'drugi parametr podaje nazwe wyswietlana
    .Cells(y, 4).Value = MItem.Subject
    .Cells(y, 5).Value = "Faktura"
    .Cells(y, 6).Value = MItem.Attachments.Count
    i = 0
    For Each ath In MItem.Attachments
        .Cells(y, 7 + i).Value = ath.FileName
    i = i + 1
    Next
End With


koniec:
On Error Resume Next
If otw = True Then
    xWorkBook.Save
Else
    xWorkBook.Close savechanges:=True
    xApp.Quit
End If

Set xlSheet = Nothing
Set xWorkBook = Nothing
Set xApp = Nothing

Exit Sub

blad:
    MsgBox "Blad" & vbCr, vbInformation, "Informacja o bledzie."
Resume koniec

End Sub



maika3
 
Posty: 6
Dołączył(a): Śr 28.11.2018 10:44

Re: Lista maili w Excelu

Postprzez OShon » Pt 30.11.2018 09:30

maika3 napisał(a):Niby mi działa...

Albo działa albo nie i trzeba poprawić. Nie znam określenia "Niby działa" :D

maika3 napisał(a):czy muszę miec ten kod? sama sobie to wymysliam bo bez niego raz mi działało a raz nie a jak to wstawilam to nie wyrzucało błędu....
Kod: Zaznacz cały
Set xApp = Excel.Application

Przeczytaj sobie o późnym i wczesnym wiązaniu. Zobacz dlaczego go stosujemy.
Kod wstawiasz do Outlooka, a więc nie do excela, to też Outlook musi mieć przypisany obiekt, do którego się odwołujesz.
Sam Outlook nie będzie wiedział co to Range czy Cells

maika3 napisał(a):a do czego ma służyć ta linijka
Kod: Zaznacz cały
if xWorkBook is nothing then msgbox("ktoś trzyma ten plik i nie da sie otworzyć")

potrzebne mi to?
Raczej tak, choc sam komentarz nie jest wymagany, to warunek tak.
Jeśli plik docelowy będzie otwarty, ale nie przez ciebie, a przez kogoś innego w tym czasie realizacji kodu, to co chcesz aby było zrobione?
Z pewnością nie da się wejść do kompa tej osobie i uzupełnić plik. Oczywiście jeśli mówimy o ścieżce lokalnej i pracy jednostanowiskowej to nie ma to sensu, bo nigdy nie nastąpi.

maika3 napisał(a):i nie wiem czemu jesli plik jest otwarty to przy zapisywnaiu wyskakuje mi zapisz jako a stoi zapisz
Kod: Zaznacz cały
 xWorkBook.Save
No polecenie zapisu najlepiej użyć po uzupełnieniu pliku, ponieważ jeśli będziesz chciała z niego wyjść to będzie krzyczał o tym że zmiany zostały dokonane i wyjście będzie groziło utratą wprowadzonych danych. Używasz jednak wyjścia z zapisem więc ... pewnie nie jest potrzebne.

maika3 napisał(a):Kod całej procedury czy jest ok?
Uczymy się, a więc nie będę sprawdzał całość twojej pracy, ale zwracał tylko uwagę na twoje wątpliwości.
Niemniej jednak wydaje się już całkiem w porządku. Nie wiem tylko po co te zmienne globalne (czy używasz je poza tą procedurą i potrzebny co do nich dostęp?)
Obrazek
Oskar Shon - MVP Office System/Development 11/19, 3x MCC
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 9677
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Re: Lista maili w Excelu

Postprzez maika3 » Pn 10.12.2018 10:30

Dziękuje Oshon

miałam chwilę przerwy ale wróciłam do problemu i mam jeszcze jeden....Jak plik jest zamknęty to nie mam błędu ale jak mam otwarty to nie da się....patrzę, zmieniam, czytam kombinuje i nie wiem
Tu wyskakuje mi blad...nie znajduje mi ze ten mój plik jest otwarty dlaczego? powinnam coś jeszcze dodać? Pomóż mi proszę :)
Kod: Zaznacz cały
Set xWorkBook = xApp.Workbooks(wbLista)


No no i jeszcze te zmienne publicze zamieniłam na jak poniżej jest ok?

Kod: Zaznacz cały
Option Explicit

Sub Sprawdz(MItem As Outlook.MailItem)
Dim xApp As Excel.Application
Dim mypath As String
Dim y As Long, i As Integer
Dim ath As Attachment
Dim xWorkBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim wbLista As String
Dim otw As Boolean

mypath = "C:\Temp\"
wbLista = "bbb.xlsx"

Set xApp = Excel.Application

On Error Resume Next
    Set xWorkBook = xApp.Workbooks(wbLista)
    'xApp.Visible = True
    otw = True
maika3
 
Posty: 6
Dołączył(a): Śr 28.11.2018 10:44

Re: Lista maili w Excelu

Postprzez OShon » Pn 10.12.2018 17:39

Rozpracuj to na podstawie mojej odpowiedzi na tym forum instancje excela/accessa i może czytaj od dołu bo też tam na jakiś ciężki materiał trafiłem, a u ciebie widać (co mnie bardzo smuci) jak i u wszystkich kawa na ławę.

Oczywiście powtarzam (otwarty na innym kompie nie zadziała).
Obrazek
Oskar Shon - MVP Office System/Development 11/19, 3x MCC
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 9677
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl


Powrót do Microsoft Outlook

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 2 gości