Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: VBA MS Office

Программирования для MS Office кроме ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как передать диапазон в функцию VBA ?
 
 автор: 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 ? Вложенные циклы разве не рещают такие проблемы?

  Ответить  
 
 автор: malor   (28.12.2008 в 12:21)   личное сообщение
 
 

Нужна информация по работе с диапазонами.
Читаю книгу “VBA 2003 Самоучитель”, Кузьменко В.Г., 2004г., стр.395. Автор в листинге, приведенном на данной странице использует свойста Row и Rows.Count у объекта типа Range, перед этим на предыдущих страницах не объяснив их суть, что они хранят. Дайте pls ссылку где в инете есть подробное описание рэйнджевских свойств/методов.

  Ответить  
 
 автор: osmor   (29.12.2008 в 11:50)   личное сообщение
 
 

самый простой и надежный способ открыть браузер объектов (в редакторе нажать F2) и выбрав нужный объект посмотреть его методы, свойства и события... там же есть вызов справки по ним

  Ответить  
 
 автор: malor   (31.12.2008 в 22:05)   личное сообщение
 
 

Row Property
Returns the number of the first row of the first area in the range.

Возвращает номер первого ряда в диапазоне ? Т.е. его номер в "абсолютном" так сказать смысле(рассматривая ряд на всем пространстве листа)?

  Ответить  
 
 автор: pashulka   (01.01.2009 в 16:57)   личное сообщение
 
 

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

  Ответить  
 
 автор: malor   (01.01.2009 в 18:54)   личное сообщение
 
 

Спасибо за обширный пример.

Rows(5) - возвращает диапазон являющийся все пятой строкой листа,
Rows(5).Row- возвращает первую строку этого диапазона. Собсно в нем и так одна строка. Она = 5. Хорошо.

Rows("3:10") - диапазон в виде ячейки в третей строке в 10м столбце листа.
Поэтому Rows("3:10").Row вернул 3.

Но почему Rows("10:3").Row вернул 3, а не 10 ?

  Ответить  
 
 автор: pashulka   (01.01.2009 в 19:35)   личное сообщение
 
 

Потому, что у этого об'екта третья строка действительно является первой (см.справку)

Да, и вот Вам ещё небольшое дополнение, ибо, на мой взгляд, Вам скорее желательно разобраться с об'ектом 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

  Ответить  
 
 автор: malor   (01.01.2009 в 22:26)   личное сообщение
 
 

>Потому, что у этого об'екта третья строка действительно
>является первой (см.справку)

Какую справку? Ту, что я привел или другую?

  Ответить  
 
 автор: pashulka   (01.01.2009 в 23:47)   личное сообщение
 
 

Шутник, конечно я говорил о приведённой Вами цитате, где довольно чётко говорится о первой строке.

  Ответить  
 
 автор: malor   (02.01.2009 в 12:02)   личное сообщение
 
 

Rows("10:3") значит возвращает диапазон от третьей строки листа до десятой строки? Ха ...
Я предполагал, что запись "10:3" указывает взять то, что находится на пересечении 10й строки и 3го столбца, т.е. ячейку С10.

  Ответить  
 
 автор: pashulka   (02.01.2009 в 15:12)   личное сообщение
 
 

[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

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList