Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Пользовательская функция : возврат результата Добавлено: 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)
       
    ' вернуть результат расчета.
    
    AskFwp = strOut
    Debug.Print strOut
    
    
End Function

Ответить

  Ответы Всего ответов: 1  

Номер ответа: 1
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #1
Добавлено: 19.10.06 21:23
В одной из статей о пользовательских функциях Excel (уже не помню где) я прочел, что для того, чтобы пользовательскую функцию можно было использовать в листе книги, она не только должна возвращать результат присвоением его имени этой функции, но должны соблюдаться еще несколько условий, одно из которых, как я помню, было обозначено, как "неизменность рабочей среды Excel". Думаю, что именно это условие нарушает Ваша функция - создается файл для записи и происходит запись.

Мне кажется, если Вам очень нужно выполнить именно то, что задумали, и именно так, то лучше привязать эту функцию к какому-нибудь событию, чем вставлять пользовательскую функцию с подобными действиями в ячейки. Только представьте, что Excel был бы вынужден делать, если бы эта функция была введена в пару сотен ячеек на листе при каждом пересчете листа (попытку пересчитать лист Excel предпринимает всякий раз, как только происходит изменение какой-либо ячейки, влияющей на значение хотябы одной другой ячейки в книге).

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам