1с word selection endkey

Объект = ПолучитьCOMОбъект(ПутьКФайлу);

       // Покажем документ. Для красоты.

       Объект.Application.Visible = 1;

       Word = Объект.Application;

       Doc = Объект.Application.Documents(1);

       Doc.Activate();

       // Готовим переменную в которой будет содержимое нашего документа

       // (текст, таблицы и проч).

       Text = Word.Selection;

       // Очистим документ

       // Ctrl-A

       Text.WholeStory();

       // Del

       Text.Delete(1, 1);

Text.TypeText(Символы.ВК);

       Text.ParagraphFormat.Alignment = 4; //3 — по ширине, 1- лево 2 право 4 растянуть

       Text.TypeText(Строка(Тема));

А что сделать что бы было по центру

Text.ParagraphFormat.Alignment = ????;

Ermak27

4 / 4 / 0

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

Сообщений: 1,228

1

1C 8.x

25.06.2019, 11:26. Показов 9089. Ответов 17

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


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

Добрый день!
Подскажите как сохранить шаблон word. У меня ругается на SaveAs

1C
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
 ПутьКШаблонам =СокрЛП(Константы.КвартплатаПутьКШаблонам.Получить());
     Если ДокПечати=СокрЛП("Квитанция2") Тогда
         ИмяШаблона = СокрЛП("Квитанция2.dot");
     КонецЕсли;
 
     ИмяФайла = "E:file.doc";
    
    Word= Новый COMОбъект("Word.Application");
    Докум=Word.Documents.Add(""+ПутьКШаблонам+ИмяШаблона);
    Word=Докум;
    Докум=Word.Application.Documents(1);
    Докум.Activate();
    Докум.Content.Copy();
    фл=ложь;
    сч=0;
    
    Для Каждого Стр из Ведомость Цикл
        сч=сч+1;
        фл=Истина;
        
         ЛС=СокрЛП(Стр.ЛицевойСчет)+Стр.ЛицевойСчет.Регион.КодСбер;
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<ЛС"+сч+">",0,1,0,,,1,,0,Формат(ЛС,"ЧГ=0"));
         Исключение
         КонецПопытки;
         
         ФИО_1=ТРег(СокрЛП(Стр.ЛицевойСчет.ОтветственныйКвартиросъемщик));
         ФИО_1_Кратко=ОбщегоНазначения.ФамилияИнициалыФизЛица(ФИО_1);
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<ФИО"+сч+">",0,1,0,,,1,,0,СокрЛП(ФИО_1_Кратко));
         Исключение
         КонецПопытки;
         
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<АДРЕС"+сч+">",0,1,0,,,1,,0,СокрЛП(Стр.Адрес));
         Исключение
         КонецПопытки;
 
        Если сч=1 Тогда
            сч=0;
            Докум = Word.Range(0,0);
            Докум.InsertBreak();
            Докум = Word.Range(0,0);
            Докум.Paste();
        Конецесли; 
    КонецЦикла;
    Докум.SaveAs(ИмяФайла);
Word.Application.Quit();



0



198 / 158 / 45

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

Сообщений: 807

25.06.2019, 12:42

2

Процедура клиент, сервер ?
Есть доступ до папки у пользователя ?
1С пробовал от админа запускать ?
И что за ошибка хоть ?



0



4 / 4 / 0

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

Сообщений: 1,228

25.06.2019, 14:39

 [ТС]

3

1. Процедура сервер
2. Есть доступ
3. Работаю по админом
4. Метод объекта не обнаружен (SaveAs)
Докум.SaveAs(ИмяФайла);



0



198 / 158 / 45

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

Сообщений: 807

25.06.2019, 16:17

4

Нельзя сохранять фалы на сервере, нужно перенести на клиент.



0



4 / 4 / 0

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

Сообщений: 1,228

25.06.2019, 16:18

 [ТС]

5

можешь показать



0



198 / 158 / 45

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

Сообщений: 807

25.06.2019, 16:24

6

Ermak27, полностью процедуру всю переноси на клиент. А данные для заполнения вытаскивай через функции на сервере несли понадобится.

Перед процедурой у тебя написано &НаСервере, меняй это на &НаКлиенте. Повалятся ошибки, такие как обращение к константе например и начинай их исправлять потихоньку.



0



4 / 4 / 0

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

Сообщений: 1,228

25.06.2019, 16:44

 [ТС]

7

Я тебя не так понял на счёт сервера. У меня вообщем ничего не стоит перед процедурой. Нет &НаСервере и &НаКлиенте. У меня база крутиться на sql сервере



0



198 / 158 / 45

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

Сообщений: 807

25.06.2019, 16:52

8

Ermak27, хорошо. Напиши тогда где находится процедура. В модуле формы или модуле объекта ?



0



Ermak27

4 / 4 / 0

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

Сообщений: 1,228

25.06.2019, 17:06

 [ТС]

9

Модуле формы. Процедура срабатывает при нажатии кнопки

1C
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
Процедура ОсновныеДействияФормыКвитанция(Кнопка)
    // Вставить содержимое обработчика.
    Печать("Квитанция2");
КонецПроцедуры
 
