Jestem początkujący w Accessie. Kiedyś znalazłem fajny kod dzięki któremu można wysyłać maile bezpośrednioz Accessa. Troszeczkę go zmodyfikowałem, ale nie działa mi poprawnie i nie wiem dlaczego.
cytuję kod:
Private Sub Polecenie5_Click()
Dim oApp As Object
Dim oMail As Object
Dim rcs As DAO.Recordset
Dim strBCC As String
On Error Resume Next
Set oApp = GetObject(, "Outlook.Application")
If Err.Number <> 0 Then Set oApp = CreateObject("Outlook.Application")
oApp.GetNamespace("MAPI").Logon
On Error GoTo 0
If Tekst0 = "mailing12" Then
Set rcs = CurrentDb.OpenRecordset("SELECT Dane.[e-mail] FROM Dane WHERE (((Dane.semestr)=1) AND ((Dane.mailing)=Yes)) OR (((Dane.semestr)=2) AND ((Dane.mailing)=Yes));")
With rcs
Do Until .EOF
strBCC = strBCC & Left(.Fields(0).Value, InStr(1, .Fields(0).Value, "#", vbDatabaseCompare) - 1) & ";"
.MoveNext
Loop
End With
End If
If Tekst0 = "mailing34" Then
Set rcs = CurrentDb.OpenRecordset("SELECT Dane.[e-mail] FROM Dane WHERE (((Dane.semestr)=3) AND ((Dane.mailing)=Yes)) OR (((Dane.semestr)=4) AND ((Dane.mailing)=Yes));")
With rcs
Do Until .EOF
strBCC = strBCC & Left(.Fields(0).Value, InStr(1, .Fields(0).Value, "#", vbDatabaseCompare) - 1) & ";"
.MoveNext
Loop
End With
End If
If Tekst0 = "mailing56" Then
Set rcs = CurrentDb.OpenRecordset("SELECT Dane.[e-mail] FROM Dane WHERE (((Dane.semestr)=5) AND ((Dane.mailing)=Yes)) OR (((Dane.semestr)=6) AND ((Dane.mailing)=Yes));")
With rcs
Do Until .EOF
strBCC = strBCC & Left(.Fields(0).Value, InStr(1, .Fields(0).Value, "#", vbDatabaseCompare) - 1) & ";"
.MoveNext
Loop
End With
End If
'strBCC = Left(strBCC, Len(strBCC) - 1)
Set oMail = oApp.createitem(0)
With oMail
.subject = "Wiadomość"
.BCC = strBCC
.Display
End With
Set oMail = Nothing
End Sub
Jak widać powyżej przyciskami w formularzu wywołuję odpowiednią grupę ludzi, do których chcę napisac maila - mailing12, mailing34 i mailing56. Każda grupa jest wyszukiwana za pomocą SQL z tej samej bazy danych.
Wszystko działa dobrze dla mailing12, lecz niestety dla mailing34 i mailing56 zwraca mi komunikat:
Runtime error 5
Invalid procedure call or argument
i zaznacza mi linię:
strBCC = strBCC & Left(.Fields(0).Value, InStr(1, .Fields(0).Value, "#", vbDatabaseCompare) - 1) & ";"
Kiedy usuwam "-1"
wszystko działa poprawnie. Oczywiście w tym momencie adresy mailowe są dłuższe o znak "#". Mogę dowolnie zwiększyć te wartości dodając np: "+4" znaki i wszystko będzie ok. Jednak nie mogę odjąć tego jednego znaku, bo znów wywala błąd powyżej.
Powtarzam, że dla mailing12 wszystko działa bez zarzutu.
edit: czy możliwe, że skuteczność kodu zależy od ilości rekordów (maili)? kwerenda mailing12 posiada około 20 rekordów i jest najmniej liczna. Pozostałe są o kilka-kilkanaście rekordów liczniejsze.
Zauważyłem jeszcze, że poprzez korektę poprawnie działającego wiersza:
If Tekst0 = "mailing12" Then Set rcs = CurrentDb.OpenRecordset("SELECT Dane.[e-mail] FROM Dane WHERE (((Dane.semestr)=1) AND ((Dane.mailing)=Yes)) OR (((Dane.semestr)=2) AND ((Dane.mailing)=Yes));")
i przydzielenie wartości dane.semestr=3 oraz dane.semestr=4 kod przestaje poprawnie działać...
Gdzie tkwi problem???