Dhn46 muốn hỏi cách để viết code trên Outlock 2010, window 64bit để gán tệp đính kèm với điều kiện file name là unicode.
Hiện dhn46 làm như sau
1. Sử dụng hàm: GetOpenFileName nhánh W
2. Lập code trên Outlock để đính kèm
Mã:
'=====================
'Code Outlock
Sub AttOutLock()
Dim att As String
Dim myItem As Outlook.MailItem, oInspector As Inspector
Dim myAttachments As Outlook.Attachments
Set oInspector = Application.ActiveInspector
Set NewMail = oInspector.CurrentItem
Set myAttachments = NewMail.Attachments
att = BrowseForFile("Select attachment file", "")
myAttachments.Add att
End Sub
Nhưng hiện giờ chưa hoạt động như ý.
Test trên Excel để lấy file name thì hàm vẫn chạy ổn, nhưng Outlock vẫn báo lỗi.
Vậy nhờ các anh chị hướng dẫn xem code sai tại đâu? Nguyên nhân và cách khắc phục.
Dhn46 đính kèm file Excel trong đó có code API, code trên outlock và code test trên Excel để anh chị dễ hình dung.
Dhn46 muốn hỏi cách để viết code trên Outlock 2010, window 64bit để gán tệp đính kèm với điều kiện file name là unicode.
Hiện dhn46 làm như sau
1. Sử dụng hàm: GetOpenFileName nhánh W
2. Lập code trên Outlock để đính kèm
Mã:
'=====================
'Code Outlock
Sub AttOutLock()
Dim att As String
Dim myItem As Outlook.MailItem, oInspector As Inspector
Dim myAttachments As Outlook.Attachments
Set oInspector = Application.ActiveInspector
Set NewMail = oInspector.CurrentItem
Set myAttachments = NewMail.Attachments
att = BrowseForFile("Select attachment file", "")
myAttachments.Add att
End Sub
Nhưng hiện giờ chưa hoạt động như ý.
Test trên Excel để lấy file name thì hàm vẫn chạy ổn, nhưng Outlock vẫn báo lỗi.
Vậy nhờ các anh chị hướng dẫn xem code sai tại đâu? Nguyên nhân và cách khắc phục.
Dhn46 đính kèm file Excel trong đó có code API, code trên outlock và code test trên Excel để anh chị dễ hình dung.
Sub AddAttachment()
Set myOlApp = CreateObject("Outlook.Application")
Set myItem = myOlApp.CreateItem(olMailItem)
Set myAtt = myItem.Attachments
Dim att As String
att = BrowseForFile("Select attachment file", "")
myAtt.Add att
myItem.Display
End Sub
Dhn46 muốn hỏi cách để viết code trên Outlock 2010, window 64bit để gán tệp đính kèm với điều kiện file name là unicode.
Hiện dhn46 làm như sau
1. Sử dụng hàm: GetOpenFileName nhánh W
2. Lập code trên Outlock để đính kèm
Mã:
'=====================
'Code Outlock
Sub AttOutLock()
Dim att As String
Dim myItem As Outlook.MailItem, oInspector As Inspector
Dim myAttachments As Outlook.Attachments
Set oInspector = Application.ActiveInspector
Set NewMail = oInspector.CurrentItem
Set myAttachments = NewMail.Attachments
att = BrowseForFile("Select attachment file", "")
myAttachments.Add att
End Sub
Nhưng hiện giờ chưa hoạt động như ý.
Test trên Excel để lấy file name thì hàm vẫn chạy ổn, nhưng Outlock vẫn báo lỗi.
Vậy nhờ các anh chị hướng dẫn xem code sai tại đâu? Nguyên nhân và cách khắc phục.
Dhn46 đính kèm file Excel trong đó có code API, code trên outlock và code test trên Excel để anh chị dễ hình dung.
Tôi không có Office 64 bit để nghiên cứu nên không biết tí gì. Thậm chí không cài Outlokk vì chả dùng tới bao giờ. Nhưng tôi có câu hỏi.
1. Trong Outlokk không có hàm để chọn tập tin à mà phải dùng API? Kiểu như GetOpenFilename bên Excel ấy.
2. Ninh nói là tên tập tin hiển thị chuẩn trong cell của Excel. Nhưng bên Outlook thì báo lỗi. Vậy thì Ninh đã thay vì thêm tập tin đính kèm thì nhập đường dẫn vào nội dung email chưa? Nếu đã thì trong nội dung đường dẫn hiển thị chuẩn không?
Hay là mò như sau. Mò thôi vì không biết tại sao báo lỗi.
Tôi không có Office 64 bit để nghiên cứu nên không biết tí gì. Thậm chí không cài Outlokk vì chả dùng tới bao giờ. Nhưng tôi có câu hỏi.
1. Trong Outlokk không có hàm để chọn tập tin à mà phải dùng API? Kiểu như GetOpenFilename bên Excel ấy.
2. Ninh nói là tên tập tin hiển thị chuẩn trong cell của Excel. Nhưng bên Outlook thì báo lỗi. Vậy thì Ninh đã thay vì thêm tập tin đính kèm thì nhập đường dẫn vào nội dung email chưa? Nếu đã thì trong nội dung đường dẫn hiển thị chuẩn không?
Hay là mò như sau. Mò thôi vì không biết tại sao báo lỗi.
Hiện máy tính dhn46 đang test là máy tính cloud, toàn bộ phần hộp thoại đính kèm của Outlock, hộp thoại Save của Office đang bị thay thế bởi 1 tiến trình khác. Có thể do tiến trình này mà dẫn đến lỗi khi sử dụng cách dhn46 đã post.
Khi kiểm tra với gợi ý của bác thì như sau:
Tên file không dấu đối với *.txt, *.pdf -> được
Tên file có dấu -> không được với tất cả các định dạng.
dhn46 đang tìm cách để thêm attachment trong outlock để vượt qua phần mềm chạy ngầm kia. (Phần này không được phép gỡ)
Vậy có định hướng gì cho trường hợp của dhn46 mong bác và các anh chị chỉ dẫn.
Tôi không biết nguyên nhân là gì nhưng nếu đường dẫn không dấu không phát sinh lỗi thì như tôi đã nói thì tôi sẽ thử mò với GetShortPathNameW hoặc ShortPath. Với GetShortPathNameW thì sau khi có giá trị trả về bởi GetShortPathNameW tôi sẽ cắt vừa đủ độ dài. Để xác định độ dài thì có thể dò bai 0 (bai 0 là Windows dùng để "thông báo" là chuỗi đã kết thúc) nó ở vị trí nào. Cũng có thể dùng API lstrlen. Do cái này hơi mệt nên trước tiên Ninh thử xem với ShortPath thì thế nào.
-------------------
Nhưng cũng có thể chả cần cắt đâu.
Mã:
#If VBA7 Then
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#Else
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#End If
Function ShortFileName(ByVal LongFileName As String) As String
Dim buffer As String, size As Long
buffer = String(1, Chr(0))
size = GetShortPathName(StrPtr(LongFileName), StrPtr(buffer), 1)
If size = 0 Then Exit Function
buffer = String(size, Chr(0))
size = GetShortPathName(StrPtr(LongFileName), StrPtr(buffer), size)
ShortFileName = Mid(buffer, 1, size)
End Function
A mà code của Ninh có chỗ sai. Ninh thử đặt tập tin thật sâu, tức trong nhiều thư mục con và mỗi thư mục có tên dài, sau đó chạy code và chọn tập tin đó thì BrowseForFile sẽ trả về chuỗi rỗng. Nguyên nhân?
nMaxFile
Specifies the size, in bytes (ANSI version) or characters (Unicode version), of the buffer pointed to by lpstrFile. The GetOpenFileName and GetSaveFileName functions return FALSE if the buffer is too small to contain the file information. The buffer should be at least 256 characters long.
1/ Kiểm tra với Strfile = String(10001,0) -> Vẫn lỗi tương tự.
2/ Kiểm tra theo gợi ý bài #8
Mã:
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As LongPtr, ByVal lpszShortPath As LongPtr, ByVal cchBuffer As LongPtr) As Long
Sub Test()
Dim buffer As String, size As Long
LongFileName ="C:\1.txt"
buffer = String(1, Chr(0))
size = GetShortPathName(StrPtr(LongFileName), StrPtr(buffer), 1)
If size = 0 Then Msgbox 1
buffer = String(size, Chr(0))
size = GetShortPathName(StrPtr(LongFileName), StrPtr(buffer), size)
ShortFileName = Mid(buffer, 1, size)
End Function
-> Hiện thông báo 1. Dhn46 chưa biết hướng tiếp theo sẽ đi theo hướng nào. dhn46 nhờ bác tư vấn thêm phương hướng.
1/ Kiểm tra với Strfile = String(10001,0) -> Vẫn lỗi tương tự.
2/ Kiểm tra theo gợi ý bài #8
Mã:
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As LongPtr, ByVal lpszShortPath As LongPtr, ByVal cchBuffer As LongPtr) As Long
Sub Test()
Dim buffer As String, size As Long
LongFileName ="C:\1.txt"
buffer = String(1, Chr(0))
size = GetShortPathName(StrPtr(LongFileName), StrPtr(buffer), 1)
If size = 0 Then Msgbox 1
buffer = String(size, Chr(0))
size = GetShortPathName(StrPtr(LongFileName), StrPtr(buffer), size)
ShortFileName = Mid(buffer, 1, size)
End Function
-> Hiện thông báo 1. Dhn46 chưa biết hướng tiếp theo sẽ đi theo hướng nào. dhn46 nhờ bác tư vấn thêm phương hướng.
1. À mà Ninh luôn chọn 1 tập tin? Vì nếu chọn > 1 tập tin thì phải lọc từng đường dẫn từ buffer ra.
Ta xét GetOpenFileNameA.
Nếu tôi không lầm thì khi chọn 1 tập tin thì trong buffer sẽ có đường dẫn của 1 tập tin và sau nó là 1 bai 0. Nếu chọn > 1 tập tin thì trong buffer trước tiên là đường dẫn tới thư mục có các tập tin được chọn. Sau đó là bai 0. Tiếp theo là tên (chỉ tên thôi) của tập tin 1 và bai 0, sau bai 0 là tên của tâp tin 2, tiếp theo lại là bai 0. Cứ lặp lại như thế cho đến tên cuối cùng và sau nó là 2 bai 0. Làm thế để người gọi hàm biết từ đâu tới đâu là tên thư mục, từ đâu tợi đâu là tên tập tin 1, 2, ... Hai bai 0 cuối cùng để biết là tên vừa đọc là tên cuối cùng.
Với phiên bản GetOpenFileNameW thì sau tên thư mục và mỗi tập tin là 2 bai 0 (unicode dùng 2 bai. Hai bai = 1 ký tự unicode), còn cuối cùng là 4 bai 0 (4 bai = 2 ký tự unicode).
Như thế thì sau khi gọi GetOpenFileNameW phải lọc ra từng đường dẫn và sau đó mới nhập từng đường dẫn unicode vào GetShortPathName.
Tuy nhiên tôi nghĩ là Ninh chọn 1 tập tin. Vậy hơi khó hiểu. Với đường dẫn ANSI thì không có lỗi trong khi GetShortPathName trả về đường dẫn ANSI.
2. Ninh thử kiểm tra xem. Giả sử ShortFileName trả về s = ShortFileName. Ninh thử đọc từng ký tự của s rôi nhập vào từng cell trên trang tính. Và nhập cả Len(s) vào cell. Sau đó kiểm tra xem các ký tự có chuẩn không, có như mong đợi không, có ký tự nào mắt không nhìn thấy không.
3.
Mã:
Sub Test()
Dim buffer As String, size As Long
LongFileName ="C:\1.txt"
buffer = String(1, Chr(0))
size = GetShortPathName(StrPtr(LongFileName), StrPtr(buffer), 1)
If size = 0 Then Msgbox 1
buffer = String(size, Chr(0))
size = GetShortPathName(StrPtr(LongFileName), StrPtr(buffer), size)
ShortFileName = Mid(buffer, 1, size)
End Function
Sao lại có code kỳ quặc thế? Sub ... End Function?
a. Ninh dùng phiên bản W nên để khỏi lăn tăn thì LongFileName nên ở dạng unicode. Hiện LongFileName ở dạng ANSI.
b. Khi Ninh chạy code thì tập tin 1.txt phải có trên C. Nếu không có thì GetShortPathName trả về lỗi. Vì GetShortPathName trả về đường dẫn ngắn của tập tin nên đường dẫn dài phải là đường dẫn tới tập tin tồntại trong system files.
Nói nôm na thì thế này. Trong Windows vd. Ninh gọi hàm có sử dụng đường dẫn tới tập tin. Ninh có thể dùng đường dẫn thực - dài, cũng có thể dùng đường dẫn ngắn (đường dẫn ngắn không chứa dấu cách và mỗi tên có không quá 8 ký tự (nếu tôi còn nhớ) nên có thể dùng cả trong DOS). Vậy thì để biết 2 tên khác nhau đó có cùng trỏ tới 1 tập tin thì tập tin đó phải có 1 "tên định danh"
Thực ra trong Windows mỗi một thư mục và mỗi một tập tin được gán cho một item identifier. Có item identifier thì Windows sẽ trả về đường dẫn tới tập tin, thư mục. Khi Ninh nhập vào GetShortPathName một đường dẫn tới tập tin không tồn tại trong system files thì rõ ràng Windows không thể xác định được item identifier của nó vì đường dẫn đó không có trong system files. Vì thế mà có lỗi.
Trước khi lập topic này cháu cũng đã thử chuyển đổi đuôi nhưng không được. Với các định dang office thì đổi đuôi vẫn báo lỗi tại câu lệnh
Mã:
myAttachments.Add att
Cháu chưa biết có "lối hậu" nào để qua mặt. Hiện với góp ý của mọi người cháu đã có thể attach các file không phải là file office (*.txt, *.rar, *.zip, *.log...)
Nếu bác có phương hướng nào để kiểm tra tiến trình nào đang gây ra lỗi thì hay quá, dhn46 sẽ dễ dàng truyền đạt câu hỏi tỷ mỷ hơn để nhận được trợ giúp của bác và mọi người.
Trước khi lập topic này cháu cũng đã thử chuyển đổi đuôi nhưng không được. Với các định dang office thì đổi đuôi vẫn báo lỗi tại câu lệnh
Mã:
myAttachments.Add att
Cháu chưa biết có "lối hậu" nào để qua mặt. Hiện với góp ý của mọi người cháu đã có thể attach các file không phải là file office (*.txt, *.rar, *.zip, *.log...)
Nếu bác có phương hướng nào để kiểm tra tiến trình nào đang gây ra lỗi thì hay quá, dhn46 sẽ dễ dàng truyền đạt câu hỏi tỷ mỷ hơn để nhận được trợ giúp của bác và mọi người.
dhn46 cảm ơn bác đã chỉ giúp.
Như bài #7 cháu đã đề cập, phần attachment và save của office bị thay bởi tiến trình khác tức là không hiện hộp thoại của office mà là hộp thoại của 1 tiến trình khác (hệ thống cài đặt). dhn46 đang tìm cách để vượt qua phần này theo suy nghĩ nếu đã attach được file không phải office thì sẽ có cách nào đó.
Như bài #7 cháu đã đề cập, phần attachment và save của office bị thay bởi tiến trình khác tức là không hiện hộp thoại của office mà là hộp thoại của 1 tiến trình khác (hệ thống cài đặt).
Không quan trọng chuyện cửa sổ chọn attachment và save là của Office hay của tiến trình khác. Ý tôi là nếu không cho chọn (office hay tiến trình khác) các tập tin Office thì chịu không thể vượt qua được. Không xét tới nén để thành tập tin khác.
Vậy khi đính kèm tập tin thì cửa sổ của tiến trình kia có cho phép chọn tập tin office không? Nếu không cho thì chịu.