Процедура Печать(ДокПечати="")
    ПутьКШаблонам =СокрЛП(Константы.КвартплатаПутьКШаблонам.Получить());
     Если ДокПечати=СокрЛП("Квитанция2") Тогда
         ИмяШаблона = СокрЛП("Квитанция2.dot");
     КонецЕсли;
 
     ИмяФайла = "E:file.doc";
    
    Word= Новый COMОбъект("Word.Application");
    Докум=Word.Documents.Add(""+ПутьКШаблонам+ИмяШаблона);
    Word=Докум;
    Докум=Word.Application.Documents(1);
    Докум.Activate();
    Докум.Content.Copy();
    фл=ложь;
    сч=0;
    
    Для Каждого Стр из Ведомость Цикл
        сч=сч+1;
        фл=Истина;
        
         ЛС=СокрЛП(Стр.ЛицевойСчет)+Стр.ЛицевойСчет.Регион.КодСбер;
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<ЛС"+сч+">",0,1,0,,,1,,0,Формат(ЛС,"ЧГ=0"));
         Исключение
         КонецПопытки;
         
         ФИО_1=ТРег(СокрЛП(Стр.ЛицевойСчет.ОтветственныйКвартиросъемщик));
         ФИО_1_Кратко=ОбщегоНазначения.ФамилияИнициалыФизЛица(ФИО_1);
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<ФИО"+сч+">",0,1,0,,,1,,0,СокрЛП(ФИО_1_Кратко));
         Исключение
         КонецПопытки;
         
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<АДРЕС"+сч+">",0,1,0,,,1,,0,СокрЛП(Стр.Адрес));
         Исключение
         КонецПопытки;
 
        Если сч=1 Тогда
            сч=0;
            Докум = Word.Range(0,0);
            Докум.InsertBreak();
            Докум = Word.Range(0,0);
            Докум.Paste();
        Конецесли;  
    КонецЦикла;
    Докум.SaveAs(ИмяФайла);
Word.Application.Quit();
 
КонецПроцедуры



0



198 / 158 / 45

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

Сообщений: 807

25.06.2019, 18:16

10

Попробуй так прописать

Докум.Documents.SaveAs(ИмяФайла);



0



1155 / 702 / 203

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

Сообщений: 5,215

Записей в блоге: 1

25.06.2019, 22:48

11

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

У меня вообщем ничего не стоит перед процедурой. Нет &НаСервере и &НаКлиенте.

ну не стоит и не стоит. где процедура выполняется, когда не стоит? в воздухе? вряд ли.
посмотрите, есть ли у вас на сервере диск Е, куда вы пытаетесь записать, и есть ли права на запись на него



0



4 / 4 / 0

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

Сообщений: 1,228

26.06.2019, 08:40

 [ТС]

12

dggrom, выдаёт ошибку Поле объекта не обнаружено (Documents)
Докум.Documents.SaveAs(ИмяФайла);

Добавлено через 2 минуты
Yulunga, Я же писал что диск есть, права есть



0



198 / 158 / 45

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

Сообщений: 807

26.06.2019, 10:02

13

Yulunga, у него метод записи самой не видет.

Ermak27, что за конфигурация, какие формы, управляемые или нет ?



0



4 / 4 / 0

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

Сообщений: 1,228

26.06.2019, 10:05

 [ТС]

14

dggrom, Не управляемые, Обычное приложение



0



1155 / 702 / 203

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

Сообщений: 5,215

Записей в блоге: 1

26.06.2019, 13:01

15

по мне так проблема в этом:
Докум=Word…
Word=Докум;
Докум=Word…

запутал с какой-то целью. поэтому и нет там сейвас, что применяется не к тому к чему надо. чехарда. имена переменных закончились?



0



4 / 4 / 0

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

Сообщений: 1,228

26.06.2019, 13:51

 [ТС]

16

Yulunga, я закомментировал Word=Докум;, теперь выдаёт ошибку Метод объекта не обнаружен (Range)
Докум = Word.Range(0,0);



0



Yulunga

1155 / 702 / 203

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

Сообщений: 5,215

Записей в блоге: 1

26.06.2019, 17:47

17

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Word =  Новый COMОбъект("Word.Application");
    word.Visible = 0;    
    word.Application.DisplayAlerts = ложь;
        
    Word.Documents.ADD();
    DocWord = Word.Documents.Open(ПутькФайлу);
    DocWord.Activate();
    
    DocWord.sections.item(1).footers.item(1).Range.Text = "Мой любимый документ";
 
    Word.Application.DisplayAlerts =-1; 
    
    Word.ActiveDocument.saveas(ПутькФайлу);
  
    word.Application.quit();

ну вот чем не код для рыбы. сейвас должен быть для активного документа



0



Ermak27

4 / 4 / 0

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

Сообщений: 1,228

27.06.2019, 11:22

 [ТС]

18

Yulunga, как мне мой код поправить?
Мне нужно чтобы два значение выводились на страницу.
Например: Страницу ворда я делю по пополам, получается при печати А5. Т.е есть в ТЗ 4 значение, то вордовский документ должен вывести две страницы, на каждой странице два значения. Приложил картинку.

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

