• ベストアンサー

?進数の作り方

Excelでシート保護をしたパスワードを忘れてしまいました。 パスワードは、アルファベットを使っているのだけは覚えているのですが・・・ そこで、VBAでアルファベット26文字で26進数みたいなものを使って、Aから順番に解除していこうと思うのですが、その26進数の作り方がいまいちうまくいきません。桁数は8桁ぐらいだと思うのですが、どなたかお教え下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

現実的ではないですが... Private Const CharList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" Private Const Base = 26 '+ 26 + 10 '進数 Private Sub Form_Click() Dim i As Currency Dim Last As Currency Last = Base ^ 8 + Base ^ 7 + Base ^ 6 + Base ^ 5 + Base ^ 4 + Base ^ 3 + Base ^ 2 + Base ^ 1 For i = 1 To Last 'Step Fix(Last/1000) label1.Caption = NumToAlpha(i) DoEvents Next label1.Caption = NumToAlpha(Last) End Sub Private Function NumToAlpha(ByVal n As Currency) As String Dim p As Currency Dim q As Long Dim s As String Do While n > 0 n = n - 1 p = Fix(n / Base) '商 q = n - p * Base '余り s = Mid(CharList, q + 1, 1) & s n = p Loop NumToAlpha = s End Function

tt_2002
質問者

お礼

回答ありがとうございます。 大変参考になりました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

なるべく何桁でも可能なように考えてみました。(下記は一応8桁です) 表示用~ここまでは、テストのためセルに表示しています。 (シートからマクロを実行してください) まちがいなければ、消してください。(最後まで調べる時間はありませんでした) (消してしまえば、シートから実行する必要はありません) Sub test()   '***************表示用****************   Dim x As Long '表示用   Dim y As Long '表示用   x = 1: y = 1   '***************ここまで***************   Const vcnt = 8 '桁数   Const ChrList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"   Dim v(vcnt) As Integer   '初期化   For i = 1 To vcnt     v(i) = 0   Next i   '設定   Do     v(1) = v(1) + 1     '繰り上がりチェック     For i = 1 To vcnt - 1       If (v(i) > 26) Then         v(i + 1) = v(i + 1) + 1         v(i) = 1       Else         Exit For       End If     Next i     If (v(vcnt) > 26) Then       Exit Do     End If     'アルファベット表示     dt = ""     For i = vcnt To 1 Step -1       If (v(i) > 0) Then         dt = dt & Mid(ChrList, v(i), 1)       End If     Next i     '***************表示用****************     Cells(y, x) = dt     If (y = 65500) Then       If (x = 256) Then         MsgBox "これ以上表示できません"         End       End If       x = x + 1       y = 1     Else       y = y + 1     End If     '***************ここまで***************     DoEvents   Loop End Sub

tt_2002
質問者

お礼

回答ありがとうございます。 大変参考になります。

すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 パスワードを割り出すのではなく、保護の解除をするのが本筋ではないんでしょうか。 もしそうなら、シートの中身をそっくりそのまま別のシートにコピーすれば保護は解除されます。 解除されたら、あらためて保護を設定すればいいでしょう。 一応参考URLです。 http://www.geocities.co.jp/Technopolis/2082/Soft/Excel_t.htm#bookseqrforget

参考URL:
http://www.geocities.co.jp/Technopolis/2082/Soft/Excel_t.htm#bookseqrforget
tt_2002
質問者

お礼

回答ありがとうございます。 ただ、どうしてもVBAでやりたかったもので・・

すると、全ての回答が全文表示されます。
  • baboooo
  • ベストアンサー率35% (17/48)
回答No.2

与えられた数字をアルファベットに変換する関数です。 A~Z、までいったら、AA、AB・・・となります。 lNumberに0から始まる数字を渡し、 アルファベットの文字列が戻り値になります。 これを8バイトになるまで繰り返せばできるはず。 ------------------------------------------------------- Private Function NumToAlpha(ByVal lNumber As Long) As String Dim iDiv As Integer Dim iMod As Integer Dim sAplha As String iDiv = Fix((lNumber + 26) / 26) - 1 iMod = (lNumber + 26) Mod 26 '26以上の場合 If iDiv > 0 Then '一桁目にアルファベットをつける sAplha = Chr(iDiv - 1 + vbKeyA) End If 'アルファベットに変換 sAplha = sAplha & Chr(iMod + vbKeyA) NumToAlpha = sAplha End Function

tt_2002
質問者

補足

参考になる回答ありがとうございます。 ただ、これだと3桁目以降に行かないようです。

すると、全ての回答が全文表示されます。
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

数値をAからZに変換する方法として、 ある文字列にAからZまで入れて、MIDで 何文字目から一文字取り出す というふうにすればいいでしょう。 もしくは、文字コードの計算とかもあります。

tt_2002
質問者

お礼

回答ありがとうございます。 そこまではわかるんですが、桁上がり等を考えると、なかなかうまくいきません。

すると、全ての回答が全文表示されます。

関連するQ&A