Страницы: 1
RSS
Определения 4 чисел, из заданного диапазона, с определённым условиями, Помогите пожалуйста
 
Доброго времени суток уважаемые эксперты excel, столкнулся с проблемой. Надо создать файл excel (по своей сути калькулятор) для определение шестерен, они исчисляются математическим способом: делением произведений двух пар шестерен, которые должны равняться дифференциалу, также рассчитанному математическим способом(его я уже сделал). есть Определённый набор шестерен (чисел), этот набор чисел в произведении должен быть равен значению дифференциала, как я уже и сказал, но вот только самое выражение должно выполнять граничные условия, которые я привел в таблице, прилагаю файл, который у меня вышел, на больше знаний у меня не хватило, надеюсь на вашу помощь  
 
На правах "любителя (т.е. - совсем НЕ эксперта) поковыряться в чужих задачах" слегка улучшил (а может, и не улучшил вовсе) таблицу:

1. "Подсветил" ячейки, значения в которых нужно сравнивать при подоборе параметров (мне так, обычно, удобнее);
2. Добавил проверку выполнения условий с условным форматированием: "зелёный" - ОК; "красный" - НЕ ок;
3. Добавил "проверку значений" в ячейках с подбираемыми параметрами (с выбором из списка). Здесь для себя, скорее всего, добавил бы элемент управления "Счётчик" или что-нибудь подобное, позволяющее удобнее "играться" со значениями.

Дальше, НАВЕРНОЕ, попробовал бы посмотреть в сторону "Анализ "ЧТО ЕСЛИ"", хотя не особо уверен, что это именно то, что нужно.

Более серьёзные решения подскажут эксперты.
Изменено: Михаил Нарвич - 14.06.2025 08:06:47
 
4790 вариантов нашлось при допустимой разнице в 1%. Проверяйте, мож напутал чего.
power query
Изменено: AlienSx - 14.06.2025 08:13:57
Пришелец-прораб.
 
Вариант с изменением допуска
ближайшая комбинация R * K / ( S * L ) = 73*97/(60*71)  [ 73*97/(71*60) ]
расхождение 0,00013%
д.массив
 
Всем доброго времени суток, просмотрел каждый вариант, и скажу огромное спасибо за ваш труд, когда начал подставлять другие значения "угол наклона зубьев"  например значение 26, 44, 40, 22,4 появляется ошибка, также в графе итоговые шестерни не меняются значения, которые в последствии, изменяют расчётное значение дифференциала.  Так это работает в половине значений, угол может быть и не целым всегда. Также вопрос, 4 шестерни из графы (зубья в наличии) гарантировано будут отсутствовать, т.к они используются для нарезки количества зубьев,  Если я уберу из этого диапазона 4 шестерни, то будет ли работать данная формула, дополнил таблицу значениями Числом нарезаемых зубьев на колесе, и привел шестерни, которые используются для нарезки данной шестерни, которые не будут участвовать в нарезке угла.  
 
good-graf, мне кажется, что это уже больше похоже на ТЗ для Платной ветки
 
Просто у меня возникла проблема, и я решил спросить мнение людей на данном форуме, с надеждой, что помогут это сделать. Я честно не знаю сложности этих работ, является расчёт данных формул сложным или нет, но точно знаю что это мне не под силу. Возможно это похоже на тз для платной ветки, не отрицаю.
 
Вот вам вариант макросом.
Код
Option Explicit
Private rSRLK As Range
Private aCur As Variant
Private aMax As Variant
Private aVal As Variant
Private bExit As Boolean

