组合来自2个单元的字符串,添加连字符并使用DDEPoke发送

时间:2018-01-08 18:58:30

标签: excel vba excel-vba set

我试图解决前同事创造的问题。我不是一个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语句中的代码。

感谢任何帮助。

由于

沙恩

1 个答案:

答案 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)

我希望这个策略有效! :)