Хухло,
Я использовал код, аналогичный обсуждаемому здесь. Он был очень надежен во многих операционных системах и версиях Office / Excel. Он также надежно работал в разных странах с разными интернет-подключениями и поставщиками. Во время недавней поездки на Мальту он не работал на двух разных компьютерах, которые у меня были с разными системами и версиями Office / Excel. Я пробовал разные интернет-соединения и разных провайдеров, но безуспешно.
Я вылечил проблему, поэтому делюсь решением на случай, если оно может помочь любому, кто будет проходить здесь в будущем.
Вкратце, решение заключалось в том, чтобы изменить smptserverport") = 25
на smptserverport") = 465
(я мимоходом отмечу, что в предыдущих моих аналогичных кодировках (используя в качестве поставщика отправки мой адрес электронной почты gmail.com, а также мой немецкий Telekom, t-online.de, электронная почта адрес), что кодировка работает либо с 25, либо с 465. (я использовал 25 вместо 465, просто потому, что я видел, что это используется чаще в аналогичных кодировках))
Вот полная имплантация моего раствора, который мне подходит.
Я изменил подпись моей процедуры с этого
Sub PetrasDailyProWay1_COM_Way()
так что теперь он принимает в качестве своего значения номер smptserverport
Sub PetrasDailyProWay1_COM_Way(ByVal SmptySvrPrt)
Любая Call
подпрограммы, которая у меня была, такая как эта Call
строка, которая у меня была
Application.Run Macro:="'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'" & "!ProAktuelleMacrosMtsch.PetrasDailyProWay1_COM_Way"
теперь изменено, чтобы передать значение 25, таким образом:
Application.Run Macro:="'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'" & "!ProAktuelleMacrosMtsch.PetrasDailyProWay1_COM_Way" , arg1:="25"
(В приведенной выше строке кода выполняется процедура Sub PetrasDailyProWay1_COM_Way( )
, которая в моем случае находится в другой книге, чем та, в которой находится строка Call
. (Рабочая книга «NeuProAktuelleMakros.xlsm» автоматически открывается, если она еще не открыта , по этой строке кода))
Теперь я добавил, ближе к концу моей подпрограммы, Sub PetrasDailyProWay1_COM_Way( )
, обработку ошибок, которая планирует повторный запуск этой подпрограммы с использованием 465, если первоначальный запуск с использованием 25 завершился неудачно. (Это конкретное решение имеет дополнительное преимущество, заключающееся в том, что я автоматически получаю вторую попытку в тех случаях, когда в исходной кодировке оно раньше иногда не работало с первой попытки)
Это был мой предыдущий конец моего кодирования:
Rem 3 Do it
.send
MsgBox Prompt:="Done"
End With ' CreateObject("CDO.Message") (Rem 1 Library End =======#
End Sub
Вот теперь измененная версия:
Rem 3 Do it initially attempt with 25 , then in Malta as well maybe with 465
On Error GoTo Malta ' Intended to catch a possible predicted error in the next line when running the routine in Malta, or/ and an error in the second attempt at a code run ' if the next line errors, then I scheduule the routine to run again with "smtpserverport") = 465
.send
On Error GoTo 0
MsgBox Prompt:="Done (with " & SmptySvrPrt & ")" ' This will typically give either "Done (with 25)" or else "Done (with 465)" if the routine worked
End With ' CreateObject("CDO.Message") (Rem 1 Library End =======#
Exit Sub ' Normal routine end for no error exceptional errected situation
Malta: ' Intended to catch a predicted error when running the routine in Malta, or/ and an error in the second attempt at a code run
If SmptySvrPrt = "465" Then MsgBox Prompt:="Also did not work with 465 , Oh Poo!": Exit Sub ' case error with attempt with 465
Application.OnTime Now(), "'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'" & "!'ProAktuelleMacrosMtsch.PetrasDailyProWay1_COM_Way ""465""'"
' On Error GoTo -1: On Error GoTo 0 ' I do not need this as the End Sub will effectively bring down the errection state
End Sub
Синтаксис, который я использую в строке кода Application.OnTime
, было довольно сложно понять. (Это сложнее, чем мне нужно, но я хотел сохранить формат, соответствующий тому, который используется в моих Call
строках кода).
Я не мог понять, как сделать последний бит строки кода Application.OnTime
с аргументом в ( )
скобках. Я также не мог понять, как сделать эту строку кода, используя именованные аргументы, что я лично предпочитаю. Мне удалось сделать это с именованными аргументами, если я вызвал процедуру, которая не принимала аргументов. Но в случае процедуры, принимающей аргументы, как в случае с новым измененным кодом здесь, я не смог найти никакого синтаксиса, который работал бы. Итак, если кто-нибудь может просветить меня о том, как сделать эту строку в рабочем синтаксисе в форме, аналогичной этой псевдо форме (которая не работает), то мне было бы очень интересно.
Application.OnTime EarliestTime:=Now(), Procedure:="'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'" & "!'ProAktuelleMacrosMtsch.PetrasDailyProWay1_COM_Way, arg1:=""465""'"
Использование 465 вместо 25 уже упоминалось ранее, как и использование того или другого. Мне еще предстоит увидеть какое-либо объяснение того, что это за «smptserverport» или другие параметры на самом деле, по крайней мере, в любой понятной мне форме. Если у кого-то есть четкое объяснение, на мой взгляд, это было бы интересным дополнением. (Ссылки на какие-либо существующие объяснения бесполезны для меня, поскольку я думаю, что видел их все.….… Я полагаю, что это может быть одна из тех вещей, которые никто никогда не удосужился четко задокументировать, а тем временем никто не может помните, о чем это все)
ThunkUs: -) Алан
person
Alan Elston
schedule
01.04.2019
.Item("http://schemas.microsoft.com/cdo/configuration/smptserverport") = 25
. smptserverport должен быть smtpserverport - person Slaqr   schedule 29.12.2017On Error GoTo
. - person user7393973   schedule 29.12.2017