Вопрос: Пользовательская функция : возврат результата
Добавлено: 19.10.06 20:30
Автор вопроса: Всеволод | Web-сайт:www.vswebhome.narod.ru
Добрый день.
Столкнулся с проблемой:
Пользовательская функция в EXEL при отладке в редакторе VBA выполняется корректно ,
однако при вызове ее из ячейки таблицы возвращает
#знач! .
Параметры передаются по значению, а не по ссылке ,
тип функции - Variant
Назначение функции - создать файл запроса к приложению XXX, и получить текстовый файл с ответом от этого приложения.
Прошу помощи.
Текст функции прилагаю.
Public Function AskFwp(ByVal strPath As String, ByVal FwpCmnd As String) As Variant
Dim strFlnm, strFnS, strFnI, strFnO As String
Dim strwin As String
Dim strdos As String
Dim flNumber As Integer
Dim strbuff As String
Dim strOut As Variant
Dim fs, f, ts As TextStream
strFnS = "evalstr.snd"
strFnI = "evalstr.in"
strFnO = "evalstr.out"
строка для записи в файл запроса
strwin = "LITO" + Chr(250) + Chr(250) + Chr(250) + "E " + FwpCmnd
'проверка - нет ли старого запроса
Set fs = CreateObject("Scripting.FileSystemObject")
strFlnm = strPath + strFnO
If fs.FileExists(strFlnm) Then
Set f = fs.GetFile(strFlnm)
f.Delete
End If
' Создать файл с новым запросом:
strFlnm = strPath + strFnS
fs.CreateTextFile (strFlnm)
Set f = fs.GetFile(strFlnm)
Set ts = f.OpenAsTextStream(ForWriting)
ts.Write (strwin)
ts.Close
' Переименовать в нужное расширение .in
f.Name = strFnI
' принять ответ с другим расширением . out
strFlnm = strPath + strFnO
Set f = fs.GetFile(strFlnm)
Set ts = f.OpenAsTextStream(ForReading)
strdos = ts.ReadLine
' MsgBox strdos
ts.Close
Set f = fs.GetFile(strFlnm)
Debug.Print f
f.Delete
'преобразовать в цифру
strbuff = Trim(strdos)
strOut = Val(strbuff)
В одной из статей о пользовательских функциях Excel (уже не помню где) я прочел, что для того, чтобы пользовательскую функцию можно было использовать в листе книги, она не только должна возвращать результат присвоением его имени этой функции, но должны соблюдаться еще несколько условий, одно из которых, как я помню, было обозначено, как "неизменность рабочей среды Excel". Думаю, что именно это условие нарушает Ваша функция - создается файл для записи и происходит запись.
Мне кажется, если Вам очень нужно выполнить именно то, что задумали, и именно так, то лучше привязать эту функцию к какому-нибудь событию, чем вставлять пользовательскую функцию с подобными действиями в ячейки. Только представьте, что Excel был бы вынужден делать, если бы эта функция была введена в пару сотен ячеек на листе при каждом пересчете листа (попытку пересчитать лист Excel предпринимает всякий раз, как только происходит изменение какой-либо ячейки, влияющей на значение хотябы одной другой ячейки в книге).