Вопросительный знак в электронной таблице вызывает проблемы в Excel VBA
Когда я сравниваю значение ячейки, которая содержит ?
переменной, она всегда возвращает true. Есть ли способ, которым я могу предотвратить это? Вот мой текущий код:
'Option Explicit
Dim hws As Worksheet
Set hws = ActiveSheet
Dim rng As Range, rng2 As Range
Dim letters(2, 2)
alpha = Range("CipherTable").Value
For x = 1 To 7
For y = 1 To 7
If alpha(x, y) = rng.Cells(i, j + 1).Value Then
letters(2, 1) = x
letters(2, 2) = y
End If
Next y
Next x
Альфа, кстати, выглядит так:
A B C D E F G
H I J K L M N
O P Q R S T U
V W X Y Z 1 2
3 4 5 6 7 8 9
0 ; : ' " . ,
( ) _ - + ? !
Это всегда возвращается A
, который находится в альфа (1,1). Если подумать об этом, так как каждый из них идет в семь, я не знаю, почему он не возвращается с !
, Как я могу обойти это и сделать его верным только тогда, когда оно действительно совпадает?
2 ответа
Насколько я понимаю, вы хотите создать алгоритм подстановки. Если нет конкретной причины использовать двумерную таблицу шифров, я бы предпочел использовать одномерный подход, подобный следующему:
Function Cipher(Argument As String) As String
Dim Model As String
Dim Subst As String
Dim Idx As Integer
Dim MyPos As Integer
Cipher = ""
' note double quotation mark within string
Model = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890;:'"".,()_-+?!"
Subst = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890;:'"".,()_-+?!"
For Idx = 1 To Len(Argument)
' get position from Model
MyPos = InStr(1, Model, UCase(Mid(Argument, Idx, 1)))
' return character from substitution pattern
If MyPos <> 0 Then Cipher = Cipher & Mid(Subst, MyPos, 1)
Next Idx
End Function
вызывая эту функцию с
Sub Test()
Debug.Print Cipher("The quick brown (?) fox 123 +-")
End Sub
результаты в THEQUICKBROWN(?)FOX123+-
(потому что мы не допускаем пропуски в Model
или же Subst
)
Теперь поменяй Subst
в
Subst = "!?+-_)(,.""':;0987654321ZYXWVUTSRQPONMLKJIHGFEDCBA"
результат 4,_73.+'?6910GBF)9ZWVUCD
если вы введете вышеупомянутое в функцию шифрования, вы снова получите THEQUICKBROWN(?)FOX123+-
как и следовало ожидать от симметричной замены.
Я попробовал следующее, и получил ожидаемый результат (он смог найти знак вопроса):
(1) Создан диапазон CipherTable на листе, как указано выше;
(2) Создана функция QM, аналогичная приведенному выше коду;
(3) Введена формула в стиле =QM(cell-ref).
Работало нормально. Функция QM:
Public Function QM(theChar)
Dim CipherTable
Dim x As Integer
Dim y As Integer
CipherTable = Range("CipherTable").Value
For x = 1 To 7
For y = 1 To 7
If CipherTable(x, y) = theChar Then
QM = "X" & x & "Y" & y
Exit Function
End If
Next y
Next x
QM = ""
End Function
====
Я также попробовал что-то более прямое и получил ожидаемый ответ:
Public Sub QM2()
Dim questMark As Range
Dim someChar As String
Set questMark = Range("CipherTable").Cells(7, 6)
someChar = "A"
Debug.Print questMark = someChar
End Sub