- ベストアンサー
エクセル2003で、1から4を使った7桁の全数列
エクセル2003で、1から4を使った7桁の数列の全リストを作りたいのですが、方法を教えて下さい。よろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#2,#6です。 すみません。訂正してください。 #6の式 A1に、 =(INT(MOD(ROW()-1,16384)/4096)+1&INT(MOD(ROW()-1,4096)/1024)+1&INT(MOD(ROW()-1,1024)/256)+1&INT(MOD(ROW()-1,256)/64)+1&INT(MOD(ROW()-1,64)/16)+1&INT(MOD(ROW()-1,16)/4)+1&MOD(ROW()-1,4)+1)*1 です。 また、#2の式は A4に、 =(INT(MOD(ROW()-4,16384)/4096)+1&INT(MOD(ROW()-4,4096)/1024)+1&INT(MOD(ROW()-4,1024)/256)+1&INT(MOD(ROW()-4,256)/64)+1&INT(MOD(ROW()-4,64)/16)+1&INT(MOD(ROW()-4,16)/4)+1&MOD(ROW()-4,4)+1)*1 でいいですね。「-4」ははじめの行番号です。
その他の回答 (6)
- okormazd
- ベストアンサー率50% (1224/2412)
#2です。 A1からA列に数値を出すなら、 A1: =(INT(MOD(ROW(),16384)/4096)+1&INT(MOD(ROW(),4096)/1024)+1&INT(MOD(ROW(),1024)/256)+1&INT(MOD(ROW(),256)/64)+1&INT(MOD(ROW(),64)/16)+1&INT(MOD(ROW(),16)/4)+1&MOD(ROW()-ROW($A$1),4)+1)*1 として、 A16384までフィルする。 #2でA16384としたが、#2ではA4から始めたので、A16387までだったね。
- 30246kiku
- ベストアンサー率73% (370/504)
#1です 何をやっているか、VBAがわからない方に説明するのは難しいのですが、 使い方であれば、以下手順で確認してみてください。 ・Excel を起動します。 ・メニューの「ツール」→「マクロ」→「Visual Basic Editor」を起動します。 ・新しく表示された画面で、「挿入」→「標準モジュール」を選びます。 ・縦棒のカーソルが点滅しているところに、以下の記述をコピー&ペーストします。 ' ------- ここから Dim iRow As Long Dim iCol As Long Public Sub ReNum(iNst As Long, iNum As Long) Dim v As Variant Dim i As Long, j As Long j = iNum * 10 For Each v In Array(1, 2, 3, 4) i = j + v If (iNst <= 1) Then Cells(iRow, iCol) = i iRow = iRow + 1 Else Call ReNum(iNst - 1, i) End If Next End Sub Public Sub test7() iRow = 1 ' 書き出し開始行 iCol = 1 ' 書き出し列 Call ReNum(7, 0) End Sub Public Sub test6() iRow = 1 iCol = 2 Call ReNum(6, 0) End Sub Public Sub test5() iRow = 1 iCol = 3 Call ReNum(5, 0) End Sub Public Sub test4() iRow = 1 iCol = 4 Call ReNum(4, 0) End Sub ' ------- ここまで ・Excel の方の画面に戻って、「ツール」→「マクロ」→「マクロ」から 「test4」~「test7」を実行してみます。 test7 を実行すると A列1行目から行方向に7桁の数値を作ります。 test6 を実行すると B列1行目から・・・・6桁・・・・ test5 を実行すると C列1行目から・・・・5桁・・・・ test4 を実行すると D列1行目から・・・・4桁・・・・ (アクティブなシートに) 今回、使用する値は 1 ~ 4 でしたが、1、3、5、7 にしたい時には Array(1, 2, 3, 4) 部分を Array(1, 3, 5, 7) に変更するだけです。また、1 ~ 6 であれば Array(1, 2, 3, 4, 5, 6) に変更するだけです。ここに記述した順に桁数分処理していきます。 もちろん、重複した記述をすれば、それはそのように処理します。 Array(1, 1, 3, 4) ただし、この場合、重複した数値がそのまま表示されます。 (以下のような感じで) 1111111 1111111 1111113 1111114 1111111 1111111 1111113 1111114 1111131 1111131 1111133 1111134 1111141 1111141 1111143 1111144 ・・・・
お礼
ご丁寧に対応して頂きありがとうございました。VBAはつかったことが無いので、何とかエクセルの関数で処理を仕様と思っていましたが、せっかくご指導頂きましたので、少し時間をかけてチャレンジしてみようと思っています。どうもありがとうございました。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
No.3 です、度々すみません。No.3 の SUMPRODUCT 関数を使うよりは、No.2さんの書かれた「=(A4&B4&C4&D4&E4&F4&G4)*1」とか、「=--(A4&B4&C4&D4&E4&F4&G4)」とか、「=value(A4&B4&C4&D4&E4&F4&G4)」などを使ったほうが少しラクですね。お好きな方法で。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
必要な行数は 4^7 = 16,384 行となることは分かりますか。100 万(10^6)の位に「1」という数字が来る組み合わせの数は、4^7 / 4 = 4^6 = 4,096 通りです。同様に 10^5 の位であれば、「1」が来るのは 4^5 = 1,024 通りです。他の数字でも同じです。 A1 =mod(int((row()-1)/4^(7-column())),4)+1 H1 =sumproduct(a1:g1*10^(7-column(a1:g1))) A1 セルを右方向にドラッグして A1:G1 のセル範囲を埋めます。次いで A1:G1 をコピーします。コピーしたままの状態で、名前ボックス(数式バーの左隣にあるボックス)に「a1:a16384」と入力し、Enter キーを押します。さらに、他の操作をしないままの状態で、Ctrl+V のショートカットキーを押すなどして貼り付けます。最後に H1 にカーソルを置いて、下方向にオートフィル(カーソルの枠の右下隅の角をダブルクリック)すれば、でき上がり。
- okormazd
- ベストアンサー率50% (1224/2412)
たとえば、4行目から下に一覧を作るとする。 A4: =INT(MOD(ROW()-ROW($A$4),16384)/4096)+1 B4: =INT(MOD(ROW()-ROW($A$4),4096)/1024)+1 C4: =INT(MOD(ROW()-ROW($A$4),1024)/256)+1 D4: =INT(MOD(ROW()-ROW($A$4),256)/64)+1 E4: =INT(MOD(ROW()-ROW($A$4),64)/16)+1 F4: =INT(MOD(ROW()-ROW($A$4),16)/4)+1 G4: =MOD(ROW()-ROW($A$4),4)+1 と入れて、A4:G4を選択して4^7=16384行までドラッグフィルする。 4行目からじゃなかったら、$A$4の4をその行番号にする。 7ケタの数値として欲しかったら、H4に、 =(A4&B4&C4&D4&E4&F4&G4)*1 とすればいい。 補助セルを使わずに済ませたかったら、A4にいきなり =(INT(MOD(ROW()-ROW($A$4),16384)/4096)+1&INT(MOD(ROW()-ROW($A$4),4096)/1024)+1&INT(MOD(ROW()-ROW($A$4),1024)/256)+1&INT(MOD(ROW()-ROW($A$4),256)/64)+1&INT(MOD(ROW()-ROW($A$4),64)/16)+1&INT(MOD(ROW()-ROW($A$4),16)/4)+1&MOD(ROW()-ROW($A$4),4)+1)*1 と入れて、下にドラッグする。
- 30246kiku
- ベストアンサー率73% (370/504)
VBA 記述になりますが大丈夫ですか 以下に基本部分を記述します。 後は、発展させてください。 Public Sub ReNum(iNst As Long, iNum As Long) Dim v As Variant Dim i As Long, j As Long j = iNum * 10 For Each v In Array(1, 2, 3, 4) i = j + v If (iNst <= 1) Then Debug.Print i ' ★ Else Call ReNum(iNst - 1, i) End If Next End Sub ★部分で数値が出来上がります 7桁必要なら Call ReNum(7, 0) の様に呼び出します。 同様に6桁なら Call ReNum(6, 0) の様に
補足
早速にありがとうございました。誠に恐れ入りますが、VBAが全く解らないので、かなり難解でなければ使い方を教えて頂けますか?よろしくお願いいたします。
お礼
よ~く解りました。早速作ってみました。データがしっかり作れました。なかなか自分では思いつかない関数式です。とても参考になりました。ありがとうございました。