надо сделать аналог стандартной функции Excel ДВССЫЛ()

Программирование на Visual Basic for Applications
traaance
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 02.04.2006 (Вс) 15:48

надо сделать аналог стандартной функции Excel ДВССЫЛ()

Сообщение traaance » 02.04.2006 (Вс) 16:02

Возвращает ссылку, заданную текстовой строкой. Ссылки немедленно вычисляются для вывода их содержимого. Функция ДВССЫЛ используется, если требуется изменить ссылку на ячейку в формуле, не изменяя саму формулу.

Синтаксис

ДВССЫЛ(ссылка_на_ячейку;a1)

Ссылка_на_ячейку — это ссылка на ячейку, которая содержит либо ссылку в стиле А1, либо ссылку в стиле R1C1, либо имя, определенное как ссылка, либо ссылку на ячейку в виде текстовой строки. Если ссылка_на_ячейку не является допустимой ссылкой, то функция ДВССЫЛ возвращает значение ошибки #ССЫЛ!.

Если ссылка_на_ячейку является ссылкой на другую рабочую книгу (внешней ссылкой), другая рабочая книга должна быть открытой. Если это не так, функция ДВССЫЛ возвратит значение ошибки #ССЫЛКА!.

A1 — это логическое значение, указывающее, какого типа ссылка содержится в ячейке ссылка_на_текст.

Если a1 имеет значение ИСТИНА или опущена, то ссылка_на_ячейку интерпретируется как ссылка в стиле A1.

Если a1 имеет значение ЛОЖЬ, то ссылка_на_ячейку интерпретируется как ссылка в стиле R1C1.

Я скелет наваял, но так как это первый мой опыт в программировании VBA, то все очень криво :) Хотелось бы услышать дельных советов.

Код: Выделить всё

Public Function MyKR(addr As Variant, Optional fa As Variant) As String
Dim ssilka As String
'--------------------------------------------------
If (TypeName(addr) = "String") Then
  ssilka = addr
Else
  ssilka = CStr(addr)
End If

'--------------------------------------------------
Application.Caption = "Контрольная работа"
'--------------------------------------------------
If IsA1(ssilka) Then
  If IsMissing(fa) Then
    MyKR = CStr(Application.Range(ssilka).Value)
  ElseIf (fa <> 0) Then
    MyKR = CStr(Application.Range(ssilka).Value)
  Else
    MyKR = "#ССЫЛКА!"
  End If
ElseIf IsR1C1(ssilka) Then
  If Not (IsMissing(fa)) Then
    If fa = 0 Then _
      MyKR = CStr(Apllication.Range(sslika).Value)
  End If
Else
  MyKR = "#ССЫЛКА!"
End If
'--------------------------------------------------
End Function

traaance
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 02.04.2006 (Вс) 15:48

Сообщение traaance » 02.04.2006 (Вс) 16:07

Функции IsA1 и IsR1C1 это пока что только мои личные протоитпы :) Я нез наю как это реализовать. Буду рад подсказке.

З.Ы. заранее благодарен.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.04.2006 (Вс) 16:25

Ужосн... э... просто ужас :roll:

Я про задание. К контрольной работе.


Зачем делать addr As Variant? Что такое fa? Обязательно надо fa? Потому что можно без него. Что делать, если ssilka указывает на несколько ячеек? Почему ошибка возвращается как string, а не как variant/error? Почему вообще возвращается string, в то время как дожно быть range?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

traaance
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 02.04.2006 (Вс) 15:48

Сообщение traaance » 02.04.2006 (Вс) 17:12

вообщето ДВССЫЛ() - это стандартная функция ексель. А мне нужно реализовать ее копию %). Вот MyKR() это и есть моя функция, которая должна работать по образу и подобию ДВССЫЛ().

addr As Variant - потому, что адрес может быть передан или строкой или рейнждем.

fa - это аналог 1а в ДВССЫЛ(). О нем написано вверху. (да кстати наверное надо его переименовать в а1, так будет лучше)

