|
автор: DN (30.11.-1 в 00:00) |
|
| Как передать диапазон в функцию VBA ?
Т.е. по аналогии с фукциией СУММ() хочу создать функцию которая бы передавала в процедуру начльное и конечное значение диапазона.Чтобы в рамках этого диапазона создавать циклы и т.д. | |
|
| |
|
автор: ???? (30.11.-1 в 00:00) |
|
| Re: Как передать диапазон в функцию VBA ? Например
Public Function qwe(rg As Range) As Long
Dim i As Long
For i = 1 To rg.Cells.Count
qwe = qwe + rg.Cells(i)
Next
End Function | |
|
| |
|
автор: pashulka (30.11.-1 в 00:00) |
|
| Re[1]: Как передать диапазон в функцию VBA ? В случае использования несмежных диапазонов лучше использовать что-то вроде нижеопубликованного примера, так как он будет возвращать действительно корректный результат.
Function dSumm#(Diapazon As Range)
Dim iCell As Range
For Each iCell In Diapazon
If IsNumeric(iCell) = True Then
dSumm# = dSumm# + iCell
End If
Next
End Function
Пример вызова пользовательской функции : =dSumm((A1:B5;A10:F10))
P.S. Сравнение со стандартной функцией рабочего листа =СУММ() не слишком корректно, ибо ей можно передать не только ссылку на ячейку/диапазон ячеек. | |
|
| |
|
автор: Graers (30.11.-1 в 00:00) |
|
| Re: Как передать диапазон в функцию VBA ? Вложенные циклы разве не рещают такие проблемы? | |
|
| |
|
|
|
| Нужна информация по работе с диапазонами.
Читаю книгу “VBA 2003 Самоучитель”, Кузьменко В.Г., 2004г., стр.395. Автор в листинге, приведенном на данной странице использует свойста Row и Rows.Count у объекта типа Range, перед этим на предыдущих страницах не объяснив их суть, что они хранят. Дайте pls ссылку где в инете есть подробное описание рэйнджевских свойств/методов. | |
|
| |
|
|
|
| самый простой и надежный способ открыть браузер объектов (в редакторе нажать F2) и выбрав нужный объект посмотреть его методы, свойства и события... там же есть вызов справки по ним | |
|
| |
|
|
|
| Row Property
Returns the number of the first row of the first area in the range.
Возвращает номер первого ряда в диапазоне ? Т.е. его номер в "абсолютном" так сказать смысле(рассматривая ряд на всем пространстве листа)? | |
|
| |
|
|
|
| Malor, Посмотрите на результаты и Вам всё станет понятно.
Private Sub Test_Row_Property()
MsgBox Rows(5).Row
MsgBox Rows("3:10").Row
MsgBox Rows("10:3").Row
MsgBox Range("B2:C10").Row
MsgBox Range("S7,B2:C10").Row
MsgBox Range("B2:C10,S7").Row
MsgBox Union([C10], [A3], [F7]).Row
MsgBox Union([F7], [A3], [C10]).Row
MsgBox Intersect([B:C], [5:10]).Row
End Sub
|
| |
|
| |
|
|
|
| Спасибо за обширный пример.
Rows(5) - возвращает диапазон являющийся все пятой строкой листа,
Rows(5).Row- возвращает первую строку этого диапазона. Собсно в нем и так одна строка. Она = 5. Хорошо.
Rows("3:10") - диапазон в виде ячейки в третей строке в 10м столбце листа.
Поэтому Rows("3:10").Row вернул 3.
Но почему Rows("10:3").Row вернул 3, а не 10 ? | |
|
| |
|
|
|
| Потому, что у этого об'екта третья строка действительно является первой (см.справку)
Да, и вот Вам ещё небольшое дополнение, ибо, на мой взгляд, Вам скорее желательно разобраться с об'ектом Range, чем со свойством Row
Private Sub TestAddition_Row_Property()
MsgBox Range("B10", "N100").Row
MsgBox Range("N100", "B10").Row
MsgBox Range("B10").Range("N100").Row
MsgBox Range("B10").Range("N100").Range("C50").Row
MsgBox Range("B10:C15").Cells(5).Row
MsgBox Range("B10:C15").Cells(5, 1).Row
MsgBox Range("B10:C15")(5).Row 'Item - Default
MsgBox Range("B10:C15")(5, 1).Row 'Item - Default
MsgBox Range("B10:C15").Item(5).Row
MsgBox Range("B10:C15").Item(5, 1).Row
End Sub
|
| |
|
| |
|
|
|
| >Потому, что у этого об'екта третья строка действительно
>является первой (см.справку)
Какую справку? Ту, что я привел или другую? | |
|
| |
|
|
|
| Шутник, конечно я говорил о приведённой Вами цитате, где довольно чётко говорится о первой строке. | |
|
| |
|
|
|
| Rows("10:3") значит возвращает диапазон от третьей строки листа до десятой строки? Ха ...
Я предполагал, что запись "10:3" указывает взять то, что находится на пересечении 10й строки и 3го столбца, т.е. ячейку С10. | |
|
| |
|
|
|
| [3:10] и [10:3] действительно возвращают один и тот же диапазон, и в этом можно легко убедиться, если провести небольшой тест, к примеру :
MsgBox Rows("3:10").Address 'Range("3:10").Address
MsgBox Rows("10:3").Address 'Range("10:3").Address
|
А что касается пересечения диапазонов, то сие действие осуществляется либо с помощью оператора пересечения (пробела), либо с помощью уже упомянутой функции Intersect
MsgBox Range("10:10 C:C").Address '[C:C 10:10].Address
|
MsgBox Intersect(Range("10:10"), Range("C:C")).Address 'Intersect([10:10], [C:C])
MsgBox Intersect(Columns("C"), Rows(10)).Address
MsgBox Intersect(Columns(3), Rows(10)).Address
|
Только не забывайте, что диапазоны могут и не пересекаться, а посему, в большинстве случаев лучше использовать второй вариант (), т.е. что-то вроде :
Dim iDiapazon As Range, iCell As Range
Set iDiapazon = Intersect(Range1, Range2, ..., Range30)
If Not iDiapazon Is Nothing Then
For Each iCell In iDiapazon 'при необходимости
'MsgBox iCell.Address, , ""
Next
End If
|
| |
|
| |
|
автор: DN (30.11.-1 в 00:00) |
|
| Re: Как передать диапазон в функцию VBA ? Спасибо всем за ответы, но я уже написал свой вариант функции на базе одного примера:
http://www.msoffice.nm.ru/downloads/#example15 | |
|
| |