1C
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Процедура КнопкаВыполнитьНажатие(Кнопка)
    
 
    
    Файл = "E:doc";
    //таблица
    Таблица = Новый ТаблицаЗначений();   // создаем таблицу    
    //колонки
    Таблица.Колонки.Добавить("Наименование"); //добавляем нетипизированную колонку
    Таблица.Колонки.Добавить("Индекс"); //добавляем колонку со строгим указанием типа     
    //строчки
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст1";  //указываем произвольное значение
    Строка.Индекс = "185001";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст11"; //указываем произвольное значение
    Строка.Индекс = "185001";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст2";  //указываем произвольное значение
    Строка.Индекс = "185002";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст22"; //указываем произвольное значение
    Строка.Индекс = "185002";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст3";  //указываем произвольное значение
    Строка.Индекс = "185003";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст33"; //указываем произвольное значение  
    Строка.Индекс = "185003";   //указываем произвольное значение
    Строка = Таблица.Добавить();   
    Строка.Наименование = "Текст333";    //указываем произвольное значение  
    Строка.Индекс = "185003";   //указываем произвольное значение 
    
    
    ТабДокумент  = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ";
    
    АктивныйДокумент = ПолучитьМакет("Макет");
    КомОбъект = АктивныйДокумент.Получить();
    
    
    Word = КомОбъект.Application;
    Док=Word.Documents(1);
    // Отключим проверку грамматики и вывод информации о грамматических ошибках.
    Док.GrammarChecked=0;
    Док.ShowGrammaticalErrors=0;
    
    Док.Activate();
    //Файл = "E:doc" + Индекс1 + "_" + КолЗаписей + ".doc";
    Word.Selection.WholeStory();
    Word.Selection.Copy();
    
    Счетчик = 0;
    
    Индекс1 = "";
    КолЗаписей = 0;
    
    //обход всей таблицы
    Для каждого Стр из Таблица Цикл
        Счетчик = Счетчик + 1;
 
        Если Индекс1 <> Стр.Индекс Тогда
            Если НЕ Индекс1=""  Тогда
                ЗаписатьФайл (Док,КолЗаписей,Индекс1,Файл); 
            КонецЕсли;
                
            ТабДокумент  = Новый ТабличныйДокумент;
            ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ";
            
            АктивныйДокумент = ПолучитьМакет("Макет");
            КомОбъект = АктивныйДокумент.Получить();
            
            
            Word = КомОбъект.Application;
            Док=Word.Documents(1);
            // Отключим проверку грамматики и вывод информации о грамматических ошибках.
            Док.GrammarChecked=0;
            Док.ShowGrammaticalErrors=0;
            
            Док.Activate();
            //Файл = "E:doc" + Индекс1 + "_" + КолЗаписей + ".doc";
            Word.Selection.WholeStory();
            Word.Selection.Copy();
            
            
            КолЗаписей = 0;
        КонецЕсли;         
        КолЗаписей = КолЗаписей + 1;
        
        Замена = Док.Content.Find;
        Замена.Execute("ЛС"+Счетчик,  Ложь, Истина, Ложь, , , Истина, , Ложь, Стр.Наименование);
        Замена = Док.Content.Find;
        Замена.Execute("Индекс"+Счетчик,  Ложь, Истина, Ложь, , , Истина, , Ложь, Стр.Индекс);
        
        Word.Selection.EndKey(6);
        
      Если Счетчик < Таблица.Количество() тогда
                Word.Selection.InsertBreak(7);
                Word.Selection.Paste();
     КонецЕсли;
                
        Индекс1 = Стр.Индекс;
    КонецЦикла;
    ЗаписатьФайл (Док,КолЗаписей,Индекс1,Файл);
 
    Word.Quit();
КонецПроцедуры
 
 
Процедура ЗаписатьФайл (Док,КолЗаписей,Индекс1,Файл)
     Док.SaveAs(Файл + ?(Прав(Файл,1)="","","") + Индекс1 + "_" + КолЗаписей + ".doc");
    Док.Close(0);
КонецПроцедуры

Можете подсказать как мне сделать чтобы два значения выводила.

Миниатюры

Word SaveAs 1c
 



0



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

В моем примере я заранее создал новый пустой документ.

Тестировалось на Office 2007.

Код 1C v 8.х

 
      
// "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.
// "Ссылка" - ДокументСсылка (в моем случае - счет).
Процедура ВыполнитьОбработку() Экспорт

Попытка
Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;
Word = Объект.Application;

Doc = Объект.Application.Documents(1);
Doc.Activate();

// Готовим переменную в которой будет содержимое нашего документа
// (текст, таблицы и проч).
Text = Word.S_election;

// Очистим документ
// Ctrl-A
Text.WholeStory();
// Del
Text.Delete(1, 1);
// Двигаемся на 3 строки ниже. Документ пустой, поэтому добавляем
// строки "Переводами коретки"

Text.TypeText(Символы.ВК);
Text.TypeText(Символы.ВК);
Text.TypeParagraph(); // другой вариант того же действия
// Выводим текст.
Text.TypeText("Обычный текст, набранный первую очередь");

// Курсор в конце строки
// Эмулируем нажатие Shift+Home - выделяем строку
Text.HomeKey(, 1);
// Форматирование выделенной строки
Text.Font.Bold = 9999998;
Text.Font.Size = 14;
Text.Font.Name = "Verdana";

// Сдвигаем курсор. Сдвинуть курсор по строкам возможно, только,
// если эти строки уже содержат текст, иначе ничего не произойдет.
Text.MoveUp(,2); // вверх на 2 строки
//Word.S_election.MoveDown(,числострок); // вниз
//Word.S_election.MoveLeft(,числострок); // влево
//Word.S_election.MoveRight(,числострок);// вправо

// Добавление текста. Текст выводится начиная с текщей позиции
// курсора.
Text.HomeKey(, 1);
Text.TypeText("Обычный текст, набранный во вторую очередь");

Text.MoveDown(,1); // вниз на 2 строки
Text.EndKey(); // в конец строки
Text.TypeParagraph(); // и в начало следующей строки

// Очищаем форматирование
Text.ClearFormatting();
// Добавляем таблицу.
// Получаем текущую позицию курсора
Position = Text.Range();

// Параметры: Позиция, число строк, число колонок,
// последние 2 параметра отвечают за автоподбор высоты и отображение
// границ таблицы
Table = Doc.Tables.Add(Position, 1, 6, 1, 2);

// Устанавливаем ширину колонок
Table.Columns(1).PreferredWidth=10;
Table.Columns(2).PreferredWidth=50;
Table.Columns(3).PreferredWidth=10;
Table.Columns(4).PreferredWidth=10;
Table.Columns(5).PreferredWidth=10;
Table.Columns(6).PreferredWidth=10;

// Задаем заголовки колонок
Row1=Table.Rows(1);
Row1.Cells(1).Range.Text="№ п/п";
Row1.Cells(2).Range.Text="Наименование";
Row1.Cells(4).Range.Text="Кол-во";
Row1.Cells(3).Range.Text="Ед. изм.";
Row1.Cells(5).Range.Text="Цена,руб.";
Row1.Cells(6).Range.Text="Сумма,руб.";

