Вопросительный знак в электронной таблице вызывает проблемы в Excel VBA - PullRequest
0 голосов
/ 08 января 2011

Когда я сравниваю значение ячейки, содержащей ?, с переменной, она всегда возвращает 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 ]

1 голос
/ 11 января 2011

Насколько я понимаю, вы хотите создать алгоритм подстановки.Если нет конкретной причины использовать двумерную таблицу шифров, я бы предпочел использовать одномерный подход, подобный следующему:

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+-, как и следовало ожидать от симметричной замены.

0 голосов
/ 14 января 2011

Я попробовал следующее и получил ожидаемый результат (удалось найти знак вопроса):

(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
...