Страницы: 1
RSS
Макросом из Excel сохранить документ Word, вызвать диалоговое окно для сохранения файла в документе Word.
 
Уважаемые форумчане, вынужден обратиться с вопросом следующего характера:
С Вашей же помощью мне удалось из кусочков составить код, который при запуске осуществляет копирование данных с листа Excelи вставляет эти данные на вновь созданный лист Word.

Но мне не удается реализовать заключительный этап своего замысла – мне необходимо вновь созданный файл Word предложить пользователю сохранить в исходной папке (папка где размещается файл Excel) с заготовкой имени файла. При этом команда на сохранение должна отдаваться именно пользователем, а не сохранятся автоматически.

Очень хочу реализовать свой замысел именно следующим образом:
1.       Запуск макроса из книги Excel.
2.       Копирование данных.
3.       Создание листа Word.
4.       Вставка данных на лист Word.
5.       Вызов диалогового окна для сохранения файла с возможностью редактировать имя файла перед его сохранением. Путь сохранения (по умолчанию) должен быть предложен в папку, в которой сохранен Исходный файл Excel. – здесь мне требуется Ваша помощь!!!
6.       После сохранения Пользователем файла завершение работы макроса.

Мне удалось найти решение этой задачи, но только в коде VBA для Word. Перечитал очень много тем, но так и не смог перевести данный код на понятный язык для Excel
Код
Sub MyFileSave() ' если запускать данный код из Word, то он полностью решает мою проблему
Dim sPath As String
 
sPath = ActiveDocument.Path & "\"
'sPath = ActiveWorkbook.Path & "\" ' для Excel, сэтимвродеудалосьразобраться
 
With Dialogs(wdDialogFileSaveAs) ' а вот здесь при запуске макроса вылетает ошибка.
.Name = sPath & "Переченьработ_" & Left(ActiveDocument.Paragraphs(2).Range.Text, Len(ActiveDocument.Paragraphs(2).Range.Text) - 1)
.Show
End With
End Sub

Очень прошу Вас помочь мне!
Спасибо!

Данная тема близка к моей проблеме, но использовать под свои нужды не смог, так как в диалоговом окне не возможно выбрать расширение файла, а это мне тоже необходимо.

Пример прилагаю.
 
как вариант вызвать диалог сохранения вордовский

Код
......
.Application.Dialogs(84).Show

End With
.....
 
WithDialogs(wdDialogFileSaveAs) ' а вот здесь при запуске макроса вылетает ошибка.
------------
Либо подключите библиотеку ворд в референсах, либо замените вордовские константы на их числовые значение.
 
Цитата
WithDialogs(wdDialogFileSaveAs)
Я разве так показывал?

.Selection.Paste ' это уже относится к Word т.к. objWord
.Application.Dialogs(84).Show

End With
Всё внимание на точку перед Application
Изменено: Александр Моторин - 15.03.2015 20:35:43
 
Получить имя файла можно функцией
Код
Function GetFileName(Optional ByVal Title As String = "Выберите файл для обработки", _
                      Optional ByVal InitialPath, _
                      Optional ByVal MyFilter As String) As String
    ' функция выводит диалоговое окно выбора папки с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
    If Not IsMissing(InitialPath) Then
         On Error Resume Next: ChDrive Left(InitialPath, 1)
         ChDir InitialPath    ' выбираем стартовую папку
    End If
     res = Application.GetOpenFilename(MyFilter, , Title, "Открыть")  ' вывод диалогового окна
    GetFileName = IIf(VarType(res) = vbBoolean, "", res)    ' пустая строка при отказе от выбора
End Function

Sub ПримерИспользования_GetFileName()
     ИмяФайла = GetFileName("Заголовок окна", ThisWorkbook.Path, "Документы  Ворд (*.doc*),")    ' запрашиваем имя файла
    ' ===================== другие варианты вызова функции =====================
    ' текстовые файлы, стартовая папка не указана
    '       ИмяФайла = GetFileName("Выберите текстовый файл", , "Текстовые файлы (*.txt),")
    ' файлы любого типа из папки "C:\Windows"
    '       ИмяФайла = GetFileName(, "C:\Windows", "")
    ' ==========================================================================

     If ИмяФайла = "" Then Exit Sub    ' выход, если пользователь отказался от выбора файла
    MsgBox "Выбран файл: " & ИмяФайла, vbInformation
End Sub
 
Цитата
Александр Моторин написал: как вариант вызвать диалог сохранения вордовский  
Александр, спасибо за подсказку!
Данной строкой диалог вызывается, однако путь сохранения по умолчанию в "Мои документы", а мне необходимо в папку с исходным файлом Excel, так как исходный файл "кочует" из папки в папку.
Кроме того не совсем ясно как прописать "заготовку" имени для созданного файла Word. Как я понял в диалоге отражаются первые слова из текстового документа.
Может я что-то упустил из Ваших ответов ниже ... ?
 
