我试图解决前同事创造的问题。我不是一个PC程序员。
一些背景信息:
- 该程序旨在从工作表中获取数据并将其发送到PLC(可编程逻辑控制器)。 Excel工作表对数据没有任何作用。
- 这个词" Spare"只是一个包含Spare的字符串。它并非来自该计划的任何地方。如果程序看到它时单元格中没有任何内容,那么我希望程序将单词Spare发送到PLC。
-Link for DDEPoke(https://msdn.microsoft.com/en-us/vba/excel-vba/articles/application-ddepoke-method-excel)。它通过先前打开的通道发送数据(使用DDEInitiate)。
- 在原始形式下,程序不会抛出任何错误。但它并没有将数据写入PLC。
原创计划:
For iBit = 0 To 15
Sheets("TestPoints").Cells(3, 5) = iMod
Sheets("TestPoints").Cells(4, 5) = iBit
sWriteString = "IO_DescriptionStorage[" & iMod & "," & iBit & "]"
If Sheets("TestPoints").Cells(iIONameRowNum + iBit, iColumn) = "" Then
**DDEPoke RSIchan, sWriteString, "Spare"**
Else
Value = Sheets("TestPoints").Cells(iIONameRowNum + iBit, iColumn) & " - " & Sheets("TestPoints").Cells(iDeviceStartRow + iBit, iColumn)
**DDEPoke RSIchan, sWriteString, Value**
End If
Next iBit
Next iMod
我已经能够找出问题出在哪里,我用粗体突出显示。
DDEPoke RSIchan,sWriteString," Spare"只是试图发送字符串" Spare"如果单元格是空的。
DDEPoke RSIchan,sWriteString,Value正在尝试发送变量Value的内容。
从Else语句中的代码开始,通过反复试验我发现有两种方法可以让程序发送数据但只有1个单元格中的数据。
1
Set Value = Sheets("TestPoints").Cells(iIONameRowNum + iBit, iColumn)
DDEPoke RSIchan, sWriteString, Value
2
DDEPoke RSIchan, sWriteString, Sheets("TestPoints").Cells(iIONameRowNum + iBit, iColumn)
我尝试做的是组合和发送,所以我尝试了以下内容:
1
Set Value = Sheets("TestPoints").Cells(iIONameRowNum + iBit, iColumn) & " - " & Sheets("TestPoints").Cells(iDeviceStartRow + iBit, iColumn)
DDEPoke RSIchan, sWriteString, Value
尝试设置值运行时错误时会抛出错误' 13':类型不匹配。因此,这不是使用Set关键字
的正确方法2
DDEPoke RSIchan, sWriteString, Sheets("TestPoints").Cells(iIONameRowNum + iBit, iColumn) & " - " & Sheets("TestPoints").Cells(iDeviceStartRow + iBit, iColumn)
这不会引发任何错误,但它不会向PLC写入任何内容。
我非常确定这只是为Set关键字和/或DDEPoke方法正确打包数据的问题。
我认为一旦我在Else语句中得到代码,我就可以将它应用于If语句中的代码。
感谢任何帮助。
由于
沙恩
答案 0 :(得分:0)
进行一些简单的测试,我可以通过以下方式获得连接值:
Sub Tester()
Dim Value As Variant
Value = Sheets("Sheet1").Cells(24, 8) & " - " & Sheets("Sheet1").Cells(25, 8)
MsgBox Value
End Sub
' Set'关键字不应该在这里使用,因为你只是为变量赋值,而不是对象。但是,如果它不适合您,那么您可能认为这是因为它被传递给DDEPoke方法的方式。
您可以尝试先将完整的连接字符串存储在字符串变量中,然后将其分配给您的值,如下所示:
Sub Tester()
Dim str As String
Dim Value As Variant
str = Sheets("Sheet1").Cells(24, 8) & " - " & Sheets("Sheet1").Cells(25, 8)
Value = str
DDEPoke RSIchan, sWriteString, Value
End Sub
编辑: 如果Set关键字是关键字,那么好像该对象不会成为"它需要什么。在上面链接的DDEPoke示例中,它显示了第三个参数被设置为一个范围,所以我想知道你是否用一个CONCATENATE公式为你的工作表添加一个列来创建你试图发送的字符串,然后存储它。我们假设您的公式在H列中,例如:
Set Value = Sheets("Sheet1").Range("H" & rowNum)
我希望这个策略有效! :)