Sub Подобрать_шестерни()
    Dim sh As Worksheet
    Set sh = ActiveSheet
    
    Set rSRLK = sh.Range("B6:B9")
    
    ReDim aVal(1 To rSRLK.Rows.Count)
    
    Dim cellSRLK As Range, rVal As Range, yy As Long
    For Each cellSRLK In rSRLK
        Set rVal = GetValidationRange(cellSRLK)
        'Set rVal = rVal.Resize(3)
        yy = yy + 1
        aVal(yy) = rVal.Value
    Next
    
    Dim xCur As Long
    ReDim aCur(LBound(aVal) To UBound(aVal))
    For xCur = LBound(aCur) To UBound(aCur)
        aCur(xCur) = 1
    Next
    'aCur(4) = 20
    
    Dim diff As Variant
    bExit = False
    Do
        If bExit Then Exit Do
        If aVal(4)(aCur(4), 1) + aVal(3)(aCur(3), 1) > aVal(2)(aCur(2), 1) + 25 Then
            If aVal(4)(aCur(4), 1) + aVal(3)(aCur(3), 1) + aVal(1)(aCur(1), 1) > 226 Then
                If aVal(2)(aCur(2), 1) + aVal(1)(aCur(1), 1) > aVal(3)(aCur(3), 1) + 25 Then
                    If aVal(4)(aCur(4), 1) + aVal(3)(aCur(3), 1) > 96 Then
                        If aVal(2)(aCur(2), 1) + aVal(1)(aCur(1), 1) > 100 Then
                            PrintSRLK
                            If WorksheetFunction.And(sh.Range("G13:G17")) Then
                                If IsEmpty(diff) Then diff = Abs(sh.Range("F3").Value - sh.Range("E7").Value) + 1
                                If diff > Abs(sh.Range("F3").Value - sh.Range("E7").Value) Then
                                    diff = Abs(sh.Range("F3").Value - sh.Range("E7").Value)
                                    aMax = aCur
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        End If
        AddOne 1
        DoEvents
    Loop
    
    If Not IsEmpty(aMax) Then aCur = aMax
    PrintSRLK
End Sub

Private Sub AddOne(xx As Long)
    If xx > UBound(aCur) Then
        bExit = True
    End If
    If bExit Then Exit Sub
    
    aCur(xx) = aCur(xx) + 1
    If aCur(xx) > UBound(aVal(xx)) Then
        aCur(xx) = 1
        If xx > 1 Then Application.StatusBar = Join(aCur, " ")
        
        AddOne xx + 1
    End If
End Sub

Private Sub PrintSRLK()
    Dim yy As Long, arr As Variant
    For yy = 1 To UBound(aCur)
        arr = aVal(yy)
        rSRLK.Cells(yy, 1).Value = arr(aCur(yy), 1)
    Next
End Sub

Private Function GetValidationRange(rr As Range) As Range
    Dim ss As String
    ss = rr.Validation.Formula1
    ss = Mid(ss, 2)
    Set GetValidationRange = rr.Parent.Range(ss)
End Function
 
Этот вариант работает быстрее.
Скрытый текст

Шестерни, подобранные с помощью макроса. Погрешность 0,00025%.

Итоговые  
    шестерни
S73
R82
L71
K95
 
В этом варианте погрешность 0,00009%.

S97
R65
L48
K92
Скрытый текст
 
Цитата
good-graf:   в графе итоговые шестерни не меняются значения,
предположу, что эксель староват
скрин
 
Добрый день всем, оказывается я не умею вводить коды макросов, попробовал по инструкции в интернете, к сожалению не вышло, может я просто не понимаю этого. Извините за моё отсутствие знаний в этой сфере, но не могли бы вы подсказать как это сделать. По инструкции я сделал в следующем порядке:
включил режим разработчика, после зашёл в пункт Visual basic. Создаю новый модуль, и вписываю в него код данный в одном из сообщений выше. Но у меня высветил ошибку пометив красным "Выделю его красным цветом". Как я понял это значит Подобрать шестерни (), возможно я ошибаюсь, после ввода текста подобрать шестерни() я попытался запустить макрос, но не понял как сам он работает
Скрытый текст
Изменено: Sanja - 26.06.2025 09:20:51 (Код следует оформлять соответствующим тэгом (<...>), длинный код можно прятать под спойлер)
 
Ошибку с кириллицей можно убрать, если перед копированием кода с форума переключить раскладку на русскую.
Цитата
написал:
попытался запустить макрос, но не понял как сам он работает
Проблема в том, что макрос не работает, или в том, что не поняли, как он работает?
 
не понял как работает
 
А, это нормально  :D  
 
Цитата
good-graf написал:
не понял как работает
главное, что работает  :D
 
Я имею ввиду, я не понимаю как им пользоваться .....
 
Создание макросов и пользовательских функций на VBA
Способ 1. Создание макросов в редакторе Visual Basic
Страницы: 1
Читают тему
Наверх