2011-01-07 24 views
0

?を含むセルの値を変数と比較すると、常にtrueが返されます。私がこれを防ぐ方法はありますか?ここに私の現在のコードは次のとおりです。スプレッドシートの疑問符がExcel VBAの問題を引き起こします

'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 ; : ' " . , 
( ) _ - + ? ! 

これは常にアルファ(1,1)にある、Aを返します。彼らはそれぞれが7に行くので、それを考えてみましょう、私はそれが!と戻って来ない理由はわかりません。どのように私はこれを回避し、実際に一致するときにのみtrueに戻すことができますか?

+0

:私はまた、より直接的な何かを試みたが、予想される応答を得た

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 

====あなたはあなたのコード(文字とrngの定義など)のもう少し多くを提供します。私はそれが修正されたバグであるかどうかを調べるために全部をテストすることができます。または、既知の障害であるかどうかを確認するには、Microsoftヘルプを参照してください。 – sheepez

答えて

1

あなたが理解している限り、置換アルゴリズムを作成したいと思います。 2次元の暗号表を使用するには、何も特別な理由がない場合、私はむしろ、次のような1次元のアプローチを使用します。

我々ドンので THEQUICKBROWN(?)FOX123+-

Sub Test() 
    Debug.Print Cipher("The quick brown (?) fox 123 +-") 
End Sub 

結果(でこの関数を呼び出す

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 

「TはModelまたはSubstで空白)

今すぐ

Substを変更できるように

結果が4,_73.+'?6910GBF)9ZWVUCD

あなたが暗号機能に上記を供給されている場合は、対称的置換から期待通り、あなたはTHEQUICKBROWN(?)FOX123+-で再び終わります。

+0

ありがとう、これは多くの助けになります。 –

+0

ちなみに、私は2Dをしました。なぜなら、ブルートフォースを使って置換するのは難しくないからです。 –

+0

それは助けてくれてありがとうございました。そして、受け入れることに感謝しました。 - 統計的手法を使って十分な暗号化されたテキストを持っていれば、単純なVigenèreでさえ、簡単に破ることができます。私はCaesar、Vigenère、Fenceの機能をあなたと共有できます。私はそれらを教育目的で開発しました。 – MikeD

0

私は(疑問符を見つけることができた)次のことを試みたが、期待される結果を得た:

(1)上記のように、ワークシートにCipherTable範囲を作成。

(2)上記のコードと同様の機能QMを作成しました。

(3)= QM(cell-ref)のスタイルで式を入力しました。

正常に機能しました。機能QM:場合はエクセル2007でVBAのために期待されるように、このような比較の動作

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 
関連する問題