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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2009, 11:57   #1
Exo
Форумчанин
 
Аватар для Exo
 
Регистрация: 25.09.2007
Сообщений: 102
Печаль Не работает код (If_Then_ElseIf_)

Доброго времени суток, подскажите почему не работает код:

Код:
Sub SID11()

Dim Stock As Double
Dim SID As Double

On Error Resume Next

Stock = [A7]
If Stock <= [B7] Then SID = Stock / ([B7] / 30.41) 'если 1
ElseIf Stock <= [B7] + [C7] Then SID = Stock / (([B7] + [C7]) / (30.41 * 2)) 'если 2
ElseIf Stock <= [B7] + [C7] + [D7] Then SID = Stock / (([B7] + [C7] + [D7]) / (30.41 * 3)) 'если 3
ElseIf Stock <= [B7] + [C7] + [D7] + [Е7] Then SID = Stock / (([B7] + [C7] + [D7] + [Е7]) / (30.41 * 4)) 'если 4
ElseIf Stock <= [B7] + [C7] + [D7] + [Е7] + [F7] Then SID = Stock / (([B7] + [C7] + [D7] + [Е7] + [F7]) / (30.41 * 5)) 'если 5
ElseIf Stock <= [B7] + [C7] + [D7] + [Е7] + [F7] + [G7] Then SID = Stock / (([B7] + [C7] + [D7] + [Е7] + [F7] + [G7]) / (30.41 * 6)) 'если 6
ElseIf Stock > [B7] + [C7] + [D7] + [Е7] + [F7] + [G7] Then SID = 6 * 30.41 + ((Stock - [B7] + [C7] + [D7] + [Е7] + [F7] + [G7]) / [G7])
End If
SID = [N7]
End Sub
Exo вне форума Ответить с цитированием
Старый 02.03.2009, 12:28   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Выбираем в редакторе VBA пункт меню Debug - Compile VBAProject,
и сразу видим причину неработоспособности кода:



Правильно будет так:
Код:
    If Stock <= [B7] Then ' вставляем перевод строки
        SID = Stock / ([B7] / 30.41)    'если 1
    ElseIf Stock <= [B7] + [C7] Then SID = Stock / (([B7] + [C7]) / (30.41 * 2))    'если 2
    ElseIf Stock <= [B7] + [C7] + [D7] Then SID = Stock / (([B7] + [C7] + [D7]) / (30.41 * 3))    'если 3
Можно написать так: (код более понятен)
Код:
Sub SID_new()
    Dim Stock As Double, SID As Double
    Stock = [A7]

    Select Case Stock
        Case Is <= [B7]: SID = Stock / ([B7] / 30.41)   'если 1
        Case Is <= [B7] + [C7]: SID = Stock / (([B7] + [C7]) / (30.41 * 2))    'если 2
        Case Is <= [B7] + [C7] + [D7]: SID = Stock / (([B7] + [C7] + [D7]) / (30.41 * 3))    'если 3
            ' и так далее
    End Select
    [N7] = SID ' а не наоборот
End Sub
По идее, всё это можно вычислить одной формулой (без перебора вариантов)
Но написать такую формулу я не смогу...

Последний раз редактировалось EducatedFool; 02.03.2009 в 12:35.
EducatedFool вне форума Ответить с цитированием
Старый 02.03.2009, 12:32   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

во-первых, не совсем понятно что необходимо получить, а во-вторых, у вас куча ифов, которые выбирают чему же будет равно SID, а после всего все эти усилия решительно зачекнуты строкой SID = [N7]
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 02.03.2009, 12:35   #4
Exo
Форумчанин
 
Аватар для Exo
 
Регистрация: 25.09.2007
Сообщений: 102
По умолчанию

вот за это ненавижу VBA глупая ошибка (которая для новичка и не ошибка вовсе, подумаешь на строчку не перескочи) и нечего не работает и думаешь сидишь...


Спасибо большое.
Exo вне форума Ответить с цитированием
Старый 02.03.2009, 12:37   #5
Exo
Форумчанин
 
Аватар для Exo
 
Регистрация: 25.09.2007
Сообщений: 102
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
во-первых, не совсем понятно что необходимо получить, а во-вторых, у вас куча ифов, которые выбирают чему же будет равно SID, а после всего все эти усилия решительно зачекнуты строкой SID = [N7]
эээ SID = [N7] я хотел сказать, мол вставляй мне получившееся значение SID в ячейку N7....
Exo вне форума Ответить с цитированием
Старый 02.03.2009, 12:57   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
вот за это ненавижу VBA
VBA надо любить... и воздастся...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 02.03.2009, 13:06   #7
Exo
Форумчанин
 
Аватар для Exo
 
