如何在VBA上编程循环到DDEPoke调用?

时间:2015-11-24 18:46:32

标签: vba

我正在尝试将循环编程到对VBA支持的函数(称为OPC)的DDEPoke调用中。这将使我能够从Excel电子表格写入PLC(RSLogix 500)数据库。

这是代码:

Private Function Open_RsLinx()

On Error Resume Next
Open_RsLinx = DDEInitiate(RsLinx, C1)

If Err.Number <> 0 Then
    MsgBox "Error Connecting to topic", vbExclamation, "Error"
    OpenRSLinx = 0 'Return false if there was an error
End If


End Function

Sub CommandButton1_Click()

RsLinx = Open_RsLinx()
For i = 0 To 255

    DDEPoke RsLinx, "N16:0", Cells(1 + i, 2)

Next i
DDETerminate RsLinx

End Sub

如果与OPC服务器(在这种情况下通过RSLinx)建立了链接,则此代码将起作用,并且将向PLC写入数据。

问题在于我无法让部件DDEPoke RsLinx, "N16:0", Cells(1 + i, 2)按顺序从一个Excel单元格到PLC数据阵列的一个元素写入数据。

我尝试DDEPoke RsLinx, "N16:i", Cells(1 + i, 2)DDEPoke RsLinx, "N16:0+i", Cells(1 + i, 2),但都没有任何效果,程序根本没有写任何内容。

如何设置代码以使N16:0一直递增到N16:255然后停止?

1 个答案:

答案 0 :(得分:2)

将变量i从字符串中分离出来。但是要注意隐式类型转换,取决于哪个(Str()或CStr()),你最终会占据领先的空间。因此,转换数字Str(i),然后用Trim()换行以确保没有多余的空格,并将结果连接回你的&#34; N&#34;字符串:

RsLinx = Open_RsLinx()
For i = 0 To 255

    DDEPoke RsLinx, "N16:" & Trim(Str(i)), Cells(1 + i, 2)

Next i

i在字符串中不起作用的原因是因为在VBA中,一组引号中的任何内容都被视为文字字符串。与其他一些语言(PHP可以想到)不同,其中变量可以在类似的字符串中解析,VBA必须连接变量。请考虑以下事项:

Dim s As String
s = "world"
Debug.Print "Hello s!"

这会将Hello s!的文字输出到即时窗口,因为s不是作为变量处理,而是作为文字字符串的一部分处理。正确的方法是通过连接:

Dim s As String
s = "world"
Debug.Print "Hello " & s & "!"

将预期的Hello World!输出到即时窗口,因为s现在被视为变量并被解析和连接。

如果情况并非如此,则可能难以处理以下问题:

Dim i As Integer
For i = 0 to 9
  Debug.Print "this" & i
Next i  

然后你会:

th0s0
th1s1
th2s2
th3s3
th4s4
'etc

在很多情况下,这很难管理。

尽管如此,有一些语言 - 特别是PHP - 在使用某组引号时(""'' - 我不记得哪些是非法的),实际上确实在嵌入到字符串本身时解析变量:

$i = 5;
echo "this is number $i";

VBA没有此功能。

希望它有所帮助...