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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2009, 15:52   #11
Exo
Форумчанин
 
Аватар для Exo
 
Регистрация: 25.09.2007
Сообщений: 102
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
А что Вам мешает использовать данную функцию в своём макросе?

К примеру, так:
Код:
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
да не мешает...просто я не понимаю как работает Ваша функция, а свои IF-ы я хоть как-то понять могу...НО они не работают

З.Ы. для меня как для новичка, наверно проще IF использовать...
Exo вне форума Ответить с цитированием
Старый 02.03.2009, 15:55   #12
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
просто я не понимаю как работает Ваша функция
Так разберитесь... там 6 строк кода.
Если надо, напишу комментарии к каждой строке.

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

PS: И не надо цитировать предыдущие сообщения (по крайней мере, полностью)
EducatedFool вне форума Ответить с цитированием
Старый 02.03.2009, 16:04   #13
Exo
Форумчанин
 
Аватар для Exo
 
Регистрация: 25.09.2007
Сообщений: 102
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Так разберитесь... там 6 строк кода.
Если надо, напишу комментарии к каждой строке.
было бы классно

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
А что в таком случае понятно?
понятно, что Вы можете и сделали
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Последнее условие не учёл, так как оно там не в тему... (два последних условия одинаковы)
я не верно написал условие в примере, след. читать так: 7. Если A7 > B7+C7+D7+E7+F7+G7, то H7=30.42*6+((A7-(B7+C7+D7+E7+F7+G7))/G7))

Последний раз редактировалось Exo; 02.03.2009 в 16:11.
Exo вне форума Ответить с цитированием
Старый 02.03.2009, 16:17   #14
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Что будет непонятно - спрашивайте:
Код:
Function SID(ByVal Stock As Long, ByRef Demand_Plane As Range)
    ' получаем в качестве параметров число Stock и диапазон ячеек Demand_Plane

    ' будем перебирать все ячейки диапазона Demand_Plane (начиная с первой), и подсчитывать их сумму
    ' как только сумма превысит значение Stock, то сразу вычисляем SID и выходим из функции

    s = 0    'начальное значение суммы
    For i = 1 To Demand_Plane.Cells.Count
        '  Demand_Plane.Cells.Count - количество ячеек в диапазоне Demand_Plane

        s = s + Val(Demand_Plane.Cells(i))    ' добавляем к сумме значение из очередной ячейки

        ' если сумма превысила значение Stock (s >= Stock)
        ' и сумма не равна нулю (s <> 0) - поскольку в формуле производится деление на эту сумму
        ' то вычисляем SID по формуле SID = Stock * 30.42 * i / s
        ' и сразу же выходим из функции (Exit Function)
        If s >= Stock And s <> 0 Then SID = Stock * 30.42 * i / s: Exit Function
        ' при выходе из функции будет возвращено последнее значение переменной SID
    Next
    
    ' если выполнение кода дошло до этого места,
    ' значит, сумма всех ячеек не превышает значение Stock
    ' для этого случая у нас есть другая формула
    
    ' LastCell - значение последней ячейки диапазона Demand_Plane
    LastCell = Demand_Plane.Cells(Demand_Plane.Cells.Count)
    
    ' если это значение не равно нулю, то вычисляем SID по формуле
    If LastCell <> 0 Then SID = 6 * 30.41 + (Stock - s) / LastCell
    
    ' если LastCell равно нулю, то вычисления SID = 6 * 30.41 + (Stock - s) / LastCell не произойдёт
    ' поскольку начального значения для переменной SID в начале функции мы не задавали
    ' функция возвратит пустое значение ("")
End Function
Цитата:
я не верно написал условие в примере, след. читать так
я уж догадался...
EducatedFool вне форума Ответить с цитированием
Старый 02.03.2009, 16:50   #15
Exo
Форумчанин
 
Аватар для Exo
 
Регистрация: 25.09.2007
Сообщений: 102
По умолчанию

EducatedFool, ушел, буду не скоро

З.Ы. буду разбираться, спасибо большое!
Exo вне форума Ответить с цитированием
Старый 10.04.2012, 12:42   #16
sorockinalex
Пользователь
 
