Как программно закрыть word

Lander

0 / 0 / 0

Регистрация: 23.10.2009

Сообщений: 51

1

19.06.2011, 01:02. Показов 8967. Ответов 9

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

в общем тема такая:
формируется отчет в ворде.. информация берется из datagrid. один раз сформировался. закрыл ворд, а при повторном формировании отчета уже выдает ошибку. помогите пожалуйста. Для диплома надо!..просто ГОРЮ!!,…

вот код формирования отчета:

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
85
86
87
88
 Set WordApp = New Word.Application
 
 
WordApp.Visible = True
 
'
Set DocWord = WordApp.Documents.Add
 
DocWord.Activate
 
With DocWord.Application.Selection.PageSetup
.LeftMargin = CentimetersToPoints(2)
.RightMargin = CentimetersToPoints(1)
.TopMargin = CentimetersToPoints(2.5)
.BottomMargin = CentimetersToPoints(1.5)
End With
 
    
With DocWord.Application.Selection
.ParagraphFormat.Space15
.EndOf
    With DocWord.Application.Selection
    .ParagraphFormat.Alignment = 1
    .Font.Bold = True
    .Font.Size = 20
    .Font.Name = "Times New Roman"
    .InsertAfter "ООО"
    .InsertAfter " "
    .InsertAfter """"
    .InsertAfter "Невская линия"
    .InsertAfter """"
    .EndOf
    .InsertParagraphAfter
    .InsertAfter "Перечень запчастей, имеющихся на складе"
    .EndOf
    End With
        With DocWord.Application.Selection
        .ParagraphFormat.Alignment = 3
        .Font.Bold = False
        .Font.Size = 14
        .Font.Name = "Times New Roman"
         End With
  End With
  ' ñîçäàåì òàáëèöó
  DocWord.Application.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
  DocWord.Application.Selection.EndOf
  Set TableWord = DocWord.Tables.Add(DocWord.Application.Selection.Range, 2, 3)
TableWord.Borders(wdBorderTop).Visible = True
TableWord.Borders(wdBorderLeft).Visible = True
TableWord.Borders(wdBorderVertical).Visible = True
TableWord.Borders(wdBorderRight).Visible = True
TableWord.Borders(wdBorderHorizontal).Visible = True
TableWord.Borders(wdBorderBottom).Visible = True
     TableWord.Cell(1, 1).Range.Text = "Код запчасти"
     TableWord.Cell(1, 2).Range.Text = "Наименование"
     TableWord.Cell(1, 3).Range.Text = "Кол-во"
     DocWord.Application.Selection.InsertRowsBelow
     DocWord.Application.Selection.EndOf
     TableWord.Columns(1).Width = CentimetersToPoints(3)
     TableWord.Columns(2).Width = CentimetersToPoints(12)
     TableWord.Columns(3).Width = CentimetersToPoints(3)
    
    r.MoveFirst
    i = 1
    Do While Not r.EOF
    Selection.TypeText Text:=r(0)
    Selection.MoveRight Unit:=wdCell, Count:=1
    Selection.TypeText Text:=r(1)
    Selection.MoveRight Unit:=wdCell, Count:=1
    Selection.TypeText Text:=r(2)
    Selection.MoveRight Unit:=wdCell, Count:=1
    r.MoveNext
    i = i + 1
    Loop
TableWord.Rows(2).Delete
    Selection.MoveDown Unit:=wdLine, Count:=3
    Selection.TypeParagraph
   
       With DocWord.Application.Selection
        .ParagraphFormat.Alignment = 2
        .Font.Bold = False
        .Font.Size = 14
        .Font.Name = "Times New Roman"
        .InsertAfter "М.П. ___________________ ФИО."
        .EndOf
        .InsertParagraphAfter
        .EndOf
        End With



0



Busine2009

Заблокирован

19.06.2011, 07:58

2

Цитата
Сообщение от Lander
Посмотреть сообщение

формируется отчет в ворде..

а из какой программы Microsoft Office запускается код?

Что за ошибка?



0



toiai

3217 / 966 / 223

Регистрация: 29.05.2010

Сообщений: 2,085

19.06.2011, 09:21

3

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

Visual Basic
1
2
3
4
5
    With DocWord
        .Save
        .Close
    End With
    WordApp.Quit



0



Lander

0 / 0 / 0

Регистрация: 23.10.2009

Сообщений: 51

19.06.2011, 09:57

 [ТС]

4

все равно он второй раз не формирует…
выдает ошибку:
run-time error ‘462’
The remotr server machine does not exit or is unavailabe…
и ругается на эту вот строчку:

Visual Basic
1
.LeftMargin = CentimetersToPoints(2)



0



toiai

3217 / 966 / 223

Регистрация: 29.05.2010

Сообщений: 2,085

19.06.2011, 10:12

5

Попробуй заменить

