从EXCEL在PLC中写入变量

从EXCEL在PLC中写入变量,excel,vba,plc,Excel,Vba,Plc,我有一个用于TCP/IP的ActiveX通信驱动程序,允许我从Excel文件读写PLC。我想在Excel中用另外5个单元格来写5 MW的值,我用loop试过了,一次只在5个变量中写一个值。现在我有一个“选择案例”,它对我不起作用。请帮忙。代码如下: For tt = 1 To 5 valor(1) = Val(Cells(1, 4).Value) valor(2) = Val(Cells(2, 4).Value) valor(3) = Val(Ce

我有一个用于TCP/IP的ActiveX通信驱动程序,允许我从Excel文件读写PLC。我想在Excel中用另外5个单元格来写5 MW的值,我用loop试过了,一次只在5个变量中写一个值。现在我有一个“选择案例”,它对我不起作用。请帮忙。代码如下:

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)
是与PLC通信的参数,用于设置。最后一个参数是我们需要写入的值,我从单元格中收集

代码是Excel2002中的VBA

谢谢

试试这个

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

正如cboden指出的,select语句在for循环之外。您不应该实现select语句,而应该这样做(阅读本文的其余部分以了解解释):


说明:

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
请记住,for循环将为tt(1,2,3,4,5)的每个值运行一次循环内的所有代码,这意味着:

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
可以(也应该)这样写:

For tt = 1 To 5
    valor(tt) = Val(Cells(tt, 4).Value)
Next tt
select语句不仅是错误的,而且是不必要的。正确的版本(如果您选择将其放入for循环,我不建议这样做,因为它是冗余的,并且使代码更难阅读)是:

上述内容可缩短为:

res2=MB1.Write(“10.56.35.214”、“10.56.35.22”、502、0、16、4+tt、1、1000、300、valor(tt))

对于tt(1,2,3,4,5)的每个值,如果与
valor(tt)=Val(单元格(tt,4)一起放入for循环,则值)
将形成:

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数组,我们可以删除
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地址。

所选案例不在for/next循环中。因此,当您达到select case时,tt的值将始终相同。还有惊喜。。。循环结束后tt将始终为6。因此,select案例将永远找不到有效的结果。
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