Ошибка VBA: значение, используемое в формуле, является неправильным типом данных?

Я пытаюсь создать функцию, которая генерирует секретное кодированное сообщение. Это занимает три вещи: строка, например, «testtestingonetwothree», а также желаемое количество символов, например 5, и требуемое количество слов, например, 5. Оно генерирует сообщение, начиная с первого символа , и извлекает каждый пятый символ через строку, помещая эти символы в кодовое слово, затем начиная со второго символа и извлекая каждый пятый символ через строку, помещая их во второе кодовое слово и так далее. Он просто выводит строку с кодовыми словами, разделенными пробелом. Поэтому для этого примера это произведет: «tntnt egieh stntr tegwe isooe».

Я в порядке, но новичок в VBA. Я сделал то, что, по моему мнению, является допустимой функцией, но когда он используется в электронной таблице, я получаю # ВАЛЮТ! error: «Значение, используемое в формуле, – это неправильный тип данных». Это пользовательская функция, которую я сделал:

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.

Моя функция выглядит нормально? И есть ли что-нибудь, что вы, ребята, видите, что может дать ошибку значения? Любая помощь будет очень признательна, спасибо за чтение.

EDIT: теперь выводится значение, но неправильное значение. Он выводит: «ttestintestingtesttestingtestingtestingtestingonetwot tetestingtestingtestitestingtestingonetestingtestingonetwoth», когда он должен выводить: «tntnt egieh stntr tegwe isooe». Есть ли что-нибудь, что вы, ребята, видите, что моя функция делает неправильно?

EDIT2: после фиксации функции Mid, temp = temp & Mid (strng, step, 1) в соответствии с ответом vacip, функция теперь дает правильный ответ.

Хорошо, все говорят, что это работает, но для меня это не дает желаемого результата. Что за…???

Во всяком случае, я думаю, что ваша функция 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 

Таким образом, это сработало для меня.

Другие люди обратились к проблеме типа. Вот другое предложение. Шифр, который вы описываете, представляет собой простой транспозиционный шифр, в частности столбчатую транспозицию ( https://en.wikipedia.org/wiki/Transposition_cipher#Columnar_transposition )

То, как люди делали этот предварительный компьютер, заключалось в том, чтобы писать символы в строку по строкам, а затем читать их столбцами по столбцам. Фактически – это, вероятно, еще самый простой способ реализовать его даже с компьютерами. Объявите вариант, который может быть перенастроен как массив с, например, 5 столбцами (где 5 – пропуск между буквами), а количество строк выбрано настолько большим, чтобы сетка могла удерживать строку. После того, как вы загрузите символы подряд за строкой, прочитайте их по столбцу по столбцу, используя вложенные для циклов.

После того, как вы получите базовый пример работы, вы можете попытаться реализовать версию, которая использует ключ, чтобы определить порядок, который вы читаете за столбцами для дополнительной безопасности.

Кодирование классической криптографии / криптоанализа как отличный способ изучить язык программирования. Почти первое, что я делаю, когда пытаюсь выучить новый язык, – это внедрить в него шифр Vigenere. Несмотря на то, что он давно выходит из печати и может быть несколько сложным перевести на современные диалекты Basic книги «Криптоанализ для микрокомпьютеров» от Caxton Foster, это очень весело и можно купить всего за несколько долларов от онлайн-магазинов, которые используются в книгах.

Вам нужно определить тип вашей функции. Поэтому в этом случае я считаю, что вы захотите

 Function encode(strng, numchars, numwords) As String 

Я тестировал ваш код точно так, как есть, и он работал нормально.

Таким образом, ваша проблема может быть:

  • Определенный аргумент вашей функции – неправильный тип. (Держу пари, что метод len – это проблема).

Проверьте, действительно ли A16 является строкой. Если нет, подумайте о том, чтобы преобразовать его в строку раньше, если вы тоже хотите передавать номера:

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

Также проверьте, действительно ли A7 и A10 являются целыми числами.

Давайте будем гением компьютера.