Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 35
1

Вложить файл в outlook

06.08.2012, 13:46. Просмотров 3929. Ответов 4
Метки нет (Все метки)

Не подскажете, как в Outlook 2010 прикрепить файл из буфера обмена? Если просто нажать Ctrl+C, создается письмо с прикрепленным файлом из буфера обмена. Но необходимо еще автоматом заполнять тему и получателя. Решил написать свой макрос и назначить на кнопку. А вот прикрепить файл из буфера обмена во вложения не получается.

 Комментарий модератора 
напиши конкретно, что ты хочешь автоматизировать?
кнопка в Outlook'е?
может буфер-то и не нужен.


Добавлено через 4 часа 25 минут

На кнопку хочу повесить макрос, который создает новое сообщение, вписывает адресата, прикрепляет файл (файл exel - был скопирован до этого в проводнике винды), а название файла пишет в тему письма. Из самого файла exel такое реализовать не сложно, но нужно именно из Outlook. В принципе если во входящих нажать ctrl+c, то outlook автоматом создает письмо, прикрепляет файл и вписывает название файла в тему. Но нужно еще автоматизировать ввод адресата. Надеюсь, так понятнее.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2012, 13:46
Ответы с готовыми решениями:

Автоматический экспорт календаря из outlook в файл
Помогите пожалуйста написать скрипт экспорта календаря аутлука 2007 в файл, чтобы потом его...

Макрос в Excel требует файл Outlook.pst
Всем привет. В очередной раз борюсь с багами и непонятками детищ мелкософта. На этот раз проблема...

VB Outlook. Как обратиться к выделенному тексту в окне предварительного просмотра Outlook?
Здравствуйте! Можете помочь? Мне нужно подцепить в макросе на VB Outlook 2007 текст, выделенный в...

Outlook: как корректно внедрить file.msg в папку в Outlook
собственно вопрос. делаю так: Dim OL As Outlook.Application Dim newMail As Object Set OL =...

4
Эксперт WindowsАвтор FAQ
17476 / 7327 / 873
Регистрация: 25.12.2011
Сообщений: 11,103
Записей в блоге: 16
07.08.2012, 01:30 2
Цитата Сообщение от аналитика Посмотреть сообщение
очень возможно, что есть способ изъять информацию о содержимом буфера
Есть.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'к проекту подключена библиотека Windows Forms 2.0
Sub Work_with_Clipboard()
Dim sClipText As DataObject
Set sClipText = New DataObject
 
sClipText.SetText "Сообщение для буфера"
sClipText.PutInClipboard
 
sClipText.SetText ""
 
sClipText.GetFromClipboard
Debug.Print sClipText.GetText
Set sClipText = nothing
End Sub
Еще для визуального отслеживания состояния буфера есть системная утилита из Windows XP называется clipbrd.exe
2
Эксперт WindowsАвтор FAQ
17476 / 7327 / 873
Регистрация: 25.12.2011
Сообщений: 11,103
Записей в блоге: 16
07.08.2012, 04:18 3
Лучший ответ Сообщение было отмечено как решение

Решение

Есть уже готовое решение от MS на API в виде класса: MS cFilesClass
Здесь прибл. описание алгоритма на англ.

Не по теме:

Но, ИМХО, такое корявое с опечатками, неиспользуемыми переменными. И вообще куда делся упомянутый тип (или класс) cFileInfo. Хотя рабочее решение.



