アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のEXCELのマクロ プログラムを再帰的式を使って
シンプルにするにはどんな風にすればよういのでしょうか。よろしくお願いします。

Public Sub p()
Dim c, base As Range
Dim str As String
Dim i1, i2, i3
Dim c1, c2, c3
Dim o1, o2, o3
Set base = Range("A1")
c = 0
str = "ABCD"

For i1 = 1 To Len(str)
c1 = Mid(str, i1, 1)
o1 = Replace(str, c1, "")

   For i2 = 1 To Len(o1)
   c2 = Mid(o1, i2, 1)
   o2 = Replace(o1, c2, "")

     For i3 = 1 To Len(o2)
     c3 = Mid(o2, i3, 1)
     o3 = Replace(o2, c3, "")
     base.Offset(c).Value = c1 & c2 & c3 &       c4 & c5 & o5
     c = c + 1
     Next
   Next
Next
End Sub

A 回答 (2件)

こんな感じですかね


If strLen = 0 Then

If strLen = 1 Then
Range("A1").Offset(c).Value = result & selectList
に変えれば、呼び出しを一段減らせます
何回も実行する場合には、
static cをやめて
関数の外部の一番上で
dim c
p2でc=0して下さい。
baseも使いたければ、同様

rp("","ABCDEF")にもできますよん。
'---------------------------------------------
Public Sub p2()
Call rp("", "ABCD")
End Sub

Public Sub rp(ByVal result As String, ByVal selectList As String)
Static c As Integer
Dim i, strLen As Integer, choice As String
strLen = Len(selectList)
If strLen = 0 Then
Range("A1").Offset(c).Value = result
c = c + 1
Else
For i = 1 To strLen
choice = Mid(selectList, i, 1)
Call rp(result & choice, Replace(selectList, choice, ""))
Next
End If
End Sub

この回答への補足

回答に影響はないのですが。
for i3の中の式は
base.Offset(c).Value = c1 & c2 & c3 & o3の誤りでした。

補足日時:2004/12/16 09:10
    • good
    • 0
この回答へのお礼

おかげで解決お世話になりました。
再帰法のこつがいくぶん理解できました。今度は自力で考えます。

お礼日時:2004/12/16 12:11

一応動かして見ましたが、前提条件が見えません。



単なる「ABCD」の並び替えなのでしょうか?
全ての組み合わせを求めるのでしょうか?

実行結果は3文字の並びになっていますし・・・。
「4文字から、3文字の組み合わせ」を得るのでしょうか?
    • good
    • 0
この回答へのお礼

失礼しました。提示のプログラムにいくぶんあやまりがありました。
文字列の順列を字引き式に表示のプログラムを再帰を使って修正するのが目的でした。

お礼日時:2004/12/16 12:13

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