Lỗi vòng lặp khi gửi email trong Excel 2013 VBA.

Chào cộng đồng!

Sau khi nâng cấp lên Office365, macro đính kèm không còn hoạt động nữa. Khi đến đoạn mã: "Set olNewMail = CreateItem(olMailItem)"

Nó dừng lại gần 60 giây trước khi tiếp tục, nhưng không có thư nào được gửi đi.

Bạn có ý tưởng hay nào không?

Cảm ơn trước!

Trân trọng, Kim Koch

Sub SendEmail()

Trang tính ("Bảng"). Chọn

Khi xảy ra lỗi, tiếp tục. Tiếp theo.

Dim olApp As Outlook.Application

Dim olNewMail As Object

Dim Recep As String

Dim MsgTxt As String

Dim Attchedfile As String

Dim Sti As String

Dim Varnavn As String

Dim Vedhaeft As String

Dim antallinier As String

Sti = "" & Sti1 & ""

Filende = ".xls"

' Finder antal linier som skal tælles

Dim sidstekolonne As String

Phạm vi ("C1"). Chọn

Selection.End(xlDown).Select

sidstecelle = ActiveCell.Address

antallinier = ActiveCell.Row

' **** Findel antal linier som skal talles

Set olApp = GetObject("Outlook.Application")

Với I = 1 Đến "" & antallinier & ""

Vedhaeft = Sti & Range("F" & I).Value

Recep = Range("C" & I).Value

Varnavn = "PDA-" & Range("E" & I).Value

Attchedfile = Vedhaeft

MsgTxt = "Kære PDA modtager" & vbCr

Đặt olNewMail = CreateItem(olMailItem)

Với olNewMail

.Recipients.Add Recep

.Body = MsgTxt

.Chủ đề = Varnavn

.Tệp đính kèm.Thêm tệp đính kèm

.ReadReceiptRequested = False

.OriginatorDeliveryReportRequested = False

.Cứu

.Gửi

Kết thúc bằng

Tiếp theo tôi

End Sub




Trả lời:

Chào Rich và Graham

Thêm "," vào Set olApp = GetObject(, "Outlook.Application") và thay đổi

Đặt olNewMail = CreateItem(olMailItem) thành Đặt olNewMail = CreateItem(0) đã thực hiện được công việc.

Cảm ơn sự tham gia của bạn.

Trân trọng, Kim



Trả lời:

Chào Rich,

Outlook 2013 (Office365)

Trân trọng, Kim

Không, không phải kiểu "bạn đang dùng phiên bản Outlook nào", ý tôi là BẠN ĐÃ KHỞI ĐỘNG OUTLOOK TRƯỚC KHI CHẠY MÃ CỦA MÌNH CHƯA???

Trong đoạn mã của bạn, bạn đã sử dụng GetObject để lấy một thể hiện hiện có của ứng dụng Outlook. Nếu Outlook không chạy thì thao tác đó sẽ thất bại.

Đối với hầu hết các ứng dụng, bạn có thể làm điều này, ví dụ như với Word:

Sub CreateWordApplication()

Dim bWeStartedWord As Boolean
Dim wdApp As Object 'Nếu sử dụng Late Binding
' Dim wdApp As Word.Application 'Nếu sử dụng Early Binding và đã thiết lập tham chiếu đến
'Thư viện đối tượng Microsoft Word thông qua VBE > Công cụ > Tham chiếu...'

Khi xảy ra lỗi, tiếp tục. Tiếp theo.
Set wdApp = GetObject(, "Word.Application")
Khi xảy ra lỗi, chuyển về 0.
Nếu wdApp là Nothing thì
Đặt wdApp = CreateObject("Word.Application")
bWeStartedWord = True
Kết thúc nếu

'Nếu bạn muốn hiển thị Word:
wdApp.Visible = True

'Hãy làm việc với Word ở đây...'


'Dọn dẹp:
Nếu bWeStartedWord thì wdApp.Quit
Đặt wdApp = Nothing
End Sub

Lưu ý cách thực hiện:

1) Chúng tôi vô hiệu hóa chức năng xử lý lỗi

2) Chúng ta cố gắng lấy một thể hiện hiện có của Word bằng cách sử dụng GetObject.

3) Chúng tôi kiểm tra xem wdApp có phải là Nothing hay không.

4) Nếu không có gì, chúng ta sử dụng CreateObject để khởi động Word.

5) Chúng ta có thể sử dụng wdApp.Visible để hiển thị ứng dụng cho người dùng.

6) Chúng ta ghi chú lại rằng chúng ta đã bắt đầu sử dụng Word.

7) Khi kết thúc macro, nếu chúng ta đã khởi động Word, chúng ta sẽ thoát khỏi nó.

8) Hãy đảm bảo bạn đặt đối tượng ứng dụng thành = Nothing ở cuối.

Tuy nhiên, với Outlook thì mọi chuyện không đơn giản như vậy, bạn không thể sử dụng olApp.Visible. Thay vào đó, bạn có thể làm như sau:

Sub CreateOutlookApplication()
Dim bWeStartedOutlook As Boolean
Dim olApp As Object 'Nếu sử dụng Late Binding
' Dim olApp As Word.Application 'Nếu sử dụng Early Binding và đã thiết lập tham chiếu đến
'Thư viện đối tượng Microsoft Outlook thông qua VBE > Công cụ > Tham chiếu...'

Khi xảy ra lỗi, tiếp tục.
Set olApp = GetObject(, "Outlook.Application")
Khi xảy ra lỗi, chuyển về 0.
Nếu olApp là Nothing thì
Set olApp = CreateObject("Outlook.Application")
bWeStartedOutlook = True
Kết thúc nếu

'Nếu bạn muốn hiển thị Outlook:
olApp.Session.GetDefaultFolder(6).Display '6=olFolderInbox

'Thực hiện các thao tác với Outlook tại đây...'

'Dọn dẹp:
Nếu bWeStartedOutlook thì olApp.Quit
Đặt olApp = Nothing
End Sub

Nhưng hãy cẩn thận, với Outlook, điều quan trọng là phải cho nó thời gian để kết nối với máy chủ và gửi bất kỳ tin nhắn nào trước khi đóng. Có lẽ tốt hơn là nên để nó mở, trong trường hợp đó bạn thực sự nên để nó hiển thị (nếu không thì cách duy nhất để tắt nó là thông qua trình quản lý tác vụ, tab Quy trình).

Nhưng như tôi đã nói ở trên, để kiểm tra xem đoạn mã tôi đã cung cấp trước đó có hoạt động tốt hay không, trước tiên hãy mở Outlook, sau đó chạy đoạn mã đó trong Excel.

Hi vọng điều đó hữu ích.

Chúc mừng!
Giàu có

Comments

Popular posts from this blog

Xử lý hàng loạt các tệp Excel được bảo vệ bằng mật khẩu

Thu hẹp và mở rộng cột trong Excel

Excel: Tìm và trả về "số cuối cùng" trong một cột, trong đó cột chứa: cả ô trống và số dương tùy ý (lớn hơn 0).