【问题标题】:VBA error: A value used in the formula is the wrong data type?VBA 错误:公式中使用的值是错误的数据类型?
【发布时间】:2015-06-30 03:56:11
【问题描述】:

我正在尝试创建一个生成秘密编码消息的函数。它包含三件事:一个字符串,例如“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 包含 testingtestingonetwothree,A7 包含 5,A10 包含 5。

我的功能看起来还好吗?你们有什么可以看到的可能导致价值错误的东西吗?任何帮助将不胜感激,非常感谢阅读。

编辑:现在输出一个值,但值错误。当它应该输出:“tntnt egieh stntr tegwe isooe”时,它输出:“ttestintestingtesttestingtestingontestingtestingonetwot tetestingtestingtestitestingtestingonetestingtestingonetwoth”。你们有什么可以看出我的函数做错了吗?

EDIT2:修复 Mid 功能后, temp = temp & Mid(strng, step, 1) 根据 vacip 的回答,该函数现在会产生正确的答案。

【问题讨论】:

  • 它在这里工作....我只是复制和粘贴,没有任何更改....(它必须在一个单独的模块中,而不是在工作表模块中)
  • 只是好奇:当你说它有效时,你的意思是它给了你想要的输出,或者你只是说它不会产生错误消息?
  • 不会产生错误
  • 值错误现在消失了。但是,在修复 Mid 函数后,它现在会生成“tienete ensgth sgtowr ttinoe”,而不是它应该输出的“tntnt egieh stntr tegwe isooe”。
  • 嗯,我无法重现这个新错误。尝试在代码中添加断点,然后逐步检查,看看是否能找出问题所在。

标签: vba excel


【解决方案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

这种方式对我有用。

【讨论】:

  • 太好了,非常感谢!这正在产生:“tienete ensgth sgtowr ttinoe”,它更像它。但是它应该输出“tntnt egieh stntr tegwe isooe”。我将通过该功能查看它在做什么,如果您对出了什么问题有任何想法,我将非常感激。再次感谢您。
  • 这很奇怪。对我来说,输出是:tntnt egieh stntr tegwe isooe。我唯一重写的另一部分是你的 IF 语句。我会在几秒钟内更新我的回复...
  • 哦,是的,对不起,我输入了错误的字符数。傻我。这现在完美无缺。非常感谢。
【解决方案2】:

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

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

一旦您获得了一个基本示例,您可以尝试实现一个版本,该版本使用一个密钥来确定您读取列的顺序以增加安全性。

将经典密码学/密码分析编码为学习编程语言的绝佳方式。当我尝试学习一门新语言时,我做的第一件事几乎就是在其中实现 Vigenere 密码。 Caxton Foster 的“微型计算机密码分析”一书虽然早已绝版并且翻译成现代基本方言可能有些棘手,但它非常有趣,只需几美元即可从在线二手书店购买。

【讨论】:

  • 很好的答案,我希望这会出现在搜索结果中。
【解决方案3】:

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

Function encode(strng, numchars, numwords) As String

【讨论】:

  • 好的,非常感谢,这成功了!虽然它会产生这个:所以它没有正确编码或用空格输出它......我的循环似乎没有工作。我将编辑主要问题。
  • @vacip - 让人们看起来很糟糕的方法。我刚刚回答了这个问题,你修复了一个 OP 不知道的错误。
  • @justin 哇,抱​​歉,我不是想让任何人看起来很糟糕。对我来说,在达到预期结果之前,问题不会被视为“已解决”。所以我真的很困惑,每个人都说它有效,而实际上,它没有用。解决问题的方法不同,仅此而已。对不起,如果我直率或粗鲁。
  • @vacip - 你不是直率或粗鲁,我只是想搞笑。
【解决方案4】:

我完全按原样测试了您的代码,并且运行良好。

那么,你的问题可能是:

  • 函数的某个参数类型不正确。 (我敢打赌len 方法是其中的问题)。

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

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

还要检查A7A10 是否真的是整数。

【讨论】:

  • 非常感谢。值错误是固定的,但它现在输出这个: ttestintestingtesttestingtestingontestingtestingonetwot tetestingtestingtestitestingtestingonetestingtestingonetwoth",当它应该是"tntent egieh stntr tegwe isooe"。顺便问一下,当一个新的错误弹出时提问的协议是什么?我应该问一个新的问题或只是编辑当前的?
  • 我认为这取决于您....但现在问题实际上是一个编码问题....通常,当一个答案被认为是对您的问题的满意答案时,您将其检查为已回答.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多