// Построчно выводим содержимое таблицы Товары
НомерСтроки = 1;
Для каждого СтрокаТовары Из Ссылка.Товары Цикл
Row=Table.Rows.Add();
Row.Cells(1).Range.Text=НомерСтроки;
// Выравнивание по левому краю
Row.Cells(1).Range.ParagraphFormat.Alignment = 1;
// В качестве текста можно передать только значение "простого" формата
// все агрегатные объекты, переданные как текст, что нормально для платформы 1с
// вызовут исключение.
Row.Cells(2).Range.Text=СтрокаТовары.Номенклатура.Наименование
+?(ЗначениеЗаполнено(СтрокаТовары.ХарактеристикаНоменклатуры),
" ("+СтрокаТовары.ХарактеристикаНоменклатуры+")","");
Row.Cells(4).Range.Text=Строка(СтрокаТовары.Количество);
Row.Cells(4).Range.ParagraphFormat.Alignment = 1;
Row.Cells(3).Range.Text=?(ЗначениеЗаполнено(СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения)
,СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения.Наименование,"-");
Row.Cells(3).Range.ParagraphFormat.Alignment = 1;
Row.Cells(5).Range.Text=Формат(СтрокаТовары.Цена,"ЧДЦ=2");
Row.Cells(5).Range.ParagraphFormat.Alignment = 1;
Row.Cells(6).Range.Text=Формат(СтрокаТовары.Сумма,"ЧДЦ=2");
Row.Cells(6).Range.ParagraphFormat.Alignment = 1;
НомерСтроки=НомерСтроки+1;
КонецЦикла;

// Задаем форматирование первой строки
// Если сделать это сразу, то все новые строки таблицы будут
// формироваться с тем же форматом
Row1.Range.Font.Bold = 9999998;
Row1.Range.Font.Size = 14;
Row1.Range.Font.Name = "Verdana";
Row1.Range.ParagraphFormat.Alignment = 1;

// Последняя строка...
Row = Table.Rows.Add();
Row.Range.Font.Bold = 9999998;
Row.Cells(1).Range.Text="Итого:";
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;

Попытка // эта конструкция выдает исключительную ситуацию, но при этом
// результат все-равно работает))
// объединяем ячейки в конце таблицы
Table.cell(НомерСтроки+1, 1).Merge(Table.cell(НомерСтроки+1, 5));
Исключение
КонецПопытки;

Попытка
Row.Cells(1).Range.ParagraphFormat.Alignment = 3;
Row.Cells(2).Range.Text=Формат(Ссылка.Товары.Итог("Сумма"), "ЧДЦ=2");
Row.Cells(2).Range.ParagraphFormat.Alignment = 1;

Doc.Save();
Объект.Application.Quit();
Объект = Неопределено;
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры

Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия — с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.

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

Для отображения закладок включите эту опцию в настройках вашего Word’а.

В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.

Код 1C v 8.х


Виртуальный 1С помощник

 Процедура ВыполнитьОбработку() Экспорт 
      

Попытка

//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:UsersNKrylovDesktopТест.docx");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;

ThisDocument = Word.Documents(1);
ThisDocument.Activate();

// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;

// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;

// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);

// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию

// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();

// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;

Bookmark = ThisDocument.Bookmarks("Закладка3");
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
Table.Rows(1).Cells(1).Range.Text = 1;
Table.Rows(1).Cells(2).Range.Text = 2;
Table.Rows(1).Cells(3).Range.Text = 3;
Table.Rows(1).Cells(4).Range.Text = 4;
Table.Rows(1).Cells(5).Range.Text = 5;

// После вывода таблицы, появится "лишняя строка", удалим ее
// в результате курсор встанет в область закладки 4
S_election.MoveDown(, 1);
S_election.Delete(1, 1);

// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();

// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)

// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.MoveUp(,4,1);

// Настроим шаблон объекта галереи списков
// Галереи списков бывают несккольких типов, 2 - нумерованные списки
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
// Формат нумератора списка - точка после символа нумерации
ListTemplate.NumberFormat = "%1.";
// стиль нумератора - арабские цифры
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
// 4 - маленькие латинские буквы.
// 2 - маленькие римские цифры.
// 58- меленькие русские буквы.
// Font = Template.Font; // можно указать форматирование текста списка

// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));

// Перейдем в конец текста
S_election.EndKey(6);

// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:UsersNKrylovDesktopНовый.bmp", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;

// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...

ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;

КонецПроцедуры

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

Selection.EndKey method (Word)

vbawd10.chm158663161

vbawd10.chm158663161

word

Word.Selection.EndKey

4f27681c-1117-99c2-1aba-bd97082bb8ba

06/08/2017

medium

Selection.EndKey method (Word)

Moves or extends the selection to the end of the specified unit.

Syntax

expression. EndKey( _Unit_ , _Extend_ )

expression Required. A variable that represents a Selection object.

Parameters

Name Required/Optional Data type Description
Unit Optional Variant The unit by which the selection is to be moved or extended. Can be a WdUnits constant. The default value is wdLine.
Extend Optional Variant Specifies the way the selection is moved. Can be any WdMovementType constant. If the value of this argument is wdMove, the selection is collapsed to an insertion point and moved to the end of the specified unit. If it is wdExtend, the end of the selection is extended to the end of the specified unit. The default value is wdMove.

Remarks

This method returns an integer that indicates the number of characters the selection or active end was actually moved, or it returns 0 (zero) if the move was unsuccessful. This method corresponds to functionality of the END key.

Example

This example moves the selection to the end of the current line and assigns the number of characters moved to the pos variable.

pos = Selection.EndKey(Unit:=wdLine, Extend:=wdMove)

This example moves the selection to the beginning of the current table column and then extends the selection to the end of the column.

If Selection.Information(wdWithInTable) = True Then 
 Selection.HomeKey Unit:=wdColumn, Extend:=wdMove 
 Selection.EndKey Unit:=wdColumn, Extend:=wdExtend 
End If

This example moves the selection to the end of the current story. If the selection is in the main text story, the example moves the selection to the end of the document.

Selection.EndKey Unit:=wdStory, Extend:=wdMove

See also

  • Selection object

[!includeSupport and feedback]

>
Word без компонентов
, добавление нескольких таблиц

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему

  


Сообщ.
#1

