Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2009, 16:28   #1
GoreProgrammist
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 52
По умолчанию Проблема с InputBox в двух модулях.

Уважаемые программисты, суть проблемы:
Есть 2 функции в двух модулях, причём одна функция использует вторую функцию от тех же переменных. Переменные что первой, что и второй функций задаются через inputBox. Когда считаешь вторую функцию приходится дублировать ввод переменных для первой функции. Как сделать что бы уже введённые переменные могли считываться из первого модуля для второй функции, без дублирующего вызова InputBox.

поясню подробней: для расчёта первой функции используются переменные n и x, а для второй функции: n, x и m. При этом для расчёта второй функции используется результат вычисления первой. При вычислении второй функции программа просит ввести последовательно n, m, x, а затем ещё раз n и x для расчёта первой.

Последний раз редактировалось GoreProgrammist; 25.07.2009 в 16:41.
GoreProgrammist вне форума Ответить с цитированием
Старый 25.07.2009, 17:30   #2
pivas
Форумчанин
 
Регистрация: 03.04.2009
Сообщений: 412
По умолчанию

Видимо придётся сводить две функции в одну, либо возвращать значения переменных через ячейку листа.
pivas вне форума Ответить с цитированием
Старый 25.07.2009, 17:52   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Можно передать уже известные значения n и x во вторую функцию в качестве параметров.

Будет файл с функциями - получите пример.
EducatedFool вне форума Ответить с цитированием
Старый 25.07.2009, 18:21   #4
GoreProgrammist
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Можно передать уже известные значения n и x во вторую функцию в качестве параметров.

Будет файл с функциями - получите пример.
1ая функция:

Код:
Function PlnmL() As Variant
    Dim Result As Double
    Dim a As Variant
    Dim b As Variant
    Dim i As Long
    Dim n As Double
    Dim x As Double
    Dim Message1, Title1, Default1, MyValue1 As Variant 'ВВод переменной n
        Message1 = "Enter a value n"    ' Set prompt.
        Title1 = "Enter Data"
        Default1 = "1"    ' Set default.
        ' Display message, title, and default value.
        MyValue1 = InputBox(Message1, Title1, Default1)
    Dim Message3, Title3, Default3, MyValue3 As Variant 'ВВод переменной x
        Message3 = "Enter a value x"    ' Set prompt.
        Title3 = "Enter Data"
        Default3 = "1"    ' Set default.
        ' Display message, title, and default value.
        MyValue3 = InputBox(Message3, Title3, Default3)
n = MyValue1
x = MyValue3
Result = 1
a = 1
b = x
ElseIf n = 0 Then ' Полином степени n=0 равен 1
        Result = a
        PlnmL = Result
        Exit Function
ElseIf n = 1 Then ' Полином степени n=1 равен значению аргумента x
        Result = b
        PlnmL = Result
        Exit Function
        Result = 1
        a = 1
        b = x
Else
    For i = 2 To n Step 1 'Цикл расчёта полинома по реккурентной формуле
    Result = ((2 * i - 1) * x * b - (i - 1) * a) / i ' Рекурентная формула
    a = b
    b = Result
    Next i
    PlnmL = Result
    End If
End Function
2ая функция:

Код:
Function PPlnmL() As Variant
Dim n As Double
Dim m As Double
Dim x As Double
Dim a As Variant
Dim Result As Variant
Dim i As Long
    Dim Message1, Title1, Default1, MyValue1 As Variant 'ВВод переменной n
        Message1 = "Enter a value n"    ' Set prompt.
        Title1 = "Enter Data"
        Default1 = "1"    ' Set default.
        MyValue1 = InputBox(Message1, Title1, Default1)
    Dim Message2, Title2, Default2, MyValue2 As Variant 'ВВод переменной m
        Message2 = "Enter a value m"    ' Set prompt.
        Title2 = "Enter Data"
        Default2 = "1"    ' Set default.
        MyValue2 = InputBox(Message2, Title2, Default2)
    Dim Message3, Title3, Default3, MyValue3 As Variant 'ВВод переменной x
        Message3 = "Enter a value x"    ' Set prompt.
        Title3 = "Enter Data"
        Default3 = "1"    ' Set default.
        MyValue3 = InputBox(Message3, Title3, Default3)
