ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 18.06.2025

Просмотров: 9006

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

зователем диапазона, которое включает только непустые ячейки, содержащие текст и не содержащие формулы. Если этому условию не соответствует ни одна ячейка, то функция возвращает значение N o t h i n g .

Функция CreateWorkRange (которая создает и возвращает объект Range) принимает два аргумента.

г — Объект Range. В данном случае это диапазон, выделенный пользователем и отображаемый в элементе управления RefE d i t .

TextOnly. Если аргумент имеет значение True, го созданный объект не будет содержать нетекстовые ячейки.

Функция CreateWorkRange, которая показана в листинге 16.4, является глобальной и универсальной, т.е. используется не только в утилите Text Tools.

Листинг 16.4. Функция CreateWorkRange

Function CreateWorkRange(r As Range, TextOnly As Boolean) As Range

'

Создает

объект Range, состоящий только из непустых ячеек

1

и ячеек,

которые не содержат формулы. Если TextOnly

'имеет значение True, то объект не содержит числовые ячейки

Set CreateWorkRange = Nothing

Select Case r.Count

Case 1 ' выделена одна ячейка

If r.HasFormula Then Exit Function

If TextOnly Then

If IsNumeric{r.Value) Then

Exi t Funct ion

Else

Set CreateWorkRange = r

End If

Else

If Not IsEmptyfr/ Then Set CreateWorkRange = r

End If

Case Else ' выделено более одной ячейки On Error Resume Next

If TextOnly Then

Set CreateWorkRange = _ r.SpecialCells(xlConstants, xlTextValues)

If Err <> 0 Then Exit Function

Else

Set CreateWorkRange = _

r .SpecialCells (xlConstants, xlTextValues + xlNumbers) If Err <> 0 Then Exit Function

End If End Select

End Function

Функция createworkRange активно использует свойство specialcell . Для того чтобы получить дополнительную информацию об этом свойстве, попытайтесь в диалоговом окне Excel Выделение группы ячеек записать макрос при создании различныхвыделений. Этодиалоговоеокноможноотобразить, нажавклавишу<F5>и щелкнув на кнопке Выделить в диалоговом окне Перейти.

ЧастьV.Совершенныеметодыпрограммирования

423


Диалоговое окно Выделение группы ячеек имеет одну особенность. Обычно диалоговое окно работает с текущим выделенным диапазоном. Например, если выделен целый столбец, то результатом будет подмножество ячеек этого столбца. Но если выделена одна ячейка, то диалоговое окно работает со всем листом. Именно поэтому функция CreateWorkRange проверяет количество ячеек, которые составляют диапазон, переданный функции в качестве аргумента.

Если объект WorkRange создан, процедура ChangeCaseTab продолжает обрабатывать каждую ячейку в объекте WorkRange. Перед завершением продедуры становится доступной кнопка Отменить, и к ней добавляется подпись.

Далее в этой главе о возможности отмены операции речь пойдет более подробно.

Добавление текста

Вторая страница элемента управления M u l t i P a g e (рис. 16.5) позволяет добавлять текстовые символы в содержимое выделенной ячейки. Текст можно добавить в начало, в конец или в определенную позицию внутри ячейки.

Рис. 16.5. Эта страница позволяет добавлять текст всодержимое выделенныхячеек

Процедура ApplyButton__Click вызывает процедуру AddTextTab, если значение свойства Value элемента управления MultiPage; равно 1 (т.е. активна вторая страница элемента управления MultiPage) . Листинг 16.5 содержит полный код процедуры AddTextTab.

Листинг 16.5. Вставка проверенного текста в ячейки с помощью диалогового окна

Sub AddTextTab{)

Dim WorkRange As Range

Dim Cell As Range

Dim NewText As String

Dim InsPos As Integer

Dim CellCount As Long

Set WorkRange = _

CreateWorkRange(Range(RefEditl.Text), cblgnoreNonTextl)

