Найти 2 элемента в массиве, которые дают целевой результат в простом уравнении - PullRequest
2 голосов
/ 09 ноября 2019

В электронике мне нужно определенное сопротивление, однако на рынке существуют ограниченные стандартные значения. Если бы я сделал комбинацию из двух резисторов параллельно, я мог бы получить очень близкий результат к цели. Вопрос в том, какие 2 резистора могли бы дать лучший результат.

Пока у меня есть эти элементы:

  1. Столбец Excel с 86 стандартными значениями от 0,25 до 1000000 в A2: ячейки A87
  2. Целевое сопротивление, которое явведите в ячейку C3
  3. R1 и R2 - переменные, которые могут получить 86 значений от ячеек A2 до A87
  4. уравнение, дающее параллельное сопротивление: Rtarget = R1 * R2 / (R1 + R2)

Я не знаю VBA и считаю эту задачу хорошей возможностью узнать больше об операциях VBA. Здесь я начал с переменных, но я не знаю, как поступить. Ваша помощь будет очень признательна.

Sub ResCom()

Dim Rstd As Double 
Dim Rt As Double, R1 As Double, R2 As Double

Rstd = Range("a2:a87").Value

.
.
.

End Sub

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 09 ноября 2019

Попробуйте это

Sub ResCom()
    Dim Rt as Double, R1 as Double, R2 as Double

    Rt = Range("C3").Value

    For i = 2 to 87
       R1 = Range("A" & i).Value
       if R1 < Rt Then
          For j = 2 to 87
             R2 = Range("A" & j).Value
             if Round(Rt,2) = Round((R1*R2/(R1+R2)),2) then
                ' Success you have found a Resistance Combination that matches
             End If
          Next j
       End If
    Next i
End Sub

...

0 голосов
/ 09 ноября 2019

Мы можем создать инструмент, который можно легко использовать повторно.

Сначала введите значения сопротивления в A2 - A87 . Затем выполните:

Sub tablemaker()
    Dim i As Long, j As Long, K As Long

    K = 2
    For i = 2 To 87
        For j = i To 87
            Cells(K, 2) = Cells(i, 1)
            Cells(K, 3) = Cells(j, 1)
            K = K + 1
        Next j
    Next i

    Range("D2:D" & K - 1).Formula = "=B2*C2/(C2+B2)"
End Sub

Это создаст таблицу сопротивления в B2 - D3742 . В таблице перечислены пары комбинаций и соответствующее сопротивление каждой пары.

(перестановки не нужны, поскольку пара 4,2 действительно совпадает с 2,4)

Затем введите целевое значение в ячейку E2 . В E3 введите формулу массива :

=MATCH(MIN(ABS(D2:D3742-E2)),ABS(D2:D3742-E2),0)

Формулы массива необходимо вводить с помощью Ctrl + Shift + Введите , а не просто Enter . Если это сделано правильно, формула появится в фигурных скобках вокруг нее в строке формул.

Это дает строку в таблице с ближайшим совпадением. Наконец, в E4 введите:

=INDEX(B2:B3741,$E3)

и скопируйте его в F4

enter image description here

Для повторного запуска просто измените цельв E2

0 голосов
/ 09 ноября 2019

Просто, чтобы начать, используйте это, чтобы продолжить

Option Explicit

Sub ResCom()

    Dim Rstd As Double
    Dim Rt As Double, R1 As Double, R2 As Double

    Rstd = Range("a2:a87").Value

    ' step thru upper triangle of R1/R2 values
    ' (lower triangle gives same results)
    Dim r1Row As Long, r2Row As Long
    For r1Row = LBound(Rstd) To UBound(Rstd)
        For r2Row = r1Row To UBound(Rstd)
            ' here is where you solve for  Rtarget=R1*R2/(R1+R2)
            ' R1 = Rstd(r1Row)
        Next r2Row
    Next r1Row


End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...