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

时间:2015-06-29 19:09:16

标签: excel vba excel-vba

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

我很喜欢编码,但对VBA来说是新手。我已经做了我认为有效的功能,但是当它在电子表格中使用时,我得到一个#VALUE!错误:“公式中使用的值是错误的数据类型”。这是我做的用户定义函数:

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包含testingtestingonwothree,A7包含5,A10包含5。

我的功能似乎没问题吗?还有什么你们可以看到哪些可能会给出价值错误?非常感谢任何帮助,非常感谢阅读。

编辑:现在输出一个值,但值不正确。它输出:“ttestintestingtesttestingtestingontestingtestingonetwot tetestingtestingtestitestingtestingonetestingtestingonetwoth”,当它输出时:“tntnt egieh stntr tegwe isooe”。你们有什么可以看到我的功能出错吗?

EDIT2:修复Mid功能后,到     temp = temp&amp;中(strng,step,1) 根据vacip的回答,该函数现在可以生成正确的答案。

4 个答案:

答案 0 :(得分:1)

好的,每个人都说它有效,但对我来说,它并没有产生所需的输出。什么...... ???

无论如何,我认为您的Mid功能顺序错误,请尝试这样:

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

另外,请确保正确声明变量,如下所示:

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

这种方式对我有用。

答案 1 :(得分:1)

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

人们使用这种预计算机的方式是逐行将字符写入网格,然后逐列读取它们。实际上 - 即使使用计算机,这可能仍然是实现它的最简单方法。声明一个可以重新定义为具有例如数组的数组的变体。 5列(其中5是字母之间的跳过)和行数被选择为足够大,以便网格可以保持字符串。逐行加载字符后,使用嵌套for循环逐列读取它们。

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

将经典密码/密码分析编码为学习编程语言的绝佳方法。当我尝试学习一门新语言时,我做的第一件事就是在其中实现一个Vigenere密码。即使它已经绝版已经绝版,并且在翻译成现代方言的基础上可能有点棘手,而且这本书是“微型计算机的密码分析”和#34;通过Caxton Foster非常有趣,可以从网上二手书店购买几美元。

答案 2 :(得分:0)

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

Function encode(strng, numchars, numwords) As String

答案 3 :(得分:0)

我完全按照原样测试了您的代码,并且工作正常。

所以,你的问题可能是:

  • 你的功能的某个参数不是正确的类型。 (我打赌len方法就是问题所在。)

检查A16是否真的是一个字符串。如果没有,请考虑将其转换为字符串,如果您也想传递数字:

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

同时检查A7A10是否真的是整数。