Страницы: 1
RSS
Function формула с другой книги, Как узнать положение диапазона?
 
Добрый день.

Написал фнукцию типа Function getit (x as Range).

Прекрасно работает на листе, где распаложены данные. А вот если с другого листа подтягивать, то 0 выходит...
Как можно узнать положение x (range): имя книги, имя листа?
Спасибо.
 
Вообще, для функции неважно, где расположены данные.
Вероятно, вы что-то напутали в коде функции

Покажите код - мы подправим.
 
Вы бы лучше код функции привели. Если используете внутри функции обращение к листу диапазона, то лист указанного диапазона можно узнать так:
x.Parent
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Public Function getDPP(iRange As Excel.Range)
Dim i As Integer, iCount As Integer, iSum, x, iRow As Integer
iCount = iRange.Count
iRow = iRange.Row
iCol = iRange.Column

On Error Resume Next

    x = 0
    For i = 1 To iCount
        If Application.WorksheetFunction.Sum(Range(Cells(iRow, iCol), Cells(iRow, i + iCol - 2))) * _
        Application.WorksheetFunction.Sum(Range(Cells(iRow, iCol), Cells(iRow, i + iCol - 1))) > 0 Then
            If Application.WorksheetFunction.Sum(Range(Cells(iRow, iCol), Cells(iRow, i + iCol - 1))) < 0 Then
            x = x + 1
            Else
            x = x + 0
            End If
        Else
        x = x + Application.WorksheetFunction.Sum(Range(Cells(iRow, iCol), Cells(iRow, i + iCol - 2))) / _
        (Application.WorksheetFunction.Sum(Range(Cells(iRow, iCol), Cells(iRow, i + iCol - 2))) - _
        Application.WorksheetFunction.Sum(Range(Cells(iRow, iCol), Cells(iRow, i + iCol - 1))))
        End If
        
        If i = 1 Then
            If Cells(iRow, iCol) < 0 Then
            x = 1
            Else
            x = 0
            End If
        End If
    Next
    
    getDPP = x

End F unction
Изменено: Евгений - 17.01.2013 11:31:55
 
Евгений, а можно заключить Ваш код в тэги [CODE][/CODE], а то вашу "лапшу" как-то трудновато читать.
There is no knowledge that is not power
 
Мне кажется хуже стало, появились какие-то пробелы :)
 
Код
Public Function getDPP(iRange As Excel.Range)
    Dim i As Integer, iCount As Integer, iSum, x, iRow As Integer

    iCount = iRange.Count
    iRow = iRange.Row
    iCol = iRange.Column

    On Error Resume Next
    
    x = 0
    With iRange.Parent
    For i = 1 To iCount
        If Application.WorksheetFunction.Sum(.Range(.Cells(iRow, iCol), .Cells(iRow, i + iCol - 2))) * _
           Application.WorksheetFunction.Sum(.Range(.Cells(iRow, iCol), .Cells(iRow, i + iCol - 1))) > 0 Then
            If Application.WorksheetFunction.Sum(.Range(.Cells(iRow, iCol), .Cells(iRow, i + iCol - 1))) < 0 Then
                x = x + 1
            Else
                x = x + 0
            End If
        Else
            x = x + Application.WorksheetFunction.Sum(.Range(.Cells(iRow, iCol), .Cells(iRow, i + iCol - 2))) / _
                (Application.WorksheetFunction.Sum(.Range(.Cells(iRow, iCol), .Cells(iRow, i + iCol - 2))) - _
                 Application.WorksheetFunction.Sum(.Range(.Cells(iRow, iCol), .Cells(iRow, i + iCol - 1))))
        End If

        If i = 1 Then
            If Cells(iRow, iCol) < 0 Then
                x = 1
            Else
                x = 0
            End If
        End If
    Next

    getDPP = x

End F unction
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Э-э-э... Я имел ввиду отступы.  :)
Изменено: Johny - 17.01.2013 11:35:00
There is no knowledge that is not power
 
Совет от бывалых - вложение в стиле VB в "Notepad++"... ;)
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Я на работе. Нельзя прикреплять файлы :)
 
Евгений, а ответы просматривать можно на работе? :-) я Вам дал код функции.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Johny пишет:
Э-э-э... Я имел ввиду отступы.  
С отступами сделал, просто пробелы между буквами появились, например "F unction"
 
Можно использовать Application.Caller. Возвращает ячейку, которая вызвала эту функцию.
There is no knowledge that is not power
 
Чувствую себя как в анекдоте:

-Доктор, помогите, мне все время кажется, что меня игнорируют!
-Следующий!
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Нет, все работает, спасибо  :) . Я просто тестировал и подправил чуть, добавил End With и точку одну перед Cells.

Всем спасибо  :)
 
Возник вопрос по работе: при открытом источнике формула считается правильно. Но если закрыть источник - срзау появляется #ЗНАЧ при пересчете.
Что это может быть?
 
=getdpp('C:\Users\enzo\Desktop\[dpp.xlsx]Лист1'!$A$1:$AS$1)

Нашел только 1 решение проблемы (теоретически): загнать в массив значения диапазона книги через executeexcel4macro и уже играться с элементами. Но до этого нужно разделить C:\Users\enzo\Desktop\[dpp.xlsx]Лист1'!$A$1:$AS$1 на:
C:\Users\enzo\Desktop\
dpp.xlsx
Лист1
$A$1:$AS$1

Но не уверенн, что вообще что-то получится... Может у кого-нибудь есть какие-нибудь идеи? :(
 
Зачем такие сложности ;)
Определите функцию так
Код
Public Function getDPP(iRange)
'или
Public Function getDPP(iRange As Variant)

Если аргументом функции является диапазон открытой книги, iRange будет типа Variant/Range, а если закрытой книги, то Variant/Variant(), двумерный массив.
Вам остается определить тип переменной с помощью TypeName(iRange) и работать с ней соответственно.
 
В копилке есть тема, где я приводил пример подобного кода: http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=2&TID=10
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо, что-то получается. Теперь возник другой вопрос:
Как просуммировать элементы массива с 1 по 3, кроме как циклом? :)
 
Разобрался. Даже упростил:

Код
Public Function getDPP(iRange As Variant)
Dim i As Integer, x As Variant, result_1 As Variant, result_2 As Variant
On Error Resume Next
Select Case TypeName(iRange)
'Если открыта книга
Case "Range"
    x = 0
    result_1 = 0
    result_2 = 0
    For i = 1 To iRange.Count
    result_1 = result_1 + iRange(i - 1)
    result_2 = result_2 + iRange(i)
     If result_1 * result_2 > 0 Then
      If result_2 < 0 Then
          x = x + 1
      Else
          x = x + 0
      End If
     Else
      x = x + result_1 / (result_1 - result_2)
     End If
     If i = 1 Then
      If iRange(1) < 0 Then
          x = 1
      Else
          x = 0
      End If
     End If
    Next
    getDPP = x
  
'Если закрыта книга
Case "Variant()"
    x = 0
    result_1 = 0
    result_2 = 0
    For i = 1 To UBound(iRange)
    result_1 = result_1 + iRange(i - 1)
    result_2 = result_2 + iRange(i)
     If result_1 * result_2 > 0 Then
      If result_2 < 0 Then
          x = x + 1
      Else
          x = x + 0
      End If
     Else
      x = x + result_1 / (result_1 - result_2)
     End If
     If i = 1 Then
      If iRange(1) < 0 Then
          x = 1
      Else
          x = 0
      End If
     End If
    Next
    getDPP = x
    
End Select
End F unction
Изменено: Евгений - 30.01.2013 18:28:43
Страницы: 1
Наверх