По поводу почем возвращает не variant/error? - а не знаю. я ж говорю это мой первый опыт в програмиировании ВБА. :( Поэтому че понял, то реалиховал, а че не понял... пытаюсь понять :)

traaance
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 02.04.2006 (Вс) 15:48

Сообщение traaance » 02.04.2006 (Вс) 17:20

А я еще я задумался "Возвращает ссылку, заданную текстовой строкой. " - так написано в Екселе. Тоесть возвращается ссылка, но ввиде строки. Я так понял. Может конечно я и ошибаюсь.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.04.2006 (Вс) 17:40

Я знаю, что ДВССЫЛ - стандартная функция.

Код: Выделить всё
Public Function MyKR(byval addr As Variant, Optional byval a1 As boolean=true) As variant
  dim s as string
 
  select case vartype(addr)
  case vbobject
    if typeof addr is excel.range then s=addr.value else mykr=cverr(xlerrvalue):exit function
  case vbstring
    s=addr
  case else
    mykr=cverr(xlerrvalue):exit function
  end select
 
  if not a1 then s=application.convertformula(s,xlr1c1,xla1)

  set mykr=range(s)
end function
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

traaance
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 02.04.2006 (Вс) 15:48

Сообщение traaance » 02.04.2006 (Вс) 21:28

Благодарю. Щас буду вникать.. :)

@Nik
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 14.05.2007 (Пн) 12:11

Сообщение @Nik » 14.05.2007 (Пн) 12:38

GSerg, попробовал ваш пример, но не всё получилось... :( У меня задача стоит так: нужно, чтобы пользовательская ф-ция вернула не значение, а ячейку! Т.е., чтоб результат пользов. ф-ции можно было подставить в качестве начала (конца) диапазона данных. Вот пример, как мне надо сделать:
=СУММ(MyFunc():D15), где MyFunc() возвращает, скажем, ячейку "D5"

@Nik
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 14.05.2007 (Пн) 12:11

Сообщение @Nik » 14.05.2007 (Пн) 12:48

Почему я написал в этой тебе - потому, что как вариант можно сделать так:

Function MyFunc()
Myfunc="D5"
End Function

=СУММ(ДВССЫЛ(MyFunc()):D15), а как обойтись без ДВССЫЛ() ?

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 14.05.2007 (Пн) 20:16

@Nik писал(а):Почему я написал в этой тебе - потому, что как вариант можно сделать так:

Function MyFunc()
Myfunc="D5"
End Function

=СУММ(ДВССЫЛ(MyFunc()):D15), а как обойтись без ДВССЫЛ() ?


Так ты попробуй функцию GSerg:

=СУММ(MyKR("D5"):D15)

все же работает
Привет,
KL

proximo
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 23
Зарегистрирован: 03.03.2006 (Пт) 11:33

Сообщение proximo » 25.05.2007 (Пт) 13:30

А может стоит попробовать
Сервис>Макросы>Начать запись

...
здесь вручную используем функцию ДВССЫЛ
...


Сервис>Макросы>Остановить запись

Лезем в редактор VBA, смотрим, что натворили и делаем так же.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.05.2007 (Пт) 13:33

proximo, кончай глупость постить.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

proximo
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 23
Зарегистрирован: 03.03.2006 (Пт) 11:33

Сообщение proximo » 25.05.2007 (Пт) 13:48

мда, не заметил ключевую фразу "контрольная работа"

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.05.2007 (Пт) 13:55

proximo, эта фраза здесь вообще ни при чём.
Ты вообще топик прочитай, что ли. И подумай, что будет в результате выполнения твоего совета и что спрашивали на самом деле.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 28.05.2007 (Пн) 1:33

proximo
Теперь. Если ты до сих пор не понял что тебе сказал GSerg, показываю результат твоего совета:
Код: Выделить всё
    Range("E9").Select
    ActiveCell.FormulaR1C1 = "=INDIRECT(R[-3]C,TRUE)"


Теперь будь добр, поясни, что мы должны были здесь увидеть?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 61

    TopList