Visual Basic
1
 With DocWord.Application.Selection.PageSetup

на

Visual Basic
1
 With ActiveDocument.PageSetup

и в других местах также соответственно



0



0 / 0 / 0

Регистрация: 23.10.2009

Сообщений: 51

19.06.2011, 10:24

 [ТС]

6

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



0



0 / 0 / 0

Регистрация: 23.10.2009

Сообщений: 51

19.06.2011, 12:31

 [ТС]

7

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



0



Busine2009

Заблокирован

19.06.2011, 15:23

8

Lander,
а из какой программы Microsoft Office запускается код?

Вот так пишите размеры:

Visual Basic
1
Application.CentimetersToPoints(2)



0



toiai

3217 / 966 / 223

Регистрация: 29.05.2010

Сообщений: 2,085

19.06.2011, 18:04

9

Из Excel я открываю Word кодом:

Visual Basic
1
2
3
Set MyWord = CreateObject("Word.Application")
    MyWord.Visible = True
    Set MyWdDoc = MyWord.Documents.Open(ActiveWorkbook.Path + "Шаблоны" + FileTemp)

Ошибка возникала если Word не закрывал.



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

20.06.2011, 07:17

10

Visual Basic
1
Set MyWord = CreateObject("Word.Application")

эту строку попробуй вынести из процедуры формирования отчёта. Например в активацию формы. При деактивации ворд закрывай



1



Различные инструменты, предлагаемые после этого Microsoft Офис позволяют не только создавать документы, но и создавать функции. Конечно, это для программистов, знакомых с приложениями Visual Basic VBA. Но мы упростим вам задачу и в этой статье мы научитесь закрывать Word из кода или скрипта VBA — легко и быстро.

Но сначала мы раскроем вопрос о том, что такое Приложения Visual Basic и это не более чем приложение, интегрированное в пакет Microsoft Office.

Это позволяет программировать на листах любого документа, будь то Word, Excel, PowerPoint, Access, и поскольку он не может быть скомпилирован, он становится макросом и распространяется путем простого копирования документа.

Хотя это действие широко используется программистами, оно не мешает никому из смертных научиться создавать функции с использованием сценариев VBA. И мы возьмем задачу научить его быстро и легко. Поскольку некоторые термины могут показаться запутанными и несколько пугающими, например, при попытке преобразовать документ OpenOffice в Word .

Одно из основных его применений — автоматизация повторяющихся или часто используемых задач, таких как открытие или закрытие документа, созданного в Word .

Вот шаги, которые необходимо выполнить, чтобы закрыть Word из кода VBA или скрипт . И для начала мы заходим в приложение с рабочего стола или где бы мы его не сохранили.

Следующий шаг важен, потому что вы должны иметь Вкладка разработчика в главном меню, если эта вкладка или вкладка не отображается, необходимо выполнить следующие операции. Наведите указатель мыши на значок Microsoft Office и щелкните. Это действие вызовет окно с различными параметрами, и вам нужно перейти в его нижнюю часть и выбрать Параметры Word.

Теперь будет отображаться поле, в левой части которого вам нужно выбрать вариант Наиболее частые, а в правой части из основных параметров для работы Слово.

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

Шаги по закрытию Word из кода или сценария VBA — быстро и легко

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

Следующим шагом является доступ к главному меню и выбор Вкладка разработчика . Затем в разделе «Код», который находится слева, вы выбираете опцию Visual Basic.

Следующим шагом будет написание или вставка следующего кода в конец строки Set objWord = CreateObject («Word.Application») Set objDoc = objWord.Documents.Close («c: scripts test.doc ‘) objWord Следующим шагом будет перейти в левый верхний угол и щелкнуть значок Microsoft Office

Затем вам нужно выбрать опцию Сохранить, и вы сделаете это со следующим именем тест.doc это с кодом VBA который вы будете использовать, чтобы закрыть приложение Word.

Вы можете увидеть, насколько быстро и легко выполнять задачи программиста. И используйте язык программирования Basic, который имеет большое сходство с другим офисным программным обеспечением, таким как OpenOffice и StarBasic.

И с этим языком программирования мы закончили с учебником, но вы, возможно, захотите узнать больше о том, как чьи Коды источники программирования находятся вставлен в документе. И чтобы вы могли больше узнать об этом небольшом изученном пункте программы Word.

Ezoic

I know it is too late, but I found this topic because I had the same problem.

And my solution may help other people.

The solution above didnt work well because it killed every running instance of Word, though it wasn’t opened by the c# program but the user.

So this was not that userfriendly.

My code checks the processes before/after the creation of the Word.Application Object in c# and writes the IDs of the WINWORD Processes in List<int>
then it compares the values in both List<int>.
When a processID is not found in both List<int> it kills the process with this ID.