n = MyValue1
m = MyValue2
x = MyValue3
    ElseIf m = 0 Then 'случай m=0
        PPlnmL = PlnmL(n, x)
    Else
        Result = 1
        a = -m
        For i = 1 To (m - 1) Step 1 ' Цикл для вычисления производной m-ой степени от (x)^(-m)
        a = a * (-m - 1)
        m = m + 1
        Next i
        Result = a * x ^ ((-2) * m)
        If (m Mod 2) = 0 Then
        PPlnmL = ((1 - (x ^ 2)) ^ (m / 2)) * Result * PlnmL(n, x) ' m чётное
    Else
        PPlnmL = -(Abs(1 - (x ^ 2)) ^ (m / 2)) * Result * PlnmL(n, x) ' m нечётное
    End If
    End If
    End Function

Последний раз редактировалось GoreProgrammist; 25.07.2009 в 18:25.
GoreProgrammist вне форума Ответить с цитированием
Старый 25.07.2009, 20:01   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Попробуйте что-то вроде этого:
Код:
Option Explicit

Function PlnmL(ByVal n As Double, ByVal x As Double) As Double
    Dim Result As Double, a As Double, b As Double, i As Long
    Result = 1: a = 1: b = x
    If n = 0 Then    ' Полином степени n=0 равен 1
        Result = a
        PlnmL = Result
        Exit Function
    ElseIf n = 1 Then    ' Полином степени n=1 равен значению аргумента x
        Result = b
        PlnmL = Result
        Exit Function    ' а это здесь зачем?????????
        Result = 1    ' эти строки ведь не будут выполняться ни при каких обстоятельствах...
        a = 1: b = x
    Else
        For i = 2 To n Step 1    'Цикл расчёта полинома по реккурентной формуле
            Result = ((2 * i - 1) * x * b - (i - 1) * a) / i    ' Рекурентная формула
            a = b: b = Result
        Next i
        PlnmL = Result
    End If
End Function

Function PPlnmL() As Double
    Dim n As Double, m As Double, x As Double, a As Double
    Dim Result As Double, i As Long
    n = InputBox("Enter a value N", "Enter Data", 1)
    m = InputBox("Enter a value M", "Enter Data", 3)
    x = InputBox("Enter a value X", "Enter Data", 7)

    If m = 0 Then    'случай m=0
        PPlnmL = PlnmL(n, x)
    Else
        Result = 1: a = -m
        For i = 1 To (m - 1)  ' Цикл для вычисления производной m-ой степени от (x)^(-m)
            a = a * (-m - 1): m = m + 1
        Next i
        Result = a * x ^ ((-2) * m)
        If (m Mod 2) = 0 Then
            PPlnmL = ((1 - (x ^ 2)) ^ (m / 2)) * Result * PlnmL(n, x)    ' m чётное
        Else
            PPlnmL = -(Abs(1 - (x ^ 2)) ^ (m / 2)) * Result * PlnmL(n, x)    ' m нечётное
        End If
    End If
End Function

Sub test()
    MsgBox PPlnmL
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 26.07.2009, 14:19   #6
GoreProgrammist
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 52
По умолчанию

А с проверкой не поможете:

