- ベストアンサー
excel
ABCDEFの6文字からなる順列をエクセルのA1の列に順に作っていくにはおうすればいいのでしょうか。 なお順列は辞書引順序とします。 A1:ABCDEF A2:ABCDFE ―― A(6!):FEDCBA
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
関数を使った方法を考えていたら、気が遠くなったので マクロを使った方法を考えてみました。 単純ループでやってます、再帰を使った方が、キレイかも。 Public Sub p() Dim c, base As Range Dim str As String Dim i1, i2, i3, i4, i5 Dim c1, c2, c3, c4, c5 Dim o1, o2, o3, o4, o5 Set base = Range("A1") c = 0 str = "ABCDEF" 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, "") For i4 = 1 To Len(o3) c4 = Mid(o3, i4, 1) o4 = Replace(o3, c4, "") For i5 = 1 To Len(o4) c5 = Mid(o4, i5, 1) o5 = Replace(o4, c5, "") base.Offset(c).Value = c1 & c2 & c3 & c4 & c5 & o5 c = c + 1 Next Next Next Next Next End Sub
その他の回答 (2)
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 数式で実現するのはかなり難解です。 また、作業列を利用しないと、非常に複雑で長い数式になります。 したがって、とりあえず作業列を6列利用した方法です。 作業列を、A~F列として、G列に文字列を表示させます。 まず、A1に、 =INT((ROW()-1)/120)+1 と入力します。 次に、B1に、 =SMALL(IF(COUNTIF($A1:A1,ROW($A$1:$A$6)),7,ROW($A$1:$A$6)),MOD(INT((ROW()-1)/FACT(5-COLUMN(A1))),6-COLUMN(A1))+1) と入力して、[Ctrl]と[Shift]を押しながら[Enter]を押して確定します。 (数式の両端に「{}」が付いて、配列数式になります。) そして、G1に、 =MID("ABCDEF",A1,1)&MID("ABCDEF",B1,1)&MID("ABCDEF",C1,1)&MID("ABCDEF",D1,1)&MID("ABCDEF",E1,1)&MID("ABCDEF",F1,1) と入力します。 そうしたら、A1:G1を720行目までコピーします。 これで、G列に文字列が順番に表示されるはずです。 なお、配列数式を使用していますので、計算に少し時間が掛かるかもしれません。
- imogasi
- ベストアンサー率27% (4737/17070)
多分関数式を使ってを期待されているように予想します。 しかし関数は変化した値を得るには、式の複写の番地指定の変化にしか、頼れないので、複雑になって、無理でしょう。 VBAでなら素直に、繰り返しでステップで出来そうですが 良ければ考えて見ますが。 関数式で 最後の桁を変化させるのは ="ABCDE"&CHAR(CODE("A")+ROW()-1) で出来ます(但し26番目のZ以降はこれでは駄目)が、 最後の桁から2つ前まで変化させるのは ="ABCD"&CHAR(CODE("A")+INT((ROW()-1)/6))&CHAR(CODE("A")+MOD((ROW()-1),6)) です。第36行目まで。 しかし3つまえまで変化するのは、工夫が要り、ややこしくなってやる気がしません。
お礼
できました。 すばらしいです。 ありがとうございました。