今、VBでシーザー暗号の"暗号化"と"復号化"が行えるツールを作っているのですが、なかなか思うようにプログラムを組めません。
一応、以下の条件で作っています。
・アスキーコードを使用
・数値の前後のズレを任意に決められる
・暗号化(復号化)する文字の数は複数
現在のプログラム(暗号化のみ)は下記の通りです。
どうすればうまく作動するのでしょうか。
教えてください。 宜しくお願いします。
Dim strSMoji As String, strEMoji As String, length As String
Dim intSCode As Integer, intHami As Integer, counter1 As Integer, counter2 As Integer, intAmari As Integer
Dim zure01 As Double, zure02 As Double
Option Explicit
Private Sub Command1_Click() '暗号化ボタン
strSMoji = Text1.Text
counter1 = Len(strSMoji)
counter2 = Len(counter1)
intSCode = Asc(strSMoji)
Do
strSMoji = Mid(strSMoji, intSCode, [length])
If strSMoji >= 1 Then
Text1.Text = Left(strSMoji, Len(strSMoji) - 1)
If intSCode <= 121 Then '121以下であるなら
strEMoji = Chr(intSCode + zure01)
Text2.Text = strEMoji
Else
intHami = intSCode + zure01 - 97
intAmari = intHami Mod 26
strEMoji = Chr(intAmari + 97)
Text2.Text = strEMoji
End If
End If
Loop Until counter2 = counter1
End Sub
Private Sub Form_Load()
zure01 = 1
zure02 = -1
counter1 = 0
counter2 = 0
End Sub
理解しがたい点が多々ありますので、一応理解できた範囲だけです。換字のロジック自体はそのままです。
ソースだけ示されても意図がよく分からないことがあるので、言葉で説明して頂く方がよろしいかと思います。
Dim i As Long 'これをDim文の最後に追加
Option Explicit
Private Sub Command1_Click() '暗号化ボタン
strSMoji = Text1.Text
counter1 = Len(strSMoji)
strEMoji = strSMoji
'一旦出力用の文字列を入力文字列と同じにします。単に同じ長さの文字列にしたいという意図です。
For i = 1 To counter1
'入力用の文字列を1文字ずつ処理します。
intSCode = Asc(Mid(strSMoji, i, 1))
'Mid関数で1文字ずつ入力文字列を取り出し、その文字コードを得ます
If intSCode <= 121 Then '121以下であるなら
Mid(strEMoji, i, 1) = Chr(intSCode + zure01)
'Mid関数で出力用文字列を1文字書き換えます
Else
intHami = intSCode + zure01 - 97
intAmari = intHami Mod 26
Mid(strEMoji, i, 1) = Chr(intAmari + 97)
End If
Next i
'Debug.Print strSMoji; "=>"; strEMoji
Text2.Text = strEMoji
End Sub
疑問点:
zure01とzure02をDoubleで宣言しているところ(何故整数型・長整数型にしないのでしょうか?)
counter2 = Len(counter1) 何を意図しているのか理解しかねます
strSMoji = Mid(strSMoji, intSCode, [length]) 同上
If strSMoji >= 1 Then 同上
Loop Until counter2 = counter1 Doの中でcounter2を設定していないので、終了条件を満たさない(無限ループするのでは?)
また、換字の範囲チェックはもっと厳密に行うべきだと思います。(アルファベットのみに限定するのが適当かと思います)
お礼
rebellion様 何度も教えていただき、ありがとうございます。 細かく指導していただき、問題が解決いたしました。 迅速で丁寧な対応にとても感謝しています。 本当にありがとうございました。