public List<int> getRunningProcesses()
{
    List<int> ProcessIDs = new List<int>();
    //here we're going to get a list of all running processes on
    //the computer
    foreach (Process clsProcess in Process.GetProcesses())
    {
        if (Process.GetCurrentProcess().Id == clsProcess.Id)
            continue;             
        if (clsProcess.ProcessName.Contains("WINWORD"))
        {
            ProcessIDs.Add(clsProcess.Id);
        }
    }
    return ProcessIDs;
}

Run this twice (one time before the creation of the Word.Application and once after).

 List<int> processesbeforegen = getRunningProcesses();
 // APP CREATION/ DOCUMENT CREATION HERE...
 List<int> processesaftergen = getRunningProcesses();

Then run killProcesses(processesbeforegen, processesaftergen);

 private void killProcesses(List<int> processesbeforegen, List<int> processesaftergen)
 {
    foreach (int pidafter in processesaftergen)
    {
        bool processfound = false;
        foreach (int pidbefore in processesbeforegen)
        {
            if (pidafter == pidbefore)
            {
                processfound = true;
            }
        }

        if (processfound == false)
        {
            Process clsProcess = Process.GetProcessById(pidafter);
            clsProcess.Kill();
        }
    }
 }

  • Remove From My Forums
  • Question

  • A novice at automating MS Office, I’m programming Word from Visual FoxPro, and have run into the problem that if a user tries to open a document that’s already open, nothing appears to happen since it encounters a «File in use» error, which the
    user can’t see since it opens behind another window. In this particular application it would be satisfactory simply to close any open documents each time an attempt is made from the menu to open another document regardless of whether there’s a conflict. And
    that’s better anyway since otherwise users will be confused.

    Here is my initial test of the method I thought might accomplish that:

    oWord = GETOBJECT(, «Word.Application»)
    ? oWord.Documents.Count
    FOR i=1 TO oWord.Documents.Count
       ? oWord.Documents(i).Name
       oWord.Documents(i).Close()
    ENDFOR

    And that worked, at first, although oWord.Documents.Count was always = 1 since the already opened documents belonged to separate instances of Word, being opened by the code below. But at least I was able to run the above code again and again to close each
    remaining document one at a time, so the method seemed promising.

    NMBRLTRS=ALEN(ARC_LETRS)
    FOR I = 1 TO NMBRLTRS
       oWord = CREATEOBJECT( «Word.Application» )
       oWord.Visible = .T.
       FULLPATH=ACDBF + ‘Correspondence’ + ARC_LETRS(I)
       sDoc = FULLPATH      
       oWord.Documents.Open( sDoc, 0, 0 ) && parm 3 read only = not
       RELEASE oWord
    ENDFOR

    To improve the situation, I re-wrote the code just above to open all the previously opened docs in the same Word instance, but then the little program for closing them stopped working, reporting oWord.Documents.Count as 0 each time I tried it. And that happened
    even when I put back the code just above.

    So now I’m mystified.

    Am I going about this the wrong way anyway?

    Thanks in advance for your help.


    Peyton

    • Edited by

      Thursday, October 31, 2013 9:49 PM

Answers

  • Hi Peyton

    I believe this article explains why this is happening

    http://support.microsoft.com/kb/238975/en-us

    In the .NET world, it’s possible to work with processes, which makes it simpler to get to these things. Not sure if/how you can do that with VFP — it would certainly involve the Windows API…


    Cindy Meister, VSTO/Word MVP,
    my blog

    • Marked as answer by
      Luna Zhang — MSFT
      Monday, November 11, 2013 9:04 AM

Задача: при запуске приложения найти все открытые документы Word и закрыть их с сохранением изменений не выводя диалог о подтверждении сохранения.

Как через процессы их все убить понятно, а вот как все сохранить то что было открыто до запуска самого приложения не понятно…

Kromster's user avatar

Kromster

13.5k12 золотых знаков42 серебряных знака72 бронзовых знака

задан 2 сен 2016 в 7:16

Александр's user avatar

4

Можно используя Office.Interop.

var myApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application") as Word.Application;
myApp.Save();

Тут похожий вопрос про Exel.

Дух сообщества's user avatar

ответ дан 3 сен 2016 в 6:29

Ildar's user avatar

IldarIldar

2,14720 серебряных знаков53 бронзовых знака

2

   try
        {
            var myApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application") as Word.Application;
            myApp.Documents.Close(Word.WdSaveOptions.wdSaveChanges);
            myApp.Application.Quit();
        }
        catch { };

        Application.Exit();

Вот что мне требовалось.

ответ дан 5 сен 2016 в 16:46

Александр's user avatar

АлександрАлександр

3531 золотой знак3 серебряных знака15 бронзовых знаков

1

Like this post? Please share to your friends:
  • Как программно закрасить ячейки в excel
  • Как программно задать формат ячейки в excel
  • Как программно в 1с сохранить отчет в excel
  • Как программировать ячейки в excel
  • Как программировать таблицы в excel