我正在尝试创建一个生成秘密编码消息的函数。它包含三件事:一个字符串,例如“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的回答,该函数现在可以生成正确的答案。
答案 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)
同时检查A7
和A10
是否真的是整数。