プロが教えるわが家の防犯対策術!

Sub test01()
a = Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行取得
b = Cells(Rows.Count, "B").End(xlUp).Row 'B列最終行取得
For i = 1 To a '1行からA列最終行まで繰り返し
For n = 1 To b '1行からB列最終行まで繰り返し
x = x + 1
Cells(x, "C") = Cells(i, "A") & " " & Cells(n, "B") 'C列に結合して転記
Next n
Next i
End Sub

こちら過去の解答にあったのですが、a,b,c,dに数字が入っていて、
Eに組み合わせを出力する場合どう変えればよいのでしょうか?

A 回答 (7件)

ちょっと修正 変数a,b,c,d


a = WorksheetFunction.Count(Range("A:A"))
だと、数値しかカウントしないので まずいですね

a = WorksheetFunction.CountA(Range("A:A"))
または
a = Cells(Rows.Count, "A").End(xlUp).Row
です。検証は、数値で入力していたので。。。m(_ _)m
    • good
    • 0

No.2で回答したものです。



No.4のMarcoRossiItalyさんの回答でうまくいくはずです(フォローありがとうございます)。

質問文の構文には各命令文の意味が書きこまれていたので、命令文の意味を理解していると判断していましたが理解できていないのであれば、No.4の方が指摘するように非常に危険ですからVBAに手を出さないほうがいいです。
やろうと思えばそのPCのファイルを全て消去するようなプログラムを作る事だって可能なんですから、最低限何がどういう働きをするのかは自分で勉強してから実行してください。


VBAを理解しておられないようなので念のため、比較的安全な関数だけで出来る方法を書いておきます・・・が、確認してない(自宅PCにExcel入ってないので確認できません)ので間違ってたらごめんなさい。
「この程度の事はVBAに頼らなくても、関数だけでも出来ますよ」という程度の参考としてください。
うまくいかなかったらセルe2の関数の式を自分でちょっと弄ってみてください。
例えばrounddownをroundupに変えてみるとか、rounddownの後についている-1を変えてみるとか・・・

うまく行ったにしても、うまく行かなかったにしても、式に使われている命令文の意味は自分で確認してください。

a~d列に組み合わせたい値が上から連続して入っていて、途中に空白セルが無いことが前提です。

セルe1
=concatenate(a1," ",b1," ",c1," ",d1")

セルe2
=concatenate(offset(a$1,rounddown(counta(e$1:e1)/counta(b:d),0),0)," ",offset(b$1,counta(e$1:e1)-rounddown(counta(e$1:e1)/counta(c:d),0)*counta(b:b)-1,0)," ",offset(c$1,counta(e$1,e1)-rounddown(counta(e$1:e1)/counta(d:d),0)*counta(c:c)-1,0)," ",offset(d$1,counta(e$1:e1)-rounddown(counta(e$1:e1)/counta(c:c),0)*counta(d:d),0))

セルe3以降にe2のセルをコピペ

ちなみに、多分e2の関数式は「"」で改行されて表示されていますが、「" "」つまり空白です。本来は1行の関数式で、表示しきれないから空白のところで改行されて表示されているだけですので、注意してください。
    • good
    • 0

マクロというより 数式ですが



Sub 総当たり()
Dim a As Long, b As Long, c As Long, d As Long
Dim J As Long, K As Long, L As Long
   Dim Start As Single
   Dim Finish As Single
   
   Range("E:E").ClearContents
   Start = Timer ’不要

a = WorksheetFunction.Count(Range("A:A"))
b = WorksheetFunction.Count(Range("B:B"))
c = WorksheetFunction.Count(Range("C:C"))
d = WorksheetFunction.Count(Range("D:D"))
J = a * b * c * d
K = b * c * d
L = c * d

   Range("E1:E" & J).FormulaR1C1 = "=INDEX(C1,(ROW()-1)/" & K & "+1)" & "&"" ""&" & _
   "INDEX(C2,MOD(ROW()-1," & K & ")/" & L & "+1)" & "&"" ""&" & _
   "INDEX(C3,MOD(ROW()-1," & L & ")/" & d & "+1)" & "&"" ""&" & _
   "INDEX(C4,MOD(ROW()-1," & d & ")+1)"
   Range("E1:E" & J).Value = Range("E1:E" & J).Value

   Finish = Timer ’不要
   MsgBox (J & "個の入力にかかった時間は" & Finish - Start & "秒です") ’不要

End Sub
    • good
    • 0

ご質問は「組み合わせ」を求めたいとなっていますが、数学で言うところの組み合わせではなく、「順列」を求めるということでいいですね?



そうであれば、質問者さんが見付けた過去の回答とか、No.2 さんが示されているコードを使えば、(若干のタイポの修正は必要ですが)できるはずです。

!!!!!!!!!!
必ず、データ処理を開始する前に、順列の個数を計算しておいてください。例えば A ~ D 列のデータ数がそれぞれ 3、2、3、2 個である場合は、「=3*2*3*2」というふうに計算できることになりますね?この結果が天文学的な値になってしまうと、丸一日データ処理をさせても終わらないというケースもあり得ます。万一そのようなことになってしまったら、キーボードの Escape キーで処理を中断してください。


>○「全通りの組合せ」の意味は?
 ・abcdと4つ並べたときの全部の組合せ

「a」というのは、A 列中のある行に存在する文字列を指す代名詞のことだと、こちらでは勝手に解釈しています。4 列の全データを使って、全順列を求めるということでいいですね?回答者は、質問文が全然別な意味であることも含めて、様々な可能性を考えた上で、回答文を作成しています。誰にでも意味の通じるご説明を心がけてください。ムダな問答の繰り返しは、負担になります。


>……構文エラーになり出来ませんでしたがどこがまちがっているか……

コードの意味を理解しておらず、VBE も使えていない証拠です。No.2 さんのおっしゃるとおり、少しでも自分で作る努力をしないと、永遠にできるようにはならないでしょう。

また、意味も分からないまま見ず知らずの人が作ったコードを実行してしまうというのは、場合によってはたいへん危険な行為です。今回のコードは単なる文字列の結合だから、事前にバックアップなりしておけばそれほど深刻なことにはならないかもしれませんが、とにかく何も考えないのは危ないです。


No.2 さんが示されたコード中のタイポを修正させていただいたものが下のとおりです。For の中の数式で、「"C"」→「"e"」、「Cels」→「Cells」、「" " Cells」→「" " & Cell」としました。


Option Explicit

Sub test01()

Dim a As Long, b As Long, c As Long, d As Long
Dim I As Long, J As Long, K As Long, L As Long
Dim x As Long

a = Cells(Rows.Count, "A").End(xlUp).Row
b = Cells(Rows.Count, "B").End(xlUp).Row
c = Cells(Rows.Count, "C").End(xlUp).Row
d = Cells(Rows.Count, "D").End(xlUp).Row

For I = 1 To a
  For J = 1 To b
    For K = 1 To c
      For L = 1 To d

      x = x + 1

      Cells(x, "e") = Cells(I, "A") & " " & Cells(J, "B") & " " & _
              Cells(K, "C") & " " & Cells(L, "D")

      Next L
    Next K
  Next J
Next I

End Sub
    • good
    • 0

過去の質問と似た状況、ということになると


a
A1: 1
A2: 2

b
B1: 3
B2: 4

c
C1: 5
C2: 6

d
D1: 7
D2: 8

となっているときに、 abcd の全組合せ
1357
1358
1367
1368
...
を求めたい、ということに思えますが、それであっていますか?
そうだとすると、#2のミスを修正すればできます。
誤) Cells(x, "C") =
正) Cells(x, "E") =


