1

Тема: Изменение формата OptionButton при нажатии.

Здравствуйте!
Суть проблемы такова:
Существует три кнопки в ряд, которые соответствуют значениям Плохо, Нормально, Хорошо.
Необходимо, чтобы при нажатии каждая кнопка выделялась соответствующим способом:
Сама кнопка красным, а предыдущие - желтым.
Т.е., например,  при выделении кнопки "Хорошо" она выделяется красным, а предыдущие( "плохо", "нормально") выделяются желтым, а при нажатии на кнопку "нормально" она выделяется красным, кнопка "плохо" выделяется желтым, а кнопка "хорошо" остается не выделенной.
При лурканьи на зарубежных форумах был найден соответствующий макрос, только для 4 optionbuttons :

Private Sub mFormatOptionButtons(Index As Long)

Dim lngOptIndex As Long

ActiveSheet.Range("A1").Value = Index
For lngOptIndex = 1 To 4 ' set to number of option button required
With ActiveSheet.Shapes("opt" & lngOptIndex).OLEFormat.Object.Object
If lngOptIndex = Index Then
.ForeColor = vbRed
Else
.ForeColor = vbYellow
End If
End With
Next

End Sub
Private Sub opt1_Click()

mFormatOptionButtons 1

End Sub
Private Sub opt2_Click()

mFormatOptionButtons 2

End Sub
Private Sub opt3_Click()

mFormatOptionButtons 3

End Sub
Private Sub opt4_Click()

mFormatOptionButtons 4

End Sub

По идее, этот макрос довольно легко редактируется для 3 кнопок:
For lngOptIndex = 1 To 4 изменяется на
For lngOptIndex = 1 To 3 , а
"Private Sub opt4_Click()

mFormatOptionButtons 4

End Sub" просто удаляется.
Но данный макрос после редактирования выдает ошибки, выделяя как неправильные следующие строчки:
Private Sub opt1_Click()
Private Sub opt2_Click()
Private Sub opt3_Click()
Код ошибки: "Invalid number.."

Не могли бы вы подсказать, что я делаю не так?
viter.alex: оформляйте код тегом [сode][/сode]

2

Re: Изменение формата OptionButton при нажатии.

Исправил макрос. Теперь он не выдает ошибку. Более того, теперь при запуске макроса вообще ничего не происходит)
Макрос выглядит так:

Sub mFormatOptionButtons1()
'
' MacroColorChange Macro
' Macro created 28.06.2010 by Gleb.Dementyev
End Sub
Private Sub mFormatOptionButtons(Index As Long)

Dim lngOptIndex As Long

ActiveSheet.Range("A1").Value = Index
For lngOptIndex = 1 To 3 ' set to number of option button required
With ActiveSheet.Shapes("opt" & lngOptIndex).OLEFormat.Object.Object
If lngOptIndex = Index Then
.ForeColor = vbRed
Else
.ForeColor = vbYellow
End If
End With
Next

End Sub
Private Sub opt1_Click()

mFormatOptionButtons 1

End Sub
Private Sub opt2_Click()

mFormatOptionButtons 2

End Sub
Private Sub opt3_Click()

mFormatOptionButtons 3

End Sub

3

Re: Изменение формата OptionButton при нажатии.

Ну, для начала - это макрос написан для Exel, а не для Word (ActiveSheet.Range("A1").Value = Index - данный код работает с активных листом, в ворде же нужно работать с активным документом.
Изначальный вопрос - где находятся ваши кнопки? В пользовательской форме или прямо в документе?
На самом деле, если это делать на пользовательской форме, то делается все очень просто. Вам нужны по две процедуры обработки событий для каждой из кнопок. Одно событие - когда курсор попадает в область кнопки, второе, когда по кнопке производится клик.
Зачем нужна функция Sub mFormatOptionButtons1()?? В ней весь код закоментарен.
В иностранном примере процедура с параметрами, у вас же она без параметров.

4

Re: Изменение формата OptionButton при нажатии.

Ясно, что ничего не ясно) В макросах я - чайник в чайниковой степени. Не могли бы подсказать ресурс, где я могу найти необходимые макросы для решения моей задачи? Кнопки находятся прямо в документе.
Спасибо)

5

Re: Изменение формата OptionButton при нажатии.

Приложите документ и мы что-нить придумаем с вашими кнопками..
Таких макросов вы вряд-ли найдете.. Универсальных макросов почти нет, есть под определенную задачу.

6

Re: Изменение формата OptionButton при нажатии.

