Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2010, 00:54   #1
Fiesta200
Пользователь
 
Регистрация: 15.06.2010
Сообщений: 35
По умолчанию Выбор цвета

У меня есть простенький макрос, который упрощает мне работу с таблицами (не надо кучу раз лазить в меню). Задача его такова: на выделенную ячейку таблицы макрос сначала делает цвет для текста (зеленый, скажем), потом еще раз вызывается меню «Границы и заливки» и тот же цвет задается абзацу.

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

Каким образом может макрос задать пользователю вопрос, какой цвет применить? То есть, надо, чтобы вызывалась на экран менюха Границы (с выставленными всеми параметрами), где надо указать цвет (первый раз — для текста, для абзаца — цвет тот же автоматич. должен быть применен). Это может быть просто окно Палитры цветов.

Такая прибамбасина точно есть в Фотошопе (Спросить параметр у пользователя). Есть что-либо подобное в VB?
Fiesta200 вне форума Ответить с цитированием
Старый 14.07.2010, 15:41   #2
Fiesta200
Пользователь
 
Регистрация: 15.06.2010
Сообщений: 35
По умолчанию

Вот что хочется получить (такое окошко с палитрой): http://www.functionx.com/vbnet/controls/colordialog.htm
Но как именно внедрить в макрос — я не знаю. У меня постоянно выбивает ошибку.
Fiesta200 вне форума Ответить с цитированием
Старый 14.07.2010, 16:26   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Держи готовый код.
Код:
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function ChooseColorAPI Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long

Private Type POINTAPI
        x As Long
        y As Long
End Type

Private Type CHOOSECOLOR
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        rgbResult As Long
        lpCustColors As String
        flags As Long
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
End Type


Dim CustomColors() As Byte
Dim CursorPos As POINTAPI

Function SelectColor() As Long
    Dim cc As CHOOSECOLOR
    Dim Custcolor(16) As Long
    Dim lReturn As Long
    Dim i As Integer
    
    ReDim CustomColors(0 To 16 * 4 - 1) As Byte
    
    For i = LBound(CustomColors) To UBound(CustomColors)
        CustomColors(i) = 0
    Next i
    GetCursorPos CursorPos
    With cc
      .lStructSize = Len(cc)
      .hwndOwner = WindowFromPoint(CursorPos.x, CursorPos.y)
      .hInstance = 0
      .lpCustColors = StrConv(CustomColors, vbUnicode)
      .flags = 0
    End With
    
    lReturn = ChooseColorAPI(cc)
    
    If lReturn <> 0 Then
        SelectColor = cc.rgbResult
    Else
        SelectColor = -1
    End If
End Function
Функция SelectColor. Возвращает номер цвета, выбранный в диалоге. Если нажали "Отмена", то вернёт -1.
Взято отсюда и немного изменено.
Дополнительные параметры диалога: цвет по умолчанию, пользовательские цвета, развёрнутый или свёрнутый и т.д. находятся здесь
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 14.07.2010, 17:51   #4
Fiesta200
Пользователь
 
Регистрация: 15.06.2010
Сообщений: 35
По умолчанию

Спасибо, viter.alex.
Отдельно - работает на ура. А в макросе - нет.
Наверное, я крыво что-то вставляю.
Этот выбранный цвет должен быть как значение для BackgroundPatternColor.

Речь идет о:

PHP код:
Sub Table_color_cell()
'Makros
    With Selection.ParagraphFormat.Shading
        .Texture = wdTextureNone
        .ForegroundPatternColor = wdColorAutomatic
        .BackgroundPatternColor = wdColorTurquoise
    End With
    With Options
        .DefaultBorderLineStyle = wdLineStyleSingle
        .DefaultBorderLineWidth = wdLineWidth050pt
        .DefaultBorderColor = wdColorAutomatic
    End With
    With Selection.Cells
        With .Shading
            .Texture = wdTextureNone
            .ForegroundPatternColor = wdColorAutomatic
            .BackgroundPatternColor = wdColorTurquoise
        End With
        With .Borders(wdBorderLeft)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderRight)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderTop)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderBottom)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderVertical)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
        .Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
        .Borders.Shadow = False
    End With
    With Options
        .DefaultBorderLineStyle = wdLineStyleSingle
        .DefaultBorderLineWidth = wdLineWidth050pt
        .DefaultBorderColor = wdColorAutomatic
    End With
End Function 
Fiesta200 вне форума Ответить с цитированием
Старый 14.07.2010, 21:43   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Fiesta200 Посмотреть сообщение
…Этот выбранный цвет должен быть как значение для BackgroundPatternColor…
Читаем справку:
Цитата:
Returns or sets the 24-bit color that's applied to the background of the Shading object. Read/write.
Syntax

expression.BackgroundPatternColor

expression Required. A variable that represents a Shading object.

Remarks


This property can be any valid WdColor constant or a value returned by Visual Basic's RGB function.
Т.е. всё правильно. Моя функция тоже возвращает число, как и RGB. Пробую ещё раз у себя:
Код:
Sub test()
  Dim nColor As Long
  nColor = SelectColor
  If nColor >= 0 Then
    Selection.Shading.BackgroundPatternColor = nColor
  End If
End Sub
Всё работает
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 14.07.2010, 23:46   #6
Fiesta200
Пользователь
 
Регистрация: 15.06.2010
Сообщений: 35
По умолчанию

Что-то у меня долго не получалось, но в конце концов заработал макрос.
Искреннее признательное спасибо!!!!



А вот такой вопрос в плане улучшения существующего: можна, чтобы выбор цвета на вкладке производился двойным щелчком мышки по ячейке (не нажимая Ок)? Возможно, это невозможно посредством макроса, так как алгоритм работы КаларДиалог не зависит от желаний VB?..
Fiesta200 вне форума Ответить с цитированием
Старый 16.07.2010, 20:53   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Строго говоря, у структуры CHOOSECOLOR есть параметр lpfnHook, в котором можно указать адрес процедуры, обрабатывающей сообщения диалога. Но я не нашёл примера использования: какое сообщение нужно перехватывать для определения выбранного цвета.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 17.07.2010, 03:10   #8
Fiesta200
Пользователь
 
Регистрация: 15.06.2010
Сообщений: 35
По умолчанию

Тогда остановимся на достигнутом

Тему можна закрывать.
Fiesta200 вне форума Ответить с цитированием
Старый 17.07.2010, 12:52   #9
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

http://win-api.narod.ru/a0570.htm
Главное - не ошибиться с ручкой щётки и рычажной процедурой
Aent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цвета Sergeo_89 Общие вопросы Delphi 3 23.01.2010 18:08
цвета на канве Juffin Общие вопросы Delphi 3 17.05.2009 21:57
Выбор цвета DANIЯR Общие вопросы Delphi 18 11.12.2008 10:34
Инверсия цвета Dj_smart Общие вопросы Delphi 6 08.05.2008 16:29
цвета Toxa Общие вопросы Delphi 3 20.04.2007 12:03