Код:
Function PPlnmL() As Variant
    Dim n As Variant, m As Variant, x As Variant, a As Double
    Dim Result As Double, i As Long
    n = InputBox("Enter a value N", "Enter Data", 1)
    m = InputBox("Enter a value M", "Enter Data", 3)
    x = InputBox("Enter a value X", "Enter Data", 7)
  If (WorksheetFunction.IsNumber(m) = False) Then
        Dim Msg, Style, Title, Help, Ctxt, Response, MyString As Variant 'проверка m на число
        Msg = "m must be number"    ' Define message.
        Style = vbOKOnly + vbExclamation + vbDefaultButton2    ' Define buttons.
        Title = "ERROR"    ' Define title.
        Help = "DEMO.HLP"    ' Define Help file.
        Ctxt = 1000    ' Define topic
        Response = MsgBox(Msg, Style, Title, Help, Ctxt)
        PPlnmL = ""
      Exit Function
    ElseIf (WorksheetFunction.IsNumber(n) = False) Then                ' Проверка n на число
        Dim Msg2, Style2, Title2, Help2, Ctxt2, Response2, MyString2 As Variant
        Msg2 = "n must be number"    ' Define message.
        Style2 = vbOKOnly + vbExclamation + vbDefaultButton2    ' Define buttons.
        Title2 = "ERROR"    ' Define title.
        Help2 = "DEMO.HLP"    ' Define Help file.
        Ctxt2 = 1000    ' Define topic
        Response2 = MsgBox(Msg2, Style2, Title2, Help2, Ctxt2)
        PPlnmL = "" ' Оставляем пустую клетку
      Exit Function
   ElseIf (WorksheetFunction.IsNumber(x) = False) Then            'Проверка x на число
        Dim Msg3, Style3, Title3, Help3, Ctxt3, Response3, MyString3 As Variant
        Msg3 = "x must be number"    ' Define message.
        Style3 = vbOKOnly + vbExclamation + vbDefaultButton2    ' Define buttons.
        Title3 = "ERROR"    ' Define title.
        Help3 = "DEMO.HLP"    ' Define Help file.
        Ctxt3 = 1000    ' Define topic
        Response3 = MsgBox(Msg3, Style3, Title3, Help3, Ctxt3)
        PPlnmL = "" ' Оставляем пустую клетку
      Exit Function
    ElseIf (n < 0) Then                                             'Проверка что n > 0
        Dim Msg4, Style4, Title4, Help4, Ctxt4, Response4, MyString4 As Variant
        Msg4 = "n must be greater then zero"    ' Define message.
        Style4 = vbOKOnly + vbExclamation + vbDefaultButton2    ' Define buttons.
        Title4 = "ERROR"    ' Define title.
        Help4 = "DEMO.HLP"    ' Define Help file.
        Ctxt4 = 1000    ' Define topic
        Response4 = MsgBox(Msg4, Style4, Title4, Help4, Ctxt4)
        PPlnmL = "" ' Оставляем пустую клетку
       Exit Function
    ElseIf (n <> Round(n)) Then                                      'Проверка что n не дробь
        Dim Msg5, Style5, Title5, Help5, Ctxt5, Response5, MyString5 As Variant
        Msg5 = "n must be integer"    ' Define message.
        Style5 = vbOKOnly + vbExclamation + vbDefaultButton2    ' Define buttons.
        Title5 = "ERROR"    ' Define title.
        Help5 = "DEMO.HLP"    ' Define Help file.
        Ctxt5 = 1000    ' Define topic
        Response5 = MsgBox(Msg5, Style5, Title5, Help5, Ctxt5)
        PPlnmL = "" ' Оставляем пустую клетку
        Exit Function
    ElseIf (m < 0) Then                                             ' Проверка что m>0
        Dim Msg7, Style7, Title7, Help7, Ctxt7, Response7, MyString7 As Variant
        Msg7 = "m must be positive"    ' Define message.
        Style7 = vbOKOnly + vbExclamation + vbDefaultButton2    ' Define buttons.
        Title7 = "ERROR"    ' Define title.
        Help7 = "DEMO.HLP"    ' Define Help file.
        Ctxt7 = 1000    ' Define topic
        Response7 = MsgBox(Msg7, Style7, Title7, Help7, Ctxt7)
        PPlnmL = ""
       Exit Function
    ElseIf (m <> Round(m)) Then                                       'Проверка что m не дробь
        Dim Msg8, Style8, Title8, Help8, Ctxt8, Response8, MyString8 As Variant
        Msg8 = "m must be integer"    ' Define message.
        Style8 = vbOKOnly + vbExclamation + vbDefaultButton2    ' Define buttons.
        Title8 = "ERROR"    ' Define title.
        Help8 = "DEMO.HLP"    ' Define Help file.
        Ctxt8 = 1000    ' Define topic
        Response8 = MsgBox(Msg8, Style8, Title8, Help8, Ctxt8)
        PPlnmL = ""
Exit Function
    ElseIf m = 0 Then    'случай m=0
        PPlnmL = PlnmL(n, x)
    Else
        Result = 1: a = -m
        For i = 1 To (m - 1)  ' Цикл для вычисления производной m-ой степени от (x)^(-m)
            a = a * (-m - 1): m = m + 1
        Next i
        Result = a * x ^ ((-2) * m)
        If (m Mod 2) = 0 Then
            PPlnmL = ((1 - (x ^ 2)) ^ (m / 2)) * Result * PlnmL(n, x)    ' m чётное
        Else
            PPlnmL = -(Abs(1 - (x ^ 2)) ^ (m / 2)) * Result * PlnmL(n, x)    ' m нечётное
        End If
    End If
End Function
При вводе правильных данных выдаётся сообщение об ошибке...??
GoreProgrammist вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как у Inputbox узнать, что была нажата кнопка Сancel? Artem Компоненты Delphi 2 02.04.2011 23:31
Как создать inputbox? Paul_AG Общие вопросы C/C++ 3 18.04.2009 19:24
Проблема: ася работает только на одном из двух компов (через роутер) Sazary Свободное общение 4 13.03.2009 15:04
Inputbox NikolayGVB Microsoft Office Excel 1 04.02.2009 17:52
inputbox *** Gorychev Общие вопросы Delphi 3 04.05.2008 21:22