Вот файл. Там будет 18 кнопок. Сделайте, пожалуйста для первого ряда. А дальше я по аналогии постараюсь сам)
Спасибо большое)

Post's attachments

Questionarie 2.doc 92.5 Кб, 2 скачиваний с 2010-06-28 

You don't have the permssions to download the attachments of this post.

7

Re: Изменение формата OptionButton при нажатии.

Что-то мы на разных языках разговариваем.. Я ни одной кнопки в приложенном файле не увидел.. Там только шесть групп переключателей. И что с ними делать, совсем непонятно..

8

Re: Изменение формата OptionButton при нажатии.

Ну да. Эти переключатели в английской версии именуются optionbutton. Поэтому я назвал их кнопками. Простите, что запутал. Я не специально) Мне нужно, чтобы при нажатии на какую либо из кнопок(переключателей) в группе, она окрашивалась красным, а предыдущие кнопки(переключатели) в группе окрашивались желтым. Как я понял, в экселе это вполне осуществимо. Значит, скорее всего, осуществимо и в Ворде. Нет?

9

Re: Изменение формата OptionButton при нажатии.

А нет у вас того файла, из которого вы взяли приведенный в первом сообщении макрос? Чтобы понять механизм, который работает в Exel и посмотреть визуально на результат??

10

Re: Изменение формата OptionButton при нажатии.

Нет. Я брал с форума. Я могу поискать ту запись. Подождите немного, я дам ссылку

11

Re: Изменение формата OptionButton при нажатии.

внешняя ссылка
Вот. Да, я ошибся, у парня была другая задача-отмеченное выделять красным,а остальное желтым. Такое меня тоже вполне устроит. Хотя первоначально поставленная задача - глазу и сердцу приятнее.

12

Re: Изменение формата OptionButton при нажатии.

Поскольку это было сделано для Excel, то просто перенести в Word не получится: другая объектная модель, по-другому нужно обращаться к элементам управления. Кроме того, найденный Вами вариант привязан к именам этих флажков (opt1, opt2, opt3), а в Вашем документе все имена остались неизменёнными. Я внёс некоторые коррективы (сделал имена флажков нагляднее) и полностью изменил макрос, который ставит цвет флажка. Теперь он выглядит так:

Public Sub mFormatOptionButtons(ByVal Index As Long, ByVal GroupName As String)

  Dim oInShp As InlineShape
  
  'Чтобы обратиться к элементу управления по имени, нужно перебрать их все.
  'В Excel это проще реализовано. Итак, перебираем все фигуры в тексте
  For Each oInShp In ActiveDocument.InlineShapes

    'Если фигура имеет интересующий нас тип
    If oInShp.Type = wdInlineShapeOLEControlObject Then

      With oInShp.OLEFormat.Object

        'Если она нужного класса и имя сходно с заданным
        If oInShp.OLEFormat.ClassType = "Forms.OptionButton.1" _
          And .Name Like GroupName & "*" Then
            'Сравниваем цифру из имени с переданным числом
            If Val(Replace(.Name, GroupName, "")) = Index Then
              .ForeColor = vbRed 'Совпало — окрашиваем красным
            Else
              .ForeColor = vbYellow 'Не совпало — жёлтым.
            End If
        End If

      End With

    End If

  Next

End Sub

Использование:

'Impact option buttons
'-------------------------------------
Private Sub optImpact1_Click()
  mFormatOptionButtons 1, "optImpact"
End Sub

Private Sub optImpact2_Click()
  mFormatOptionButtons 2, "optImpact"
End Sub

Private Sub optImpact3_Click()
  mFormatOptionButtons 3, "optImpact"
End Sub
'-------------------------------------
'/Impact option buttons

Думаю с остальными у Вас проблем не будет.
P.S. Жёлтый цвет на белом фоне не очень смотрится
P.P.S. Если нужно всё-таки, отслеживать очерёдность нажатий, как Вы хотели сначала, то это немного сложнее: придётся вводить либо статическую, либо глобальную переменную.


Ой, забыл файл приложить. Исправляюсь

Post's attachments

Questionarie 2.doc 105 Кб, 3 скачиваний с 2010-06-28 

You don't have the permssions to download the attachments of this post.
Лучше день потерять — потом за пять минут долететь!

13

Re: Изменение формата OptionButton при нажатии.

Круто!Спасибо) С переменными постараюсь разобраться сам. Даром что ли в девятом классе учил С++и Turbo Pascal))!?
Попробую, отпишусь)