2015-12-03 3 views
0

У меня есть драйвер связи ActiveX для TCP/IP, который позволяет мне читать и записывать в ПЛК из файла Excel. Я хочу написать значение 5 МВт, имея еще 5 ячеек в Excel, я попробовал его с помощью цикла, и я написал в 5 переменных одновременно только одно значение. Теперь у меня есть «Select Case», это не работает. Пожалуйста помоги. Код выглядит следующим образом:Запись переменных в PLC из EXCEL

For tt = 1 To 5 
     valor(1) = Val(Cells(1, 4).Value) 
     valor(2) = Val(Cells(2, 4).Value) 
     valor(3) = Val(Cells(3, 4).Value) 
     valor(4) = Val(Cells(4, 4).Value) 
     valor(5) = Val(Cells(5, 4).Value) 

    Next tt 

    Select Case valor(tt) 
     Case valor(1) 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 5, 1, 1000, 300, valor) 
     Case valor(2) 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 6, 1, 1000, 300, valor) 
     Case valor(3) 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 7, 1, 1000, 300, valor) 
     Case valor(4) 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 8, 1, 1000, 300, valor) 
     Case valor(5) 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 9, 1, 1000, 300, valor) 
    End Select 

линия:

MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 9, 1, 1000, 300, valor) 

ли параметры связи с ПЛК в настройках. Последний параметр - это значение, которое нам нужно написать, которое я собираю из ячейки.

Код VBA в Excel 2002

СПАСИБО !!!

+0

случай выбора находится вне цикла for/next. Поэтому, когда вы достигаете случая выбора, значение tt всегда будет одинаковым. И неожиданное удивление ...tt всегда будет 6 после завершения цикла. Таким образом, случай выбора никогда не найдет допустимый результат. – cboden

ответ

0

попробовать этот

For tt = 1 To 5 
    valor(1) = Val(Cells(1, 4).Value) 
    valor(2) = Val(Cells(2, 4).Value) 
    valor(3) = Val(Cells(3, 4).Value) 
    valor(4) = Val(Cells(4, 4).Value) 
    valor(5) = Val(Cells(5, 4).Value) 

    Select Case valor(tt) 
    Case valor(1) 
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 5, 1, 1000, 300, valor) 
    Case valor(2) 
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 6, 1, 1000, 300, valor) 
    Case valor(3) 
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 7, 1, 1000, 300, valor) 
    Case valor(4) 
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 8, 1, 1000, 300, valor) 
    Case valor(5) 
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 9, 1, 1000, 300, valor) 
    End Select 
Next tt 
0

Как cboden указал на выбор-заявление находится вне для петли. Вместо реализации отборный-заявление вы должны сделать это так (прочитать остальную часть этого поста для объяснения):

For tt = 1 To 5 
    valor = Val(Cells(tt, 4).Value) 
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 4+tt, 1, 1000, 300, valor) 
Next tt 

Объяснение:

Имейте в виду, что для контура будет запустить весь код внутри цикла один раз для каждого значения ТТ (1,2,3,4,5), что означает, что это:

можно (и должны) записать как это:

For tt = 1 To 5 
    valor(tt) = Val(Cells(tt, 4).Value) 
Next tt 

Выбирать-заявление не только неправильно, но и не нужно. Правильный вариант (если вы решите положить его в для цикла, который я не рекомендуется, так как он является излишним и делает код труднее читать) является:

Select Case tt 
    Case 1 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 5, 1, 1000, 300, valor(1)) 
    Case 2 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 6, 1, 1000, 300, valor(2)) 
    Case 3 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 7, 1, 1000, 300, valor(3)) 
    Case 4 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 8, 1, 1000, 300, valor(4)) 
    Case 5 
     res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 9, 1, 1000, 300, valor(5)) 
End Select 

выше, может быть сокращен до :

res2 = MB1.Write ("10.56.35.214", "10.56.35.22", 502, 0, 16, 4 + тт, 1, 1000, 300, доблесть (тт))

для каждого значение tt (1,2,3,4,5), и если ввести его в петлю вместе с valor(tt) = Val(Cells(tt, 4).Value):

For tt = 1 To 5 
    valor(tt) = Val(Cells(tt, 4).Value) 
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 4+tt, 1, 1000, 300, valor(tt)) 
Next tt 

Поскольку мы не должны держать массив доблести мы можем удалить valor(tt) и заменить его valor, таким образом делая готовый код:

For tt = 1 To 5 
    valor = Val(Cells(tt, 4).Value) 
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 4+tt, 1, 1000, 300, valor) 
Next tt 

Кроме того, я хотел бы предложить, что вы, в в будущем, воздерживаться от размещения IP-адресов в таком открытом форуме.

Смежные вопросы