Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1888.DOC
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
5.52 Mб
Скачать

6.3.4. Использование объекта Range

Объект Range предназначен для работы с диапазонами. Его аргументами могут быть следующие:

 строка – имя ячейки, например, Range("A1");

 строка – имя диапазона, например, Range("A1:D5");

 строковое выражение, значением которого является имя ячейки или диапазона, например, Range("A2:D" & row) или Range("A" & rowUp & ":D" & rowDown), где row, rowUp, rowDown – номера строк;

 два объекта типа Range – ячейки, задающие прямоугольный диапазон, например, Range(Range("A1"), Range("D5"));

 два объекта типа Cell – ячейки, задающие прямоугольный диапазон, например, Range(Cells(1, 1), Cells(5, 4)).

Следующий пример показывает, как изменить и получить значение ячейки:

Sub Test()

Range(«A1») = «Строковое значение»

Range(«A2») = 2 ' числовое значение

Range(«A2:A3») = 2 ' изменить значение всех ячеек диапазона

Range(“A4”) = “=A2+A3” ‘ ввод формулы в ячейку

MsgBox (“Значение в A2 = “ & Range(“A2”))

MsgBox (“Значение в A2 = “ & Range(“A2”).Value)

MsgBox (“Значение в A4 = “ & Range(“A4”))

MsgBox (“Значение в A4 = “ & Range(“A4”).Value)

End Sub

Метод Offset позволяет сослаться на новую ячейку, относительно текущей. Первый аргумент – смещение по строке, второй – по столбцу:

' смещение ввниз на одну ячейку и выделение ее

ActiveCell.Offset(1, 0).Select

' отрицательное число – для смещения вверх

ActiveCell.Offset(-1, 0).Select

Следующий пример показывает, как переместиться вниз до первой пустой ячейки:

Sub Test()

Dim a As Boolean

Dim d As Double

Dim c As Range

a = True

Set c = Range(ActiveCell.address)

c.Select

d = c.Value

c.Value = d

While (a = True)

ActiveCell.Offset(1, 0).Select

If (IsEmpty(ActiveCell.Value) = False) Then

Set c = Range(ActiveCell.address)

c.Select

d = c.Value

c.Value = d

Else

a = False

End If

Wend

End Sub

Если надо узнать максимальные размеры листа, то для этого есть метод UsedRange. Он позволяет получить объект типа Range, из которого можно узнать максимальный столбец или строку:

Sub Test()

Dim cur_range As Range

Set cur_range = ActiveSheet.UsedRange

Debug.Print cur_range.Address

End Sub

Адресовать ячейки можно и двумя цифрами по строке и столбцу. Это избавляет от утомительного разбора адресов типа $A10. Использования Cells(x, y) позволяет строить удобные циклы. В следующем примере диапазон A1:E3 заполняется двузначным числом, равным индексу элемента соответствующей матрицы:

Sub Test()

Dim i, j As Integer

For i = 1 To 3

For j = 1 To 5

Cells(i, j) = i * 10 + j

Next j

Next i

End Sub

Границы объекта Range позволяет определить метод End с аргументом, принимающим одно из значений: xlUp, xlDown, xlToLeft, xlToRight:

Sub TestRange()

Range("G2:K10") = 1

MsgBox ("Левый верхний - " + _

Range("I5").End(xlUp).End(xlToLeft).Address)

MsgBox ("Правый нижний - " + _

Range("I5").End(xlDown).End(xlToRight).Address)

MsgBox ("Нижняя строка - " & Range("I5").End(xlDown).Row)

MsgBox ("Правый столбец - " & Range("I5").End(xlToRight).Column)

End Sub

Следующий пример иллюстрирует, как выделить непустой диапазон выше текущей активной ячейки:

Sub SelectColumnData()

' что делать при ошибке

On Error GoTo errors

' нижний адрес

Dim a1 As String

' верхний адрес

Dim a2 As String

' диапазон

Dim ran As Range

' если не верхняя ячейка

If (ActiveCell.Row <> 1) Then

' пойти вверх

ActiveCell.Offset(-1, 0).Select

' взять адрес ячейки

a1 = ActiveCell.Address

' будем подниматься

For x = 1 To (ActiveCell.Row - 1)

' на одну вверх

ActiveCell.Offset(-1, 0).Select

' если не число выход

If IsNumeric(ActiveCell.Value) <> True Then

' на одну вниз

ActiveCell.Offset(1, 0).Select

' выход

GoTo nexts

End If

' если пустая

If IsEmpty(ActiveCell.Value) = True Then

' на одну вниз

ActiveCell.Offset(1, 0).Select

' выход

GoTo nexts

End If

Next x

nexts:

' получаем адрес вырехней

a2 = ActiveCell.Address

' строим диапазон

Set ran = Range(a1 + ":" + a2)

' выделяем

ran.Select

End If

' выходим из процедуры

Exit Sub

' ошибка, зовем на помощь

errors:

MsgBox "Ошибка! Сообщите разработчику."

End Sub

При выделении диапазона может возникнуть задача пройтись по этому диапазону с целью, например, покраски значений:

Sub FillColor()

For Each c In Range("A2:D10")

If c.Value > -5 Then

c.Select

With Selection.Interior

.ColorIndex = 6

.Pattern = xlSolid

End With

Selection.Font.ColorIndex = 2

If c.Value > 5 Then

c.Select

Selection.Font.ColorIndex = 3

If c.Value > 20 Then

c.Select

Selection.Font.ColorIndex = 4

End If

End If

End If

Next c

End Sub