Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Ципихович Эндрю
1417 / 326 / 29
Регистрация: 10.04.2009
Сообщений: 5,246
1

Долго делает макрос: поля выкрашеные не в синий цвет меняем на белый цвет

26.04.2017, 10:09. Просмотров 355. Ответов 9
Метки нет (Все метки)

Visual Basic
1
2
3
4
5
6
7
8
9
10
 'перед печатью поля выкрашеные не в синий цвет меняем на белый цвет, чтобы они не были видны
    For i = 1 To ActiveDocument.Fields.Count
        '"-16777216" = wdColorBlack = чёрный цвет
        '"16711680" = wdColorBlue = синий цвет
        '"16777215" = wdColorWhite = белый цвет
        If ActiveDocument.Fields(i).Type = 51 And _
           ActiveDocument.Range(ActiveDocument.Fields(i).Code.Start, ActiveDocument.Fields(i).Result.End).Font.Color <> 16711680 Then
            ActiveDocument.Range(ActiveDocument.Fields(i).Code.Start, ActiveDocument.Fields(i).Result.End).Font.Color = wdColorWhite
        End If
    Next i
здравствуйте, полей всего 150 штук и на мой взгляд делает долговато около 3 секунд, может есть другой подход?

Добавлено через 4 часа 1 минуту
видимо надо воспользоваться мыслью:
'последовательный проход по коллекции итератором быстрее, чем обращение к произвольному элементу по индексу
'For x In - переменная x называется итератором, объектом, в котором содержится ссылка на очередной элемент коллекции/массива
'For x = - переменная x называется индексом, порядковым номером произвольного элемента коллекции/массива
так ???
Visual Basic
1
2
3
4
5
6
7
8
Dim i As Fields
 
    For Each i In ActiveDocument.Fields
        If ActiveDocument.Fields(i).Type = 51 And _
           ActiveDocument.Range(ActiveDocument.Fields(i).Code.Start, ActiveDocument.Fields(i).Result.End).Font.Color <> 16711680 Then
            ActiveDocument.Range(ActiveDocument.Fields(i).Code.Start, ActiveDocument.Fields(i).Result.End).Font.Color = wdColorWhite
        End If
    Next i
что то не взлетело, или где ошибся?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2017, 10:09
Ответы с готовыми решениями:

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

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

Макрос раздела отчета: Хочу изменить цвет шрифта у поля
Есть таблица «информация о сотрудниках», содержит роля: код сотрудника, ФИО, Оклад. --Есть...

меняем цвет формы
Здравствуйте! Помогите кто можит пожалуйста! На форме 3 СкролБара (ргб) Нужно стобы цвет формы...

9
toiai
3183 / 938 / 216
Регистрация: 29.05.2010
Сообщений: 2,044
26.04.2017, 10:46 2
Ведь i уже объект:
Visual Basic
1
2
3
4
5
6
7
8
Dim i As Fields
 
    For Each i In ActiveDocument.Fields
        If i.Type = 51 And _
           ActiveDocument.Range(i.Code.Start, i.Result.End).Font.Color <> 16711680 Then
            ActiveDocument.Range(i.Code.Start, i.Result.End).Font.Color = wdColorWhite
        End If
    Next i
1
Ципихович Эндрю
1417 / 326 / 29
Регистрация: 10.04.2009
Сообщений: 5,246
26.04.2017, 12:26  [ТС] 3
что-то ругается на If i.Type = 51, что тут не так? спасибо
0
toiai
3183 / 938 / 216
Регистрация: 29.05.2010
Сообщений: 2,044
26.04.2017, 14:53 4
Недосмотрел
Visual Basic
1
Dim i As Field
0
Step_UA
1549 / 628 / 219
Регистрация: 09.06.2011
Сообщений: 1,290
26.04.2017, 14:56 5
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
что тут не так?
Visual Basic
1
Dim i As Field ' без s
... еще можно не вычислять дважды диаппазон
1
Ципихович Эндрю
1417 / 326 / 29
Регистрация: 10.04.2009
Сообщений: 5,246
26.04.2017, 16:45  [ТС] 6
Цитата Сообщение от Step_UA Посмотреть сообщение
еще можно не вычислять дважды диаппазон
извините не понял, это как?
0
Step_UA
1549 / 628 / 219
Регистрация: 09.06.2011
Сообщений: 1,290
26.04.2017, 16:50 7
Visual Basic
1
2
3
4
5
6
7
8
9
Dim i As Field
 
    For Each i In ActiveDocument.Fields
        If i.Type = 51 then
            with ActiveDocument.Range(i.Code.Start, i.Result.End).Font
                if .Color <> 16711680 Then .Color = wdColorWhite
            end with
        end if
    Next i
0
Ципихович Эндрю
1417 / 326 / 29
Регистрация: 10.04.2009
Сообщений: 5,246
26.04.2017, 17:09  [ТС] 8
то есть когда пишем
Цитата Сообщение от Step_UA Посмотреть сообщение
with
то это называется
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
не вычислять дважды диаппазон
так что-ли?

Добавлено через 9 минут
просто я думал, что это влияет только на читаемость кода и всё....
0
Step_UA
1549 / 628 / 219
Регистрация: 09.06.2011
Сообщений: 1,290
26.04.2017, 17:10 9
У Вас в коде изначально происходит вычисление диаппазона для проверки установленного цвета, а затем вычисляется этот же диаппазон (от начала кода поля до конца результата поля) для его задания.
В with получаем объект (единожды) и затем обращаемся к нему ...
0
Ципихович Эндрю
1417 / 326 / 29
Регистрация: 10.04.2009
Сообщений: 5,246
26.04.2017, 17:21  [ТС] 10
смысл сделанного:
перед печатью поля выкрашеные не в синий цвет меняем на белый цвет, чтобы они не были видны
печатаем
после печати поля выкрашеные в белый цвет меняем на чёрный цвет, чтобы они были видны
всё равно делает долго
и что удивляет зрительно смотришь сначала
поля меняет с чёрного на белый
потом меняет с белого на чёрный
потом печатает
а по идее печатать дожно между сменами цвета полей, этого не происходит.....
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    'перед печатью поля выкрашеные не в синий цвет меняем на белый цвет, чтобы они не были видны
    For Each PoleField In ActiveDocument.Fields
        If PoleField.Type = 51 Then
            With ActiveDocument.Range(PoleField.Code.Start, PoleField.Result.End).Font
                If .Color <> 16711680 Then .Color = 16777215
            End With
        End If
    Next PoleField
 
    'шрифт выделенного текста чёрным цветом не делаем, так как в карточке много знаков "_" окрашенных белым цветом
    'выделение цветом - нет
    ActiveDocument.Range.HighlightColorIndex = wdNoHighlight
    'печать
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _
                         wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _
                         ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:= _
                         False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
                         PrintZoomPaperHeight:=0
 
    FunctionПоляВыкрашеныеБелымЦветомМеняемНаЧёрныйЦвет
может ещё можно упростить?
0
26.04.2017, 17:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2017, 17:21

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

меняем цвет формы
Здравствуйте! Помогите кто можит пожалуйста! На форме 3 СкролБара (ргб) Нужно стобы цвет формы...

Меняем цвет ячеек стрингрида
Помогите пожалуйста) неодходимо чтобы при нажатии на какую либо ячейку стрингграда она...

Меняем цвет графиков в Zedgraph
Есть Zedgraph. При построении указывается массив времени, массив значений Y, цвет будущей кривой:...

Меняем цвет фона с заданным интервалом
Здравствуйте, вуду программирования )))))) Подскажите пожалуйста по поводу 1 вопроса: ...


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

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

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