Регистрация: 25.09.2007
Сообщений: 102
По умолчанию

я пытаюсь посчитать некий SID по нескольким условиям.

более подробно в приложении (уже сейчас с помощью калькулятора вижу что что-то я не так в VBA наделал )
Вложения
Тип файла: zip SID2.zip (12.8 Кб, 12 просмотров)
Exo вне форума Ответить с цитированием
Старый 02.03.2009, 14:30   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Проще всего применить пользовательскую функцию:

Код:
Function SID(ByVal Stock As Long, ByRef Demand_Plane As Range)
    s = 0
    For i = 1 To Demand_Plane.Cells.Count
        s = s + Val(Demand_Plane.Cells(i))
        If s >= Stock And s <> 0 Then SID = Stock * 30.42 * i / s: Exit Function
    Next
    LastCell = Demand_Plane.Cells(Demand_Plane.Cells.Count)
    If LastCell <> 0 Then SID = 6 * 30.41 + (Stock - s) / LastCell
End Function
И в ячейку ввести формулу типа =SID(A7;B7:G7)

Пример во вложении:
(на будущее - прикрепляйте файлы в формате Excel 2003)

Последнее условие не учёл, так как оно там не в тему... (два последних условия одинаковы)

(добавлено)
теперь учёл последнее условие. Но оно не проверяется (точнее, значение не вычисляется), если в последней ячейке диапазона Demand_Plane находится ноль (как в Вашем файле) - делить на ноль VBA пока не умеет.
Самостоятельно замените в приложенном файле код функции на обновлённый.
Вложения
Тип файла: rar Копия Xl0000005.rar (9.8 Кб, 13 просмотров)

Последний раз редактировалось EducatedFool; 02.03.2009 в 14:43.
EducatedFool вне форума Ответить с цитированием
Старый 02.03.2009, 15:20   #9
Exo
Форумчанин
 
Аватар для Exo
 
Регистрация: 25.09.2007
Сообщений: 102
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Проще всего применить пользовательскую функцию:

Код:
Function SID(ByVal Stock As Long, ByRef Demand_Plane As Range)
    s = 0
    For i = 1 To Demand_Plane.Cells.Count
        s = s + Val(Demand_Plane.Cells(i))
        If s >= Stock And s <> 0 Then SID = Stock * 30.42 * i / s: Exit Function
    Next
    LastCell = Demand_Plane.Cells(Demand_Plane.Cells.Count)
    If LastCell <> 0 Then SID = 6 * 30.41 + (Stock - s) / LastCell
End Function
И в ячейку ввести формулу типа =SID(A7;B7:G7)

Пример во вложении:
(на будущее - прикрепляйте файлы в формате Excel 2003)

Последнее условие не учёл, так как оно там не в тему... (два последних условия одинаковы)

(добавлено)
теперь учёл последнее условие. Но оно не проверяется (точнее, значение не вычисляется), если в последней ячейке диапазона Demand_Plane находится ноль (как в Вашем файле) - делить на ноль VBA пока не умеет.
Самостоятельно замените в приложенном файле код функции на обновлённый.
спасибо большое, все понятно, но я бы хотел решить эту задачу макросом

(просто эта процедура будет частью нечто большего)
Exo вне форума Ответить с цитированием
Старый 02.03.2009, 15:48   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
но я бы хотел решить эту задачу макросом
А что Вам мешает использовать данную функцию в своём макросе?

К примеру, так:
Код:
Sub ВашМакрос()
    Dim Stock As Double
    Stock = [A7]
    result = SID(Stock, [B7:G7])
    [H7] = result
    MsgBox "SID = " & result
End Sub


Function SID(ByVal Stock As Long, ByRef Demand_Plane As Range)
    s = 0
    For i = 1 To Demand_Plane.Cells.Count
        s = s + Val(Demand_Plane.Cells(i))
        If s >= Stock And s <> 0 Then SID = Stock * 30.42 * i / s: Exit Function
    Next
    LastCell = Demand_Plane.Cells(Demand_Plane.Cells.Count)
    If LastCell <> 0 Then SID = 6 * 30.41 + (Stock - s) / LastCell
End Function
Или даже проще:
Код:
Sub ВашМакрос2()
    [H7] = SID([A7], [B7:G7])
End Sub
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код проверки столкновений не работает. Манжосов Денис :) Общие вопросы Delphi 8 02.02.2009 10:31
Не работает код... prizrak1390 Общие вопросы Delphi 3 22.10.2008 14:59
Код для выравнивания не работает Михаил Юрьевич Общие вопросы Delphi 3 24.02.2008 18:09
Почему не работает код? Kashp Общие вопросы Delphi 3 09.08.2007 17:33