VBA错误:公式中使用的值是错误的数据types?

我试图创build一个函数,生成一个秘密编码的消息。 它有三件事:一个string,例如“testingtestingonetwothree”,以及所需的字符数,例如5,以及所需的字数,例如5.它通过从第一个字符开始生成消息,并通过string提取每五个字符,将这些字符放入一个码字中,然后从第二个字符开始,通过string提取每五个字符,将这些字符放入第二个码字,依此类推。 它只输出一个string,用空格分隔代码字。 所以这个例子会产生:“tntnt egieh stntr tegwe isooe”。

我在编码方面没问题,但VBA新手。 我已经做了我认为是有效的function,但是当它在电子表格中使用时,我会得到#VALUE! 错误:“公式中使用的值是错误的数据types”。 这是我所做的用户定义的function:

Function encode(strng, numchars, numwords) Dim word As Integer Dim step As Integer Dim temp As String Dim output As String For word = 1 To numchars step = word temp = "" Do While step <= Len(strng) temp = temp & Mid(strng, 1, step) step = step + numchars Loop If word = 1 Then output = temp Else output = output & " " & temp Next word encode = output End Function 

而当它在电子表格中使用时,我只是把它叫做

 =encode(A16,A7,A10) 

如果A16包含testtestingonetwothree,则A7包含5,而A10包含5。

我的function好吗? 还有什么你们可以看到哪些可能会给价值错误? 任何帮助将不胜感激,非常感谢阅读。

编辑:这现在输出一个值,但错误的值。 它输出:“ttestintestingtesttestingtestingontestingtesting testonetwot tetestingtestingtestiteing testing testing testing testing onetwoth”,当它输出:“tntnt egieh stntr tegwe isooe”时。 你有什么可以看到我的function做错了吗?

编辑2:固定Mid函数后,按照vacip的答案,temp = temp&Mid(strng,step,1),函数现在生成正确的答案。

好吧,大家都说它是有效的,但对我来说,它不会产生所需的输出。 什么…?

无论如何,我认为你的Mid函数的顺序是错误的,尝试像这样:

 temp = temp & Mid(strng, step, 1) 

另外,确保正确地声明你的variables,如下所示:

 Function encode(strng As String, numchars As Integer, numwords As Integer) As String 

我也重写了你的IF语句,对我来说,单线的事情是很奇怪的。

 If word = 1 Then output = temp Else output = output & " " & temp End If 

这样它对我有效。

其他人已经解决了types问题。 这是一个不同的build议。 您所描述的密码是一个简单的转置密码,特别是一个列转换( https://en.wikipedia.org/wiki/Transposition_cipher#Columnar_transposition

人们使用这种预先计算机的方式是将字符逐行写入网格,然后逐列阅读。 事实上 – 即使是在电脑上,这仍然是最简单的方法。 声明一个可重定义为具有例如5列(其中5是字母之间的跳跃)的数组的变体,并且行的数量被select为足够大以便网格可以保持string。 在逐行加载字符之后,使用嵌套for循环逐列读取它们。

一旦你得到一个基本的例子工作,你可以尝试实现一个版本,使用一个密钥来确定您读取列的顺序,以增加安全性。

编码经典密码学/密码分析是学习编程语言的一种很好的方法。 当我尝试学习一门新语言时,我所做的第一件事就是实现一个Vigenere密码。 即使它已经很长时间了,翻译成现代方言Basic有些棘手,Caxton Foster的书“微型计算机的密码分析(Cryptanalysis for Microcomputer)”非常有趣,可以从网上书店购买几美元。

你需要定义你的函数的types。 所以在这种情况下,我相信你会想要的

 Function encode(strng, numchars, numwords) As String 

我完全按照原样testing了你的代码,而且工作正常。

所以,你的问题可能是:

  • 你的function的某个论点是不正确的types。 (我敢打赌, len方法是那里的问题)。

检查A16是否真的是一个string。 如果不是,如果你想要传递数字,就考虑把它转换成一个string:

 Function encode(strng as variant, numchars as integer, numwords as integer) as string strng = str(strng) 

检查A7A10是否真的是整数。