If WorkRange Is Nothing Then Exit Sub

NewText = TextToAdd.Text

If NewText = "" Then Exit Sub

Проверить потенциально неправильные формулы

If

OptionAddToLeft And Left(NewText, 1) Like •[=+-]"

MsgBox "Это неправильная формула.", __

430

Глава IB. Разработка утилитExcelспомощью VBA


vblnfonnation, APPNAME With TextToAdd

.Selstart = 0

.SelLength = Len(.Text)

.SetPocus End With

Exit Sub End If

1Добавить текст в середину? If OptionAddToMiddle Then

InsPos = Val(InsertPos.Caption)

If InsPos = 0 Then Exit Sub

End If

' Циклически перебрать ячейки CellCount = О

ReDim LocalUndo(CellCount)

For Each Cell In WorkRange With Cell

Сохранить информацию для отмены CellCount = CellCount + 1

ReDim Preserve LocalUndo(CellCount) With LocalUndo(CellCount)

.OldText = Cell.Value

.Address = Cell.Address End With

If OptionAddToLeft Then .Value = NewText & .Value If OptionAddToRight Then .Value = .Value & NewText If OptionAddToMiddle Then

If InsPos > Len{.Value) Then

.Value = .Value & NewText

Else

.Value = Left(-Value, InsPos) & NewText & _ Right(.Value, Len<.Value) - InsPos)

End If End if

End With Next Cell

1Обновить кнопку Undo UndoButton.Enabled = True

UndoButton.Caption = "Отменить добавление текста"

End Sub

Эта процедура по своей структуре напоминает процедуру ChangeCaseTab. Обратите внимание, что она перехватывает ошибку, которая происходит, если пользователь вставляет символы +,- или = в начало ячейки. Такая вставка приведет к тому, что Excel будет интерпретировать полученное содержимое ячейки как неправильно составленную формулу.

Удаление текста

Третья страница элемента управления M u l t i P a g e (рис. 16.6) позволяет удалять текст из выделенных ячеек. Определенное количество символов можно удалять в начале, в конце или в указанной позиции в середине ячейки.

Часть V. Совершенные методы программирования

431


Рис.16.6,Этастраницапозволяетпользователюудалитьсимволывтекстевыделенныхячеек

Процедура ApplyButton_Click вызывает процедуру Remove Text Tab в том случае, если значение свойства Value элемента управления MultiPage равно 2 (т.е. акгивна третья страница элемента управления MultiPage). Листинг 16.6 содержит полный код процедуры Remove Тех t Tab.

Листинг 16.6. Удаление текста из ячеек с помощью диалогового окна

Sub RemoveTextTab()

Dim WorkRange As Range

Dim Cell As Range

Dim NumToDel As Integer

Dim CellCount As Long

1

1

Set WorkRange = _

CreateWorkRange(Range(RefEdit]..Text),cbIgnoreNonText2)

If WorkRange Is Nothing Then Exit Sub

NumToDel = Val(CharstoDelete.Caption)

If NumToDel = 0 Then Exit Sub

Обработать ячейки ReDim LocalUndo(0) CellCount я О

For Each Cell In WorkRange With Cell

Сохранить информацию для отмены CellCount = CellCount + 1

ReDim Preserve LocalUndo(CellCount) LocalUndo {CellCount) .OldText. = .Value LocalUndo(CellCount).Address = .Address

If LenfCell .Value) <= NumToDel Then __ NumToDel = Len(.Value)

Select Case True

Case OptionDeleteFroxnLeft

.Value = Right(.Value, Len(.Value) - NumToDel) Case OptionDeleteFromRight

.Value = Left(.Value, Len(.Value) - NumToDel) Case OptionDeleteFromMiddle

.Value = RemoveChars{-Value, _ CInt(BeginChar.Caption), NumToDel)

End Select End With

Next Cell

432

Глава 16, РазработкаутилитExcelспомощью VBA