そうでないなら、やりたいことを、もう少し詳しく書いてくれませんか?
○a,b,c,dは何?
・候補となる数字の一覧(上記の例のような)
・プログラム中で a=5等と指定した定数
...

○「全通りの組合せ」の意味は?
・abcdと4つ並べたときの全部の組合せ
・bcda等、4つの順番を入れかえる場合も考慮
・abc等、4つでない場合も考慮
・bca等、4つでない、かつ順番も入れ替える場合も考慮
・重複するものを別に数える/1つだけにする
...

この回答への補足

説明不足で吸いません。
こちらが出力したいです。
○「全通りの組合せ」の意味は?
・abcdと4つ並べたときの全部の組合せ



解答の方法でやったのですが構文エラーになり出来ませんでしたがどこがまちがっているかおしえていただけますか?

補足日時:2013/02/02 11:08
    • good
    • 0

Sub test01()


a = Cells(Rows.Count, "A").End(xlUp).Row
b = Cells(Rows.Count, "B").End(xlUp).Row
c = Cells(Rows.Count, "C").End(xlUp).Row
d = Cells(Rows.Count, "D").End(xlUp).Row
For I = 1 to a
For J = 1 to b
For K = 1 to c
For L = 1 to d
x = x + 1
Cells(x, "C") = Cels(I, "A") & " " & Cells(J, "B") & " " & _
Cells(K, "C") & " " Cells(L, "D")
Next L
Next K
Next J
Next I
End Sub

 一応そのまま回答しましたが、各命令文の意味が分かっていながら何故これが出来ないのか少し理解に苦しみます。プログラミング技術は自分自身でいろいろと試さないと身に着きませんから、分からない事を他人に訊く前に少しでいいから自分で考えた方があなた自身のためになるでしょう。

この回答への補足

質問の文が足りなかったようですいません。
a,b,c,dに入っている数字の組み合わせ全通りを出力するにはどうすればよいのでしょうか?

私がみた過去の質問はこちらです。
http://oshiete.goo.ne.jp/qa/4122783.html?from=re …

補足日時:2013/02/02 08:05
    • good
    • 0

過去の解答ですが正しい回答ではないようですね。

式のxは何のことでしょう。
A,B,C,D列の最終行で最も大きい行に照準を合わせて組み合わせをE列に出力することでしょう。
例えば次のようにすることでしょう。

Sub test01()

a = Cells(Rows.Count, "A").End(xlUp).Row
b = Cells(Rows.Count, "B").End(xlUp).Row
c = Cells(Rows.Count, "C").End(xlUp).Row
d = Cells(Rows.Count, "D").End(xlUp).Row
n = WorksheetFunction.Max(a, b, c, d)
For i = 1 To n
Cells(i, "E") = Cells(i, "A") & " " & Cells(i, "B") & " " & Cells(i, "C") & " " & Cells(i, "D")
Next i

End Sub

この回答への補足

質問の文が足りなかったようですいません。
a,b,c,dに入っている数字の組み合わせ全通りを出力するにはどうすればよいのでしょうか?

私がみた過去の質問はこちらです。
http://oshiete.goo.ne.jp/qa/4122783.html?from=re …

補足日時:2013/02/02 08:05
    • good
    • 0

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