2016-12-31 10 views
0

Я создал функцию для получения свойства продукта с данным номером продукта.Моя пользовательская функция успешно работает с кодом, но с формулой Returns #VALUE

Он работает успешно, когда я запускаю модуль, но не из формулы.

Функция (отредактированный):

Public Function ÖZELLİKGETİR(İsim As String, Özellik As String) As String 
    Dim Okunan() As Römork 
    Okunan() = VERİGETİR() 

    Dim i 
    MsgBox UBound(VERİGETİR()) '0 
    ReDim Preserve Okunan(UBound(VERİGETİR()) + 1) 
    MsgBox "Reached" 'Even this is not reached 
    For i = 0 To UBound(Okunan()) 
    If Not Okunan(i) Is Nothing Then 
    MsgBox "Reached" 
     If Okunan(i).ÜrünKodu = İsim Then 
     MsgBox "Reached" 
      ÖZELLİKGETİR = CallByName(Okunan(i), Özellik, VbGet) 
      Exit Function 
     End If 
    End If 
    Next i 

End Function 

Остальные части действительно долго, и так как он работает с макро; Мне не нужно было включать их.

Мой рабочий Macro:

Sub T() 
    ÖZELLİKGETİR("NM 511.136","ÜrünKodu") 'Returns "NM 511.136" 
End Sub 

формула:

=ÖZELLİKGETİR("NM 511.136";"ÜrünKodu") Returns #VALUE 

Таблица, если вам нужны другие части: Link

+0

Начните с ввода 'Option Explicit' в начале всех ваших модулей. Это заставит вас явно объявлять все переменные и может привести к вашей проблеме. (И вам нужно также установить «Инструменты/Референции»). Если это не помогает, поместите точки останова на каждую строку вашего UDF, чтобы увидеть, где она не работает. Сам UDF не возвращает ошибку; скорее это скорее происходит от «плохой линии» в коде. Одна из возможностей заключается в том, что 'VERİGETİR' не имеет значения в коде, когда ваш UDF вызывается с листа. –

+0

OH MY! Переменная i не определена! Спасибо, чувак, я искал больше двух часов. –

+0

@RonRosenfeld Но ... Его еще # ВАЛЮТ –

ответ

1

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

Ну, в конце концов, это связано с тем, что @RonRosenfeld и @AxelRichter указали: пользовательские функции (UDF) имеют ограничения.

В коде VBA вы указываете много на ActiveSheet и используете неквалифицированные диапазоны. Например, в вашей функции VERÝGETÝR вы начинаете ее с Sheets("Veri Sayfasý").Activate; то вы вызываете много функций с неквалифицированным Cells(r, c).

Возьмите немного посмотреть здесь:

In Sub VERÝGETÝR(...) 
     Sheets("Veri Sayfasý").Activate 
     ... 
     Set vRömork.DingilSayýsý = MetinOluþtur(Cells(2, i), Cells(2, i + 1)) 
     Set vRömork.Ton = MetinOluþtur(Cells(3, i), Cells(3, i + 1)) 
     Set vRömork.En = SayýOluþtur(Cells(4, i), Cells(4, i + 1)) 
     ... 

Все это работает с нормальной VBA, хотя это даже не рекомендуется. (Профессионалы никогда не должны использовать материал Activate, если это действительно необходимо, я почти никогда не находил ситуацию, когда мы не можем этого избежать). НО, внутри UDF, метод Activate не имеет никакого эффекта, это полностью игнорируется!

Рефакторинг вашего кода и квалифицировать все ваши Range и Cells. Удостоверьтесь, что вы никогда не использовали ActiveSheet или Activate. Например, ваш приведенный выше код может быть легко переписать, используя пункт With вместо использования Activate:

 With Sheets("Veri Sayfasý") // <~~ no need to activate, just a With 
      Set vRömork.DingilSayýsý = MetinOluþtur(.Cells(2, i), .Cells(2, i + 1)) 
      Set vRömork.Ton = MetinOluþtur(.Cells(3, i), .Cells(3, i + 1)) 
      Set vRömork.En = SayýOluþtur(.Cells(4, i), .Cells(4, i + 1)) 
      ... 
     End with 

Это может быть трудоемкой задачей на данный момент, но я Сильно рекомендую реорганизовать код. Я, кажется, довольно большой проект, и вам нужно придерживаться правил хорошей практики, чтобы иметь возможность его обслуживания и избежать дальнейших сюрпризов.

+1

Это работает просто .. отлично! –