Вообщем, перепилил под нужды народа.
Мод. класс в файле прилагается с образцом вызова, хотя можно обойтись и просто функцией.
3
Вложения
Тип файла: xls Get_Clipboard_Files_Folders_Class.xls (31.5 Кб, 30 просмотров)
здесь больше нет...
3354 / 1666 / 184
Регистрация: 03.02.2010
Сообщений: 1,219
08.08.2012, 11:50 4
первое
полу-дурное решение, но если буфер, так буфер...
(очень возможно, что есть способ изъять информацию о содержимом буфера)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Option Explicit
Private Declare Sub keybd_event Lib "user32.dll" ( _
                                ByVal bVk As Byte, _
                                ByVal bScan As Byte, _
                                ByVal dwFlags As Long, _
                                ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_KEYUP = &H2
Private Const VK_TAB = &H9
Private Const VK_CONTROL = &H11
Private Const VK_V = &H56
 
Private Sub Tab__Ctrl_V()
    keybd_event VK_TAB, 0, 0, 0                     ' нажимаем Tab
    keybd_event VK_TAB, 0, KEYEVENTF_KEYUP, 0       ' отпускаем Tab
 
    keybd_event VK_CONTROL, 0, 0, 0                 ' нажимаем Ctrl
    keybd_event VK_V, 0, 0, 0                       ' нажимаем V
    keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0   ' отпускаем Ctrl
    keybd_event VK_V, 0, KEYEVENTF_KEYUP, 0         ' отпускаем V
End Sub
 
 
Public Sub MailClipboard()
    Dim miNew As MailItem
    Set miNew = Application.CreateItem(olMailItem)
 
    With miNew
        .To = "???@????.??"
        .Body = "Тело"
        .Display
        Tab__Ctrl_V
        
        DoEvents
        
        Dim attCurr As Attachment, sSbj As String: sSbj = ""
        For Each attCurr In .Attachments
            sSbj = sSbj & attCurr.FileName & "; "
        Next attCurr
 
        If Len(sSbj) > 0 Then
            .Subject = Left$(sSbj, Len(sSbj) - 2)
        End If
    End With
End Sub
сделать же можно с вызовом диалога "Выбери файлы" и поехали...



это политически более правильное решение вопроса (основа которого любезно предоставлена Dragokas'ом , мной чутка подстрижена ):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Option Explicit
Private Const CF_HDROP = &HF
Private Const GET_DROP_COUNT = -1
 
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long
 
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
 
Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" ( _
                                       ByVal hDrop As Long, ByVal UINT As Long, _
                                       ByVal lpStr As String, ByVal ch As Long) As Long
 
Private Declare Function CloseClipboard Lib "user32" () As Long
 
Public Sub MailClipboard_2()
    Dim miNew As MailItem
    Set miNew = Application.CreateItem(olMailItem)
 
    With miNew
        .To = "???@????.??"
        .Body = "Тело"
 
        Dim colFiles As New Collection
        Dim lCount As Long: lCount = GetClipboardFiles(colFiles)
 
        Dim i As Long, sSbj As String: sSbj = ""
        For i = 1 To lCount
            .Attachments.Add colFiles(i)
            sSbj = sSbj & sGetFileName(colFiles(i)) & "; "
        Next i
 
        If Len(sSbj) = 0 Then
            sSbj = "А в буфере-то ничего и нет!!!"
        Else
            sSbj = Left$(sSbj, Len(sSbj) - 2)
        End If
                
        .Subject = sSbj
        .Display
    End With
End Sub
 
Private Function GetClipboardFiles(ByRef colFiles As Collection) As Long
    On Error GoTo ErrHandler
 
    If OpenClipboard(0&) > 0 Then
        Dim lFormat As Long: lFormat = 0&       ' получение ПЕРВОГО формата
        Do
            lFormat = EnumClipboardFormats(lFormat)
            If lFormat = 0 Then Exit Do
            'Debug.Print lFormat    '"&H" & Hex(lFormat)
 
            If lFormat = CF_HDROP Then
                Dim strBuff As String: strBuff = String(255, Chr(0))
                Dim lHandle As Long: lHandle = GetClipboardData(CF_HDROP)
                If lHandle > 0 Then
                    Dim lCount As Long
                    lCount = DragQueryFile(lHandle, GET_DROP_COUNT, strBuff, Len(strBuff))
 
                    Dim i As Long
                    For i = 0 To lCount - 1
                        Dim lBuffSize As Long
                        lBuffSize = DragQueryFile(lHandle, i, strBuff, Len(strBuff))
                        colFiles.Add Left$(strBuff, lBuffSize)
                    Next i
                    Exit Do
                End If
            End If
        Loop
    End If
    GetClipboardFiles = colFiles.Count
 
ErrHandler:
    CloseClipboard
    If Err.Number <> 0 Then
        Debug.Print Err.Number & " - " & Err.Description, "GetClipboardFiles"
    End If
End Function
 
Private Function sGetFileName(sIn As String) As String
    Dim pos As Long: pos = InStrRev(sIn, "\")
    sGetFileName = Mid(sIn, pos + 1)
End Function
2
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 35
13.08.2012, 08:45  [ТС] 5
аналитика, огромное спасибо. уже обкатали ваше решение
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2012, 08:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Запуск макароса Outlook из другого макроса Outlook
Добрий день! как в Outlook 2010 запустить макарос Outlook из другого макроса Outlook

Как создать письмо и вложить в него текущий проект?
Добрый день! Нужно написать макрос в WORD'е, приблизительное название макроса - &quot;Отправить этот...

Запрос через Outlook, обработка в Excel, ответ через Outlook
Уважаемые VB &amp; VBA_ програмисты! Насколько возможно реализовать следующую задачу, домашними ...

программно вложить файл
Как сделать что бы некий заранее известный документ можно было прицепить в заранее известное поле....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.