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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2009, 17:59   #1
Kuzia
 
Регистрация: 18.12.2009
Сообщений: 4
По умолчанию Как рассчитать периметр фигуры

Дана трапеция с основаниями А,В, высотой h, углами k,l.
Данные вводятся в Userform произвольные.
Периметр рассчитывается по формуле
P = (A + B) + h * ((1 / sin(k)) + 1 / sin(l))
Углы вводятся в форму в градусах. Для расчетов их надо перевести в радианы: k= значение в градусах*Пи/180.
Как написать эту формулу в VB? Через какие функции и т.п.???
Kuzia вне форума Ответить с цитированием
Старый 18.12.2009, 18:41   #2
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Все используемые здесь операции и функции являются стандартными математическими. Если пишете макрос, то так и пишите.
Пример:
Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

A = 1
B = 1
h = 1
k = 3.1415 / 2
l = k

P = (A + B) + h * ((1 / Sin(k)) + 1 / Sin(l))
MsgBox (P)

End Sub

Последний раз редактировалось motorway; 18.12.2009 в 18:45.
motorway вне форума Ответить с цитированием
Старый 23.12.2009, 17:16   #3
Kuzia
 
Регистрация: 18.12.2009
Сообщений: 4
По умолчанию Как рассчитать периметр фигуры

не совсем понятно.
У меня макрос получается такой:

Private Sub cmdStart_Click()
Dim A As Integer, B As Integer, h As Integer, k As Double, l As Double
A = Val(txtA.Text)
B = Val(txtB.Text)
h = Val(txth.Text)
If (A <> B) And ((k + l) < 180) And (k <= 90) And (l <= 90) Then
P = (A + B) + h * ((1 / sin(k)) + 1 / sin(l))
S = ((A + B) * h) / 2
txtP.Text = Str(P)
txtS.Text = Str(S)
Else
MsgBox "Îøèáêà!" + Chr(13) + "Äàííàÿ ôèãóðà íå ÿâëÿåòñÿ òðàïåöèåé", vbCritical + vbOKOnly, "Îøèáêà!!!"
txtA.Text = ""
txtB.Text = ""
txth.Text = ""
txtk.Text = ""
txtl.Text = ""
txtA.SetFocus
End If
End Sub
А куда вставить строчку про углы k и l? И как их описать в радианах?
Kuzia вне форума Ответить с цитированием
Старый 23.12.2009, 17:48   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Моя строчка про углы была только для примера. А для радианов умножьте углы на пи и разделите на 180, это надо вставить перед функцией синуса.
motorway вне форума Ответить с цитированием
Старый 24.12.2009, 07:51   #5
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Kuzia Посмотреть сообщение
не совсем понятно.
У меня макрос получается такой:

Private Sub cmdStart_Click()
Dim A As Integer, B As Integer, h As Integer, k As Double, l As Double
A = Val(txtA.Text)
B = Val(txtB.Text)
h = Val(txth.Text)
If (A <> B) And ((k + l) < 180) And (k <= 90) And (l <= 90) Then
P = (A + B) + h * ((1 / sin(k)) + 1 / sin(l))
S = ((A + B) * h) / 2
txtP.Text = Str(P)
txtS.Text = Str(S)
Else
MsgBox "Îøèáêà!" + Chr(13) + "Äàííàÿ ôèãóðà íå ÿâëÿåòñÿ òðàïåöèåé", vbCritical + vbOKOnly, "Îøèáêà!!!"
txtA.Text = ""
txtB.Text = ""
txth.Text = ""
txtk.Text = ""
txtl.Text = ""
txtA.SetFocus
End If
End Sub
А куда вставить строчку про углы k и l? И как их описать в радианах?
Я уже один раз Вам отвечал. Повторюсь.
По данным в вашей программе не возможно расчитать периметр не хватает хотя бы одного угла. Для расчета с использованием двух углов все просто - дабавляете еще два поля в своей UserFormе. в этом случае ваша прога будет иметь другой вид
Код:
    Private Sub cmdStart_Click()
    Dim A As Integer, B As Integer, h As Integer, k As Double, l As Double
    A = Val(txtA.Text)
    B = Val(txtB.Text)
    h = Val(txth.Text)
    k = Val(txtk.Text)
    l = Val(txtl.Text)
    If (A <> B) And ((k + l) < 180) And (k <= 90) And (l <= 90) And (k>0) And (l>0) Then
    k=k*3.14/180
    l=l*3.14/180
    P = (A + B) + h * ((1 / sin(k)) + 1 / sin(l))
    S = ((A + B) * h) / 2
    txtP.Text = Str(P)
    txtS.Text = Str(S)
    Else
        MsgBox "Îøèáêà!" + Chr(13) + "Äàííàÿ ôèãóðà íå ÿâëÿåòñÿ òðàïåöèåé", vbCritical + vbOKOnly, "Îøèáêà!!!"
    txtA.Text = ""
    txtB.Text = ""
    txth.Text = ""
    txtk.Text = ""
    txtl.Text = ""
    txtA.SetFocus
    End If
End Sub
Но наличие двух углов - избыточное условия. Можно провести расчет вводя только один угол - прилежащий к меньшей стороне.
Тогда ваш макрос будет иметь следующий вид
Код:
    Private Sub cmdStart_Click()
    Dim A As Integer, B As Integer, h As Integer, k As Double
    Dim l As Variant
    A = Val(txtA.Text)
    B = Val(txtB.Text)
    h = Val(txth.Text)
    k = Val(txtk.Text)
    k=k*3.14/180
    l = h/(sqrt((sqrt((a-b)^2)-h*ctg(h))^2)+h^2)
    If (A <> B) And ((k + l) < 180) And (k <= 1.57) And (l <= 1) And (k>0) And (l>0) Then
    P = (A + B) + h * ((1 / sin(k)) + 1 / l)
    S = ((A + B) * h) / 2
    txtP.Text = Str(P)
    txtS.Text = Str(S)
    Else
        MsgBox "Îøèáêà!" + Chr(13) + "Äàííàÿ ôèãóðà íå ÿâëÿåòñÿ òðàïåöèåé", vbCritical + vbOKOnly, "Îøèáêà!!!"
    txtA.Text = ""
    txtB.Text = ""
    txth.Text = ""
    txtk.Text = ""
    txtl.Text = ""
    txtA.SetFocus
    End If
End Sub
где l- синус второго угла.

Обратите внимание на существенное дополнение Вашего условия, а именно
Код:
And (k>0) And (l>0)
Это необходимо чтобы избежать деления на 0

Последний раз редактировалось Юнлинг; 24.12.2009 в 07:58.
Юнлинг вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как рассчитать значения в табеле? fs444 Microsoft Office Excel 2 16.11.2009 13:10
как рассчитать какой тренд-убывающий или возрастающий? kate158 Microsoft Office Excel 3 06.09.2009 05:36
как с помощью html рисовать геометрические фигуры 1100100011000101 HTML и CSS 3 01.05.2009 19:17
3D фигуры, как реализовать? Nikiforov Помощь студентам 2 22.02.2008 00:24