Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Динохромный


Contributor


Сообщения: 712
Благодарности: 322

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
Если есть вариант проще, то это интересно. »
blackeangel, к программной реализации вопросов особенных нет, а вот взаимодействие с программой на мой взгляд можно построить следующим образом (я излагаю свое представление об удобстве, разумеется у вас оно может полностью не совпадать)

1. каждый раз вводить полное наименование цвета на мой взгляд неудобно. По хорошему можно сделать форму (одну - с текстовым окном и опциями выбора цвета), в которую вы сразу будете забивать свой поисковый шаблон и при необходимости - выбирать мышкой цвет.
При вводе через input я бы ограничился вводом первой буквы: не "красный", а просто "к". Кроме того, при наличии орфографической неточности (например "краный", или "Чёрный" вместо "Черный") соответствия найдено не будет, вполне можно принудительно присвоить в этом случае цвет (например черный) и предупредить об этом пользователя. Реализовать все вышеперечисленное можно через select case:
код Select case
Код: Выделить весь код
Select Case LCase(sFontColorAsk)
        
        Case "к"
            sFontColor = vbRed
        Case "з"
            sFontColor = vbGreen
        Case "ж"
            sFontColor = vbYellow
        Case "с"
            sFontColor = vbBlue
        Case "п"
            sFontColor = vbMagenta
        Case "ц"
            sFontColor = vbCyan
        Case "б"
            sFontColor = vbWhite
        Case "ч"
            sFontColor = vbBlack
        Case Else
            sFontColor = vbBlack
            MsgBox "Цвет не распознан, применен черный"
    End Select

2. Введенный цвет следует не проверять в обоих регистрах (If sFontColorAsk = "черный" Or sFontColorAsk = "Черный"), а перевести в заданный(например нижний) регистр: LCase(sFontColorAsk). Это ускорит работу кода.
3.при вводе цвета текста нужно вставить значение по умолчанию, чтобы сократить количество ненужных действий (например красный):
код
Код: Выделить весь код
sFontColorAsk = InputBox("Введите один из цветов: " _
    & Chr(13) & "черный (ч), красный (к),зеленый (з)," _
    & Chr(13) & "желтый (ж), синий (с), пурпурный (п), циан (ц), белый (б)", , "к")


Соответственно, код будет выглядеть следующим образом:
код
Код: Выделить весь код
Sub colorr2()
    Dim strFindWhat As String
    Dim strFirstFoundAddress As String
    Dim objRange As Range
    Dim intFoundPosition As Integer
    strFindWhat = InputBox("Введите что подкрасить")
    sFontColorAsk = InputBox("Введите один из цветов: " _
    & Chr(13) & "черный (ч), красный (к),зеленый (з)," _
    & Chr(13) & "желтый (ж), синий (с), пурпурный (п), циан (ц), белый (б)", , "к")
    
    Select Case LCase(sFontColorAsk)
        
        Case "к"
            sFontColor = vbRed
        Case "з"
            sFontColor = vbGreen
        Case "ж"
            sFontColor = vbYellow
        Case "с"
            sFontColor = vbBlue
        Case "п"
            sFontColor = vbMagenta
        Case "ц"
            sFontColor = vbCyan
        Case "б"
            sFontColor = vbWhite
        Case "ч"
            sFontColor = vbBlack
        Case Else
            sFontColor = vbBlack
            MsgBox "Цвет не распознан, применен черный"
    End Select
    With ActiveSheet.UsedRange
        Set objRange = .Find( _
            What:=strFindWhat, _
            LookIn:=xlFormulas, _
            LookAt:=xlPart, _
            SearchOrder:=xlByRows, _
            SearchDirection:=xlNext, _
            MatchCase:=False, _
            SearchFormat:=False _
        )
        If Not objRange Is Nothing Then
            strFirstFoundAddress = objRange.Address
            Do
                intFoundPosition = InStr(1, objRange.Value, strFindWhat, vbTextCompare)
                Do While intFoundPosition > 0
                    objRange.Characters(intFoundPosition, Len(strFindWhat)).Font.Color = sFontColor
                    intFoundPosition = InStr(intFoundPosition + 1, objRange.Value, strFindWhat, vbTextCompare)
                Loop
                Set objRange = .FindNext(After:=objRange)
            Loop Until objRange.Address = strFirstFoundAddress
        End If
    End With
End Sub

Последний раз редактировалось a_axe, 20-05-2016 в 09:41.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:36, 20-05-2016 | #10