,
05.11.07, 11:04

    Поискал по форуму — подымался этот вопрос ни раз, но ответа так и не было.
    Вот код :

    ExpandedWrap disabled

      #include <ComObj.hpp>

      Variant Word, Doc, Table,Tables, Cell, Range;

        Word = CreateOleObject(«Word.Application.8»);

        Word.OlePropertySet(«Visible»,(Variant)true);

        Doc  = Word.OlePropertyGet(«Documents»);

        Doc.OleProcedure(«Add»);

        Doc = Word.OlePropertyGet(«Documents»).OleFunction(«Item», 1);

        Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row);

        Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row);

        Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row);

    Простенькое создание нескольких таблиц. Проблема в том что каждая последущая таблица рисуется в первой ячейке предыдещей таблицы :wall: :wall: :wall:

    Я решил эту проблему воспользовавшись компонентом TWordApplication, там после каждого создания таблицы выполнял :

    ExpandedWrap disabled

        OleVariant L=wdStory;

        WordApplication1->Selection->EndKey(L,EmptyParam);

    Так с компонентами тоже не всё в порядке — не хочет запускаться на лругих ПК :wall: :wall: :wall:


    Adil



    Сообщ.
    #2

    ,
    05.11.07, 11:38

      Дима, эти вопросы поднимались уже не раз. В ворде записываешь макрос и переводишь с бейсика на ole :)
      Здесь, скорее всего, тебе всего и надо-то записать то, что получается при нажатии Ctrl+End — перевод каретки в конец документа после создания таблицы.


      Дима



      Сообщ.
      #3

      ,
      05.11.07, 12:07

        Цитата

        записываешь макрос и переводишь с бейсика на ole

        Читал об этом только конечных решений этого не видел.
        Сам пытался. На Basik получилось:

        ExpandedWrap disabled

          Sub End()

              Selection.EndKey Unit:=wdStory

          End Sub

        В переводе на OLE — это переход в конец документа.
        Откуда берут эти значения для OLE я не допёр. По форуму нашёл вот такой перевод в конец :

        ExpandedWrap disabled

          Word.OlePropertyGet(«Selection»).OleFunction(«EndKey»,wdStory,EmptyParam);

        Ставил его перед и после каждого создания таблицы — НИЧЕГО не получилось.

        Как правильно сделать подскажаите, пожалуйста?

        Сообщение отредактировано: Дима — 05.11.07, 12:09

        Wizard

        Bas



        Сообщ.
        #4

        ,
        05.11.07, 12:56

          Цитата Дима @ 05.11.07, 12:07

          Откуда берут эти значения для OLE я не допёр.

          ExpandedWrap disabled

            Word_2K.h

            ….

            typedef enum WdUnits

            {

              wdCharacter = 1,

              wdWord = 2,

              wdSentence = 3,

              wdParagraph = 4,

              wdLine = 5,

              wdStory = 6,

              wdScreen = 7,

              wdSection = 8,

              wdColumn = 9,

              wdRow = 10,

              wdWindow = 11,

              wdCell = 12,

              wdCharacterFormatting = 13,

              wdParagraphFormatting = 14,

              wdTable = 15,

              wdItem = 16

            } WdUnits;


          Дима



          Сообщ.
          #5

          ,
          05.11.07, 13:03

            Bas, а куда это вставлять? :wacko:

            Вообще вот эта вещь :

            ExpandedWrap disabled

              Word.OlePropertyGet(«Selection»).OleFunction(«EndKey»,wdStory,EmptyParam);

            переводит курсор в конец документа. Это я таблицы как-то так криво вставляю. Видимо вот это :

            ExpandedWrap disabled

               Doc.OleFunction(«Range»,0,0)

            указывает вставлять таблицу сначала документа. Пытался делать вот такое:

            ExpandedWrap disabled

                 Variant isRange = Doc.OleFunction(«Range»,0,0);

                 Range = Doc.OleFunction(«Range»,isRange.OlePropertyGet(«End»),isRange.OlePropertyGet(«End»));

                 Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Range, Col, Row);

            На второй строчке вылетает ошибка (просто исключительная ситуация и окно с текстом «ошибка»).

            Добавлено 05.11.07, 13:32
            Bas, я имел ввиду где можно взять описание как выполнять при помощи OLE разные действия с Word-ом?
            Где описано что вот так отрывать Word:

            ExpandedWrap disabled

              Variant  Word = CreateOleObject(«Word.Application.8»);

            ???

            Где описано что вот так таблицу создавать :

            ExpandedWrap disabled

              Doc  = Word.OlePropertyGet(«Documents»);

                Doc.OleProcedure(«Add»);

                Doc = Word.OlePropertyGet(«Documents»).OleFunction(«Item», 1);

                Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row);

            ???

            Где можно почитать как текст вставлять, его стиль и шрифт менять?


            Adil



            Сообщ.
            #6

            ,
            05.11.07, 13:42

              Цитата Дима @ 05.11.07, 13:03

              Где описано что вот так отрывать Word:
              Variant Word = CreateOleObject(«Word.Application.8»);

              Ну, именно это надо просто один раз запомнить.

              Цитата Дима @ 05.11.07, 13:03

              Где описано что вот так таблицу создавать :

              Цитата Дима @ 05.11.07, 13:03

              Где можно почитать как текст вставлять, его стиль и шрифт менять?

              А всё остальное — перевод макросов. К сожалению, сейчас нету под рукой экселя — попробуй записать макрос вставки своих таблиц (полностью, т.е. вставка таблицы, переход в конец в документа, вставка следующей таблицы) и приведи его здесь.
              Кстати, посмотри и приведи тут, описание метода Tables.Add из справки Экселя.


              Дима



              Сообщ.
              #7

              ,
              05.11.07, 13:51

                Adil, допустим даже если разбераться в Basic, то как всё-таки прикрутить эти операции к OLE в Builder?
                Вот код того как вставлется одна таблица, потом переводится курсор в конец документа + жму Enter, далее вставляю след. табл. :

                ExpandedWrap disabled

                  Sub Макрос1()

                      ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _

                          5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _

                          wdAutoFitFixed

                      With Selection.Tables(1)

                          If .Style <> «Сетка таблицы» Then

                              .Style = «Сетка таблицы»

                          End If

                          .ApplyStyleHeadingRows = True

                          .ApplyStyleLastRow = True

                          .ApplyStyleFirstColumn = True

                          .ApplyStyleLastColumn = True

                      End With

                      Selection.EndKey Unit:=wdStory

                      Selection.TypeParagraph

                      ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _

                          5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _

                          wdAutoFitFixed

                      With Selection.Tables(1)

                          If .Style <> «Сетка таблицы» Then

                              .Style = «Сетка таблицы»

                          End If

                          .ApplyStyleHeadingRows = True

                          .ApplyStyleLastRow = True

                          .ApplyStyleFirstColumn = True

                          .ApplyStyleLastColumn = True

                      End With

                  End Sub

                Мне надо бы в С++ написать вот этот кусочек :

                ExpandedWrap disabled

                      Selection.EndKey Unit:=wdStory

                      Selection.TypeParagraph

                Wizard

                Bas



                Сообщ.
                #8

                ,
                05.11.07, 14:30

                  Основная трудность превода в том что ворд вставляет Selection куда не поподя. Поэтому надо явно поределять выделенную область методом Range.
                  Второй вариант попробуйте вставить тексть или как в макросе новый праграф после созданной таблицы (InsertAfter) а потом уж вставить таблицу.


                  Дима



                  Сообщ.
                  #9

                  ,
                  05.11.07, 14:36

                    Цитата

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

                    Bas, это первое что я пробовал. Курсор нормально перемещаетсяв конец документа, а вот таблица вставляется в начало :wacko:

                    Я вставляю таблицу вот так:

                    ExpandedWrap disabled

                      Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row);

                    Из сего видно что я сам принудительно пишу с начала документа — Doc.OleFunction(«Range»,0,0).

                    Как задать этот Range так чтоб писалось в конце документа?
                    Пробовал туда Selection передать — так пишет несовпадение типов.

                    Ещё по ходу дела вопрос — как менять размер и имя шрифта?
                    Basic выдал вот это :
                    Selection.Font.Size = 14
                    Как это прикрутить к OLE в Builder?

                    Сообщение отредактировано: Дима — 05.11.07, 14:37

                    Wizard

                    Bas



                    Сообщ.
                    #10

                    ,
                    05.11.07, 14:59

                      Вот древний код, даже незнаю рабочий ли он (дааааавно это было)

                      ExpandedWrap disabled

                        void __fastcall TForm1::WordApplicationDocumentChange(TObject *Sender)

                        {

                        WordDocument1->ConnectTo(WordApplication1->ActiveDocument);

                        //WordApplication1->Selection->SetRange(1,20);

                        WordApplication1->Selection->InsertAfter(TVariant(«nПереход к документу  :»+TVariant(WordApplication1->ActiveDocument->Name)));

                        long s=WordApplication1->Selection->get_Start();

                        long e=WordApplication1->Selection->get_End();

                        WordApplication1->Selection->SetRange(s,e);

                        WordApplication1->Selection->InsertAfter(TVariant(«n произведен          :»+DateTimeToStr(Now())));

                        s=WordApplication1->Selection->get_Start();

                        e=WordApplication1->Selection->get_End();

                        WordApplication1->Selection->SetRange(s,e);

                        WordApplication1->Selection->InsertAfter(TVariant(«n пользователь        :»+TVariant(WordApplication1->Get_UserName())));

                        s=WordApplication1->Selection->get_Start();

                        e=WordApplication1->Selection->get_End();

                        WordApplication1->Selection->SetRange(s,e);

                        WordApplication1->Selection->InsertAfter(TVariant(«n Printer :»+TVariant(WordApplication1->Get_ActivePrinter())));

                        s=WordApplication1->Selection->get_Start();

                        e=WordApplication1->Selection->get_End();

                        WordApplication1->Selection->SetRange(s,e);

                        WordApplication1->Selection->InsertAfter(TVariant(«n Path :»+TVariant(WordApplication1->Get_Path())));

                        }

                        //—————————————————————————


                      Дима



                      Сообщ.
                      #11

                      ,
                      05.11.07, 15:08

                        Bas, с компонентами у меня в этом плане проблем нет, спасибо. Как без компонентов реализовать встаку таблицы в конце документа?
                        Может есть другой способ вставки не требующий параметра Range?

                        Или что поставить в Range чтоб таблица прорисовалась в конце документа?

                        :wall: :wall: :wall: :wall:

                        Добавлено 05.11.07, 15:20
                        СДЕЛАЛ!!!! :tong:

                        Вот кому надо весь код вставки нескольких таблиц подряд. Нормально подряд:

                        ExpandedWrap disabled

                          Variant Word, Doc, Selection;

                            Word = CreateOleObject(«Word.Application.8»);

                            Word.OlePropertySet(«Visible»,(Variant)true);

                            Doc  = Word.OlePropertyGet(«Documents»);

                            Doc.OleProcedure(«Add»);

                            Doc = Word.OlePropertyGet(«Documents»).OleFunction(«Item», 1);

                            Selection = Word.OlePropertyGet(«Selection»);

                            //курсор в конец документа

                            Selection.OleFunction(«EndKey»,wdStory,EmptyParam);

                            //новый параграф

                            Selection.OleFunction(«TypeParagraph»);

                            Doc.OlePropertyGet(«Tables»).OleFunction(«Add»,Selection.OlePropertyGet(«Range»),Col, Row);  

                            //курсор в конец документа

                            Selection.OleFunction(«EndKey»,wdStory,EmptyParam);

                            //новый параграф

                            Selection.OleFunction(«TypeParagraph»);

                            Doc.OlePropertyGet(«Tables»).OleFunction(«Add»,Selection.OlePropertyGet(«Range»),Col, Row);  

                            // и т.д.


                        Adil



                        Сообщ.
                        #12

                        ,
                        06.11.07, 07:42

                          Ну, вот видишь как все просто оказалось. Кстати, если в басике функция не функция :) а процедура — т.е. ничего не возвращает, то можно использовать OleProcedure вместо OleFunction

                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                          0 пользователей:

                          • Предыдущая тема
                          • Borland C++ Builder/Turbo C++ Explorer
                          • Следующая тема

                          [ Script execution time: 0,0405 ]   [ 16 queries used ]   [ Generated: 13.04.23, 19:24 GMT ]  

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          #1

                          27.12.2015 17:39:43

                          Добрый день,
                          в Excel-файле создаю Word-документ и вставляю в него текст из разных источников. После создания документа в нем всегда оказываются в конце 2 пустые строки. Нужно их удалить. Записал макрос в Word, получилось:

                          Код
                          Selection.EndKey Unit:=wdStory
                          Selection.Delete Unit:=wdCharacter, Count:=1

                          а как это перенести в Excel — не знаю. Один к одному не получается
                          пробовал Selection менять на Range и EndKey на EndOf — ничего не получилось.

                          Код
                          wd1.Range.EndOf
                          wd1.Range.Delete

                          стерло все содержимое…
                          В интернете ничего вразумительного не нашел.
                          Подскажите, пожалуйста, как в макросе Excel перейти в конец документа Word и удалить две последние строки.

                           

                          The_Prist

                          Пользователь

                          Сообщений: 14181
                          Регистрация: 15.09.2012

                          Профессиональная разработка приложений для MS Office

                          #2

                          27.12.2015 17:45:51

                          Цитата
                          vadi61 написал: В интернете ничего вразумительного не нашел.

                          Как из Excel обратиться к другому приложению

                          Особое внимание уделить разъяснению различий между ранним и поздним связыванием и применением именованных констант(в Вашем случае это wdCharacter и wdStory). Плюс обратите внимание на ГЛАВНУЮ ОШИБКУ НОВИЧКА — Ваш случай. Selection есть в Excel и в Word и без явного указания родителя будет относится к приложению, в котором записано.

                          Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                           

                          SuperCat

                          Пользователь

                          Сообщений: 2737
                          Регистрация: 21.12.2012

                          #3

                          27.12.2015 18:28:09

                          Просто надо использовать переменную приложения Word:

                          Код
                          Sub G()
                          
                              Dim wdApp As Word.Application
                              Set wdApp = New Word.Application
                              
                              'Какой-то код....
                              
                              wdApp.Selection.EndKey Unit:=wdStory
                              wdApp.Selection.Delete Unit:=wdCharacter, Count:=1
                          
                          End Sub
                          
                          
                          

                          В данном случае wdStory распознается, так как я использую раннее связывание (Early Binding).

                          Изменено: SuperCat27.12.2015 18:29:31

                          There is no knowledge that is not power

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          #4

                          27.12.2015 19:16:04

                          The_Prist,
                          спасибо, прочел. Я в принципе так и делал:

                          Код
                          Sub main()   
                          Dim wa As Object
                          Dim wd1 As Object
                          ...
                          ...
                          Set wa = CreateObject("Word.Application")
                          ...
                          Set wd1 = wa.Documents.Open(HomeDir$ + fileRes_name$)
                          ....
                          wd1.Close True
                          wa.Quit
                          Set wa = Nothing
                          End Sub

                          и здесь перед закрытием wd1 из него надо удалить две последние строки.

                          SuperCat,
                          спасибо за ответ,
                          к сожалению на первой же строке wdApp.Selection.EndKey Unit:=wdStory (в моем случае wd1.Selection.EndKey Unit:=wdStory) выдает ошибку.

                          Т.е. ошибка, видимо, потому, что значения констант wdStory и wdCharacter Еxcel’ю при позднем связывании неизвестны. А как их узнать, что бы задать цифрой?

                          Нет ошибка не в этом. Нашел значение константы wdStory

                          здесь

                          но все равно ошибка.

                          Изменено: vadi6127.12.2015 19:29:37

                           

                          The_Prist

                          Пользователь

                          Сообщений: 14181
                          Регистрация: 15.09.2012

                          Профессиональная разработка приложений для MS Office

                          #5

                          27.12.2015 19:28:21

                          Цитата
                          vadi61 написал: прочел
                          Цитата
                          vadi61 написал: А как их узнать, что бы задать цифрой?

                          как же Вы читали?

                          Цитата
                          Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения к коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание. Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение

                          Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          #6

                          27.12.2015 19:36:27

                          The_Prist, сделал как Вы сказали. Получил значения констант wdStory = 6, wdCharacter = 1
                          вставил этот код в макрос Excel’я:

                          Код
                          wd1.Selection.EndKey Unit:=6
                          wd1.Selection.Delete Unit:=1, Count:=1

                          Ошибка: Объект не поддерживает свойство или метод

                           

                          The_Prist

                          Пользователь

                          Сообщений: 14181
                          Регистрация: 15.09.2012

                          Профессиональная разработка приложений для MS Office

                          #7

                          27.12.2015 19:43:54

                          Я бы вообще отказался от Selection ибо вредно это. Вполне можно вместо него использовать Range:

                          Код
                          wd1.Range.EndKey 6 
                          wd1.Range.Delete 1, 1

                          ну а вообще без полного кода трудно гадать. Да и примеры не помешали бы…

                          Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          The_Prist, та же ошибка на строке wd1.Range.EndKey 6 «Объект не поддерживает свойство или метод»

                           

                          The_Prist

                          Пользователь

                          Сообщений: 14181
                          Регистрация: 15.09.2012

                          Профессиональная разработка приложений для MS Office

                          #9

                          27.12.2015 19:48:48

                          Цитата
                          The_Prist написал: Да и примеры не помешали бы

                          Хочется увидеть, что именно Вы таким образом хотите удалить. Может есть другие методы — надежнее.

                          Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                           

                          The_Prist

                          Пользователь

                          Сообщений: 14181
                          Регистрация: 15.09.2012

                          Профессиональная разработка приложений для MS Office

                          #10

                          27.12.2015 19:55:18

                          Например, можно два раза эту строку выполнить:

                          Код
                          wd1.Range(wd1.Range.Characters.Count - 1, wd1.Range.Characters.Count).Delete 1, 1

                          или один раз такую:

                          Код
                          wd1.Range(wd1.Range.Characters.Count - 1, wd1.Range.Characters.Count).Delete 1, 2

                          Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          The_Prist, изумительно. Большое спасибо. Попробовал второй вариант с одной строкой — получилось.
                          Пошел разбираться с Вашим кодом (нужно же понимать, что делаешь :) )

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          The_Prist, обнаружил ошибку. Удаляются символы не последние, а сдвинутые на количество картинок в файле.
                          1 картинка — удаляет 2-й и 3-й символы с конца (тут все нормально поскольку 3 последних символа — конец абзаца)

                          А вот дальше так:
                          2 картинки — удаляет 3-й и 4-й символы с конца
                          3 картинки — удаляет 4-й и 5-й символы с конца
                          4 картинки — удаляет 5-й и 6-й символы с конца
                          5 картинки — удаляет 6-й и 7-й символы с конца и т. д.

                          Может быть знаете как ее обойти?

                          Изменено: vadi6110.01.2016 03:49:41

                           

                          Андрей VG

                          Пользователь

                          Сообщений: 11878
                          Регистрация: 22.12.2012

                          Excel 2016, 365

                          #13

                          10.01.2016 06:07:42

                          Цитата
                          vadi61 написал: в нем всегда оказываются в конце 2 пустые строки

                          А не мудрите ли вы? Если под пустыми строками подразумевается параграфы (всё что получается при нажатии кнопки Enter), то проще так. В примере в документе Word. Удаляет пустые параграфы (в том числе состоящие из одних пробелов).

                          Успехов.

                          Прикрепленные файлы

                          • Удалить_пустые.zip (15.7 КБ)

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          Андрей VG,спасибо за ответ. Но это же Word! А мне нужно из Excel в вордовском файле строки удалять… У меня нет доступа к получившемуся Word-файлу.

                           

                          Андрей VG

                          Пользователь

                          Сообщений: 11878
                          Регистрация: 22.12.2012

                          Excel 2016, 365

                          #15

                          10.01.2016 11:58:47

                          Цитата
                          vadi61 написал: У меня нет доступа к получившемуся Word-файлу.

                          Это вы серьёзно — или шутка? Тогда это что?

                          Цитата
                          vadi61 написал: Set wd1 = wa.Documents.Open(HomeDir$ + fileRes_name$)

                          Разве не доступ к документу Word? Чтобы использовать в моём коде этот документ достаточно заменить ThisDocument на wd1. Естественно, перенеся код в процедуре, в код книги.
                          Вопрос у вас, по существу, о работе с Word, а уж откуда: из VBA проекта документа Word, из VBA проекта книги Excel или даже VBA проекта чертежа Autocad — нет разницы. Точнее, в способе доступа к Word Application и предоставляемому библиотекой на уровне документа Word доступу к объекту ThisDocument.

                          Успехов.

                           

                          The_Prist

                          Пользователь

                          Сообщений: 14181
                          Регистрация: 15.09.2012

                          Профессиональная разработка приложений для MS Office

                          А я вообще не понял про картинки и символы. Может настало время реально примера с данными, а не на словах описывать проблемы? Скорее соглашусь с Андреем — здесь явно нужен иной подход.

                          Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          The_Prist,  согласен. Как только доберусь до компьютера — подготовлю пример. Пока только два слова о самОй подготовке Word-файла. Сотрудник открывает Excel-файл, выбирает нужные значения из комбобоксов, устанавливает нужные переключатели, вводит какие-то значения. На основании этих данных Excel готовит данные для вставки в отчет. Потом при нажатии кнопки СОЗДАТЬ вызывается макрос, который выбирает нужные (из заранее подготовленных) шаблонов, вставляет в них данные, а затем соединяет несколько  файлов-шаблонов в один готовый отчет. К этому отчету я доступа не имею, то есть все я должен сделать в Excel-макросе.
                          Все сейчас работает нормально с Вашей
                          wd1.Range(wd1.Range.Characters.Count — 1, wd1.Range.Characters.Count).Delete 1, 2
                          Но как только в отчете оказывается картинки (есть шаблоны с картинками) удаляемый символ смещается влево на число символов равное количеству картинок.
                          Например, в конце отчета написано
                          12345
                          символ конца  строки 1
                          символ конца строки 2
                          Если в отчете картинок нет, то удалятся два символа конца строки.
                          А если в отчете есть, скажем, 3 картинки, то удалятся числа 3 и 4
                          Но я сегодня выложу пример.

                          Изменено: vadi6110.01.2016 14:05:41

                           

                          The_Prist

                          Пользователь

                          Сообщений: 14181
                          Регистрация: 15.09.2012

                          Профессиональная разработка приложений для MS Office

                          Так может имеет смысл сначала проверять наличие картинок и их кол-во?
                          wd1.Shapes.count

                          Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          The_Prist, да, все решилось такой строкой
                          wd1.Range(wd1.Range.Characters.Count + wd1.Shapes.Count — 1, wd1.Range.Characters.Count + wd1.Shapes.Count).Delete 1, 2
                          Спасибо, еще раз!

                          PS. Готовить файлы примеров уже нет необходимости.

                          Изменено: vadi6110.01.2016 15:06:09

                           

                          vadi61

                          Пользователь

                          Сообщений: 236
                          Регистрация: 03.09.2014

                          #20

                          10.01.2016 15:23:02

                          The_Prist, я на параллельном форуме нашел Ваш совет от октября 2014 года, где Вы используете выражение Range.End

                          Вставил в свой код

                          Код
                          wd1.Range(wd1.Range.End - 1, wd1.Range.End).Delete 1, 2

                          и сработало вне зависимости от количества картинок.

                          Понравилась статья? Поделить с друзьями:
                        • 1с excel формат файла не поддерживается
                        • 1с excel построитель отчета
                        • 1с excel ошибка метода контекст open
                        • 1с excel не устанавливая
                        • 1с excel методы доступа