Регистрация: 10.10.2009
Сообщений: 22
По умолчанию

Ребята, вообще ниченго не пойму, вчера работал код, а сегодня вообще не пашет....
Код:
Private Sub Btn_OK_Click()
Dim rst As Recordset
'Dim rst1 As Recordset
Set rst = CurrentDb.OpenRecordset("SELECT Key, Id, Pass FROM Employees WHERE Id=" & Int(InputBox_EmployeeId.Value), dbOpenDynaset)
'Set rst1 = CurrentDb.OpenRecordset("Log_LogonLogoff", dbOpenDynaset)
MsgBox rst.RecordCount

If rst.RecordCount = 0 Then
MsgBox "Пользователь с табельным номером " + InputBox_EmployeeId.Value + " не найден. Проверьте правильность введённых данных."
    ElseIf Str(rst!Pass) = Str(InputBox_EmployeePass.Value) Then
    MsgBox "="
'    EmployeeId = rst!Id
    'rst1.AddNew
'    Log_LogonLogoff_Key = rst1.Key
    'rst1!EmployeeKey = rst!Key
    'rst1!LogonTime = Time
    'rst1.Update
'    rst.Close
    'rst1.Close
'    Set rst = Nothing
    'Set rst1 = Nothing
'    DoCmd.Close
    'DoCmd.OpenForm ("CreateNewOfficeMemo")
Else: MsgBox "Пароль не верен! За новым паролем обратитесь к системному администратору."
End If
End Sub
Фишка в том, что если удалить все условия, то MsgBox rst.RecordCount работает, а если нет, то и он не работает, ничего не выдаёт.. Странно... Он ведь стоит перед условиями и полюбому должен выполняться!! На трёх компьютерах проверил - одна и та же фигня. Оффис2003..

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

а если это
'Set rst = CurrentDb.OpenRecordset....
раскомментировать?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 10.04.2012, 13:00   #18
sorockinalex
Пользователь
 
Регистрация: 10.10.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
а если это
'Set rst = CurrentDb.OpenRecordset....
раскомментировать?
это я уж потом закомментировал, независимо от этого, есть условие после - не работает.. а вот только что начало работать, ничего абсолютно не менял... в ступоре.!
sorockinalex вне форума Ответить с цитированием
Старый 10.04.2012, 13:09   #19
sorockinalex
Пользователь
 
Регистрация: 10.10.2009
Сообщений: 22
По умолчанию

даже так не работает
Код:
Private Sub Btn_OK_Click()
Dim Employees_Recordset As Recordset
Dim Log_LogonLogoff_Recordset As Recordset

'Set Employees_Recordset = CurrentDb.OpenRecordset("SELECT Key, Id, Pass FROM Employees WHERE Id=" & Int(InputBox_EmployeeId.Value), dbOpenDynaset)
'Set Log_LogonLogoff_Recordset = CurrentDb.OpenRecordset("Log_LogonLogoff", dbOpenDynaset)

MsgBox Employees_Recordset.RecordCount

'If Employees_Recordset.RecordCount = 0 Then
'    MsgBox "Пользователь с табельным номером " + InputBox_EmployeeId.Value + " не найден. Проверьте правильность введённых данных."
'    ElseIf Str(Employees_Recordset!Pass) = Str(InputBox_EmployeePass.Value) Then
'    MsgBox "="
'    'Присваиваем глобальные переменные залогиненного пользователя
'    EmployeeId = Employees_Recordset!Id                        'Запоминаем табельный номер
'    Log_LogonLogoff_Key = Log_LogonLogoff_Recordset.Key        'Запоминаем порядковый номер записи в таблице Log_LogonLogoff
'
'
'
'    'rst1.AddNew
'    'rst1!EmployeeKey = rst!Key
'    'rst1!LogonTime = Time
'    'rst1.Update
'    'rst1.Close
'    'Set rst1 = Nothing
'    Employees_Recordset.Close
'    Set Employees_Recordset = Nothing
'
'    DoCmd.Close
'    DoCmd.OpenForm ("CreateNewOfficeMemo")
Else: MsgBox "Пароль не верен! За новым паролем обратитесь к системному администратору."
End If
End Sub
sorockinalex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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