Цитата
Александр Моторин написал: Получить имя файла можно функцией...
А в этом ответе я не совсем понял. В каком именно месте мне необходимо использовать функцию ?
 
Можно в референсах подключить  CommonDialog
Код
Sub Создать_Doc() ' Создание Doc
Dim DLG As CommonDialog
Set DLG = New CommonDialog
Dim sPath As String

Dim objWord As Object
Set objWord = CreateObject("Word.Application") ' Создание объекта Word
  
  objWord.Documents.Add DocumentType:=wdNewBlankDocument
  objWord.Visible = True

Range([A7], Range("G" & Rows.Count).End(xlUp)).Copy

strForWho = ActiveSheet.Cells(3, 1).Value
strForWhy = ActiveSheet.Cells(5, 2).Value

With objWord

.Selection.PageSetup.LeftMargin = 40
.Selection.PageSetup.RightMargin = 40
.Selection.PageSetup.TopMargin = 30
.Selection.PageSetup.BottomMargin = 30

    ' Заголовок сообщения
.Selection.Font.Size = 14
.Selection.Font.Bold = True
.Selection.ParagraphFormat.Alignment = 1
'.Selection.TypeText Text:="Перечень работ, выполняемых в" & vbTab & strForWho
.Selection.TypeText Text:=vbTab & strForWho

.Selection.TypeParagraph
    
.Selection.Font.Size = 14
.Selection.Font.Bold = True
.Selection.ParagraphFormat.Alignment = 1
.Selection.TypeText Text:=strForWhy

.Selection.TypeParagraph

.Selection.Paste ' это уже относится к Word т.к. objWord
'.Application.Dialogs(84).Show

objWord.Application.Visible = False

DLG.DialogTitle = "заголовок окна"
DLG.InitDir = ActiveWorkbook.Path
DLG.Filter = "Документы Word,*.doc"
DLG.Filename = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 1)
DLG.ShowSave

myPath = DLG.Filename

objWord.Application.Visible = True
objWord.ActiveDocument.SaveAs Filename:=myPath, FileFormat:=wdFormatXMLDocument
End With
Application.CutCopyMode = False
End Sub
 
Добрый день, уважаемые форумчане!
Выражаю благодарность Александру Моторину за его труд!
К сожалению сразу мне не удалось отписаться, был в отъезде.

Короче говоря проследовал я по пути Александра М. на домашнем ПК (Windows Vista, Ofice 2010), но путь мой был не долог. При запуске макроса выдает ошибку activex component can't create object и выделяет следующую строку в коде:
...
Dim DLG As CommonDialog
Set DLG = New CommonDialog ' здесь ошибка
Dim sPath As String
...

В референсах CommonDialog подключен (я его и включал и отключал и снова включал без успеха).

При этом при запуске на рабочем компьютере (наша организация работает в облаке, возможно там более новая версия офиса) он сработал без ошибок (правда там были другие нюансы, но основная задача выполнялась).

Подскажите пожалуйста что мне сделать, чтобы с файлом можно было работать и на домашнем ПК и на рабочем ?
 
Чтобы работало на всех компах, - про CommonDialog надо забыть

варианты на выбор (взято из постов выше):
1) FunctionGetFileName - функция вызова диалогового окна
2) .Application.Dialogs(84).Show - вызов одного из встроенных в Word / Excel диалоговых окон
 
Игорь, я рассматривал каждое из этих предложений, возможно не достаточно внимательно и с пониманием, но все же ...

1) FunctionGetFileName - функция вызова диалогового окна - вызывает диалоговое окно, как я понял, именно для открытия файлов, а мне необходимо окно для сохранения файлов.

2) .Application.Dialogs(84).Show - вызов одного из встроенных в Word / Excel диалоговых окон
Данной строкой диалог вызывается, однако путь сохранения по умолчанию в "Мои документы", а мне необходимо в папку с исходным файлом Excel, так как исходный файл "кочует" из папки в папку.
Кроме того не совсем ясно как прописать "заготовку" имени для созданного файла Word. Как я понял в диалоге отражаются первые слова из ]текстового документа.

Пока продолжаю ковыряться ...
Появилась мысль макросом из Excel создать во вновь созданном документе Word макрос, который сразе же и запустить в Ворде. Наверное это не реально, но ...
 
Цитата
не совсем ясно как прописать "заготовку" имени для созданного файла Word

Как-то так:
Код
myPath = Application.GetSaveAsFilename(Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 1), "Документы Ворд (*.doc),*.doc;", 1)
Страницы: 1
Наверх