dポイントプレゼントキャンペーン実施中!

数字ではなく、記号で桁数をあげていきたいのですが、やり方が思いつきません。

どのようにすればいいでしょうか?
3進法が希望ではないですが、分かりやすく以下のように例を記載します。

例:3進法の場合
シートの(a,1)=a,(a,2)=b,(a,3)=cと記載されていれば、3進法と見なして、m以下のように桁をあげていく
a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa…

分かる方、よろしくお願いします。

A 回答 (3件)

一例です。


 
' ' ===============♪
 
' ' 'シートの列番地'同様の規則でシリアルコードを振る。
' ' A列に'数字の代わりに使う文字'一文字ずつ
' ' 設定されたセルがふたつ以上あること 要。
' ' それらがいくつあるかで基数を規定。
' ' 全半角0や '^ などの制御記号は不可。(重複未処理)(一文字でないセル、可=無視)
' ' 他、可読性重視、エラー処理略。
' ' n = (n - 1) \ 基数 →ベター→ n = Int((n - 1) / 基数)
Sub re7529645()
Dim 最大値 As Long
  最大値 = 1000 '←任意指定
Dim 暗号リスト As String, ret As String
Dim 最下行 As Long, 基数 As Long, 行ずれ As Long, 十進数 As Long
Dim i As Long, n As Long

  最下行 = Cells(Rows.Count, "A").End(xlUp).Row
  For i = 1 To 最下行
    If Cells(i, 1) Like "?" Then 暗号リスト = 暗号リスト & Cells(i, 1)
  Next i
' ' ↑A列一文字セルの値を連結して
' ' 数字の代りになる文字列群を採る
  基数 = Len(暗号リスト)
  行ずれ = 最下行 - 基数
' ' ↓数字に対応した暗号リストを使って
' ' ↓シリアルコードを展開
  For 十進数 = 基数 + 1 To 最大値
    n = 十進数
    Do
      ret = Mid$(暗号リスト, (n - 1) Mod 基数 + 1, 1) & ret
      n = (n - 1) \ 基数
    Loop While n > 0
    Cells(十進数 + 行ずれ, 1) = ret
    ret = ""
  Next 十進数
End Sub
 
' ' ===============♪
 
こんにちは
 
参考の為に過去のご質問を拝見したところ
ステップ実行&トレースはお出来になるようなので敢えて解説は添えません。
Do...Loop内の2行、読み込んでモノにしちゃってください。
 変数 n :何を表し、どう変化するか
 (n - 1) Mod 基数 :剰余の求め方、何故 - 1 ?
 n = (n - 1) \ 基数 :商の求め方、何故 - 1 ?
 
こちらでニーズを把握しきれてない気もしますが、
わりとメジャーなロジックですし、応用できる場面が多々あるとは思います。
 
それでは、また
    • good
    • 0

X進数の数字を一旦10進数に戻してから足し算なり引き算をして、結果をまたX進数に戻す、というのが単純で分かりやすいかもです。



もしくは記号部分が連続するアルファベット(a,b,c・・・)であるならasc関数で文字コードに変換してやれば数値として計算可能です。例えば小文字のアルファベットの場合、文字コードから87引いてやると「a」⇒「10」、「b」⇒「11」のように扱えます。
    • good
    • 0

> やり方が思いつきません。



いろんなやり方があると思うけど...
たとえば
0,1,2,00,01,02,10,11,12,20,21,22,000,...
と数字を作っておいて,0→a,1→b,2→cと置換するとか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!