• ベストアンサー

エクセル 全通り出力

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に組み合わせを出力する場合どう変えればよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

ちょっと修正 変数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

その他の回答 (6)

  • NURU_osan
  • ベストアンサー率50% (297/593)
回答No.7

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行の関数式で、表示しきれないから空白のところで改行されて表示されているだけですので、注意してください。

回答No.5

マクロというより 数式ですが 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

回答No.4

ご質問は「組み合わせ」を求めたいとなっていますが、数学で言うところの組み合わせではなく、「順列」を求めるということでいいですね? そうであれば、質問者さんが見付けた過去の回答とか、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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

過去の質問と似た状況、ということになると 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つだけにする ...

sujk001
質問者

補足

説明不足で吸いません。 こちらが出力したいです。 ○「全通りの組合せ」の意味は? ・abcdと4つ並べたときの全部の組合せ 解答の方法でやったのですが構文エラーになり出来ませんでしたがどこがまちがっているかおしえていただけますか?

  • NURU_osan
  • ベストアンサー率50% (297/593)
回答No.2

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

sujk001
質問者

補足

質問の文が足りなかったようですいません。 a,b,c,dに入っている数字の組み合わせ全通りを出力するにはどうすればよいのでしょうか? 私がみた過去の質問はこちらです。 http://oshiete.goo.ne.jp/qa/4122783.html?from=recommend

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

過去の解答ですが正しい回答ではないようですね。式の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

sujk001
質問者

補足

質問の文が足りなかったようですいません。 a,b,c,dに入っている数字の組み合わせ全通りを出力するにはどうすればよいのでしょうか? 私がみた過去の質問はこちらです。 http://oshiete.goo.ne.jp/qa/4122783.html?from=recommend

関連するQ&A

  • 【VBA】"オブジェクトが必要です"メッセージ出力

    VBAを使用し、A列に日付、B列に数量、C列に単価、D列に金額を入力し、 数量*単価にて、金額を求めるVBAを作成しています。 そこまでは上手くいくのですが、D列で求めた金額を最終行で合計する事で 躓いてしまっています。 行は常に追加され可変の為、最終行を「Cells(Row.Count, 1).End(xlUp).Row」 にて引っ張ってこようと思っております。以下のようなVBAを記載しましたが、 「オブジェクトが必要です」とのメッセージがでて、処理が上手くいきません。 どのような問題があるのか、お分かりの方、ご回答頂けますと幸いです。 ■環境  Windows7  Excel2010 ■VBA Sub test() Dim i As Long Dim j As Long Dim k As Long For i = 2 To Cells(Row.Count, 1).End(xlUp).Row Cells(i, 4) = Cells(i, 2) * Cells(i, 3) Next j = Cells(Row.Count, 1).End(xlUp).Row + 1 k = Cells(j, 1).End(xlUp).Row Cells(j, 4) = WorksheetFunction.Sum(Cells(2, 4), Cells(k, 4)) End Sub

  • range表記をcells表記にしたい

    B列の最終行までループさせたいのですが Sub Sample() Dim col As Long col = 2 For Each R In Range("B1:B" & Cells(Rows.count, "B").End(xlUp).Row) Next End Sub この状態から、Bを使わずに、 col = 2を使って、書き換えてもらっても良いですか? For Each R In Range(Cells(1, col), Cells((Rows.count, col)).End(xlUp).Row) これにするとエラーになります。

  • EXCEL VBA 早く処理をする

    よろしくお願いします 下の構文を標準モジュールに書き込み、callで実行しているのですが 処理に時間がかかります。 処理を早くする方法と構文の簡素化のご教示をお願いします。 Application.ScreenUpdating = False For i = 1 To 12 With Worksheets(i) .Select LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A8:G" & LastRow).Sort Key1:=Range("A8"), order1:=xlAscending .Range("G8:G" & LastRow - 1).Formula = "=G7+E8-F8" LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A" & LastRow).Select Dim EndRow As Long EndRow = .Range("A" & Rows.Count).End(xlUp).Row Cells(Rows.Count, 1).End(xlUp).Offset(1, 3) = .Name & "合計" Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) = Application.WorksheetFunction.Sum(Range("E7:E" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) = Application.WorksheetFunction.Sum(Range("F7:F" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(2, 3) = "前月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) = .Range("G7") Cells(Rows.Count, 1).End(xlUp).Offset(2, 5) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 4) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 3) = "次月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(4, 3) = "合計" Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) - Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(4, 4) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) Cells(Rows.Count, 1).End(xlUp).Offset(4, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(1, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(2, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(4, 6) = Cells(Rows.Count, 1).End(xlUp).Offset(0, 6) .Range("C7").End(xlDown).Select Selection.Offset(4, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 2).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 3).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 4).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(0, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 2).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 2).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 3).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 3).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 4).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 4).Borders(xlEdgeBottom).Weight = xlThin End With Next i Application.ScreenUpdating = True

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

  • Excel vbaのClearについて

    よろしくお願いします。 Excel2003使用です。 最終行を指定して、それを使って動作をしたいのですが、、うまく動作しません。 A列~D列まで入力があり、A列の52行目からD列の最終行までをClearしたいのです。 Set ps = ThisWorkbook.Worksheets("●●") LastRow = ps.Cells(ps.Rows.Count,1).End(xlUP).Row ps.Range(Cells(52,1),Cells(LastRow,4)).Clear →Error1004がでます うまく動く方法をご存じな方、よろしくお願いします。

  • エクセルで表を展開するマクロを作りたい

    こんにちは。 エクセルで表を展開したいのですがマクロが作れません。 どなたか詳しい方教えて下さい。     A   B   C  D 1  1,2,3  abc  def  ghi を    A   B   C  D 1  1 abc  def  ghi 2   2  abc  def  ghi 3  3  abc  def  ghi というように展開したいです。 10列目くらいまで対応したマクロが作りたいです。 Sub test() 'この行から Dim i, j, k As Long Dim myArray As Variant For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If Not Cells(i, 1) Like "*" & "," & "*" Then i = i - 1 myArray = Split(Cells(i, 1), ",") k = UBound(myArray) Rows(i + 1 & ":" & i + k).Insert For j = 0 To k Cells(i + j, 1) = myArray(j) Next j Next i For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 2) = "" Then Cells(i, 2) = Cells(i - 1, 2) End If Next i Columns("A:B").AutoFit End Sub 'この行まで これにどう付け足せばいいでしょうか? どうかご教授お願い致します。

  • マクロ 行を切り取ってペーストでエラーになる

    J列に「0」と「#N/A」の行を切り取って集計対象外シートに貼り付けるといったコードです。 何故か途中でエラーになります。 どこが間違っておりますか? 宜しくお願いします。 Dim LastRow As Long LastRow = Cells(Rows.Count, 10).End(xlUp).Row For i = 1 To LastRow If Cells(i, 10) = "0" Or Cells(i, 10) = "#N/A" Then Rows(i).Cut Sheets("集計対象外").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i

  • vba エクセル

    2行目から、最終行までEmptyにしたいのにならないです。 1行目はフィールド行なのに、そのままにしたいのですが 2行目から最終行は空白にしたいです。 なので Sub TEST() With Sheets("log") lastRow = .Cells(.Rows.Count, "b").End(xlUp).Row LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column .Range(.Cells(2, LastCol), .Cells(lastRow, LastCol)) = Empty End With End Sub としたのですが、何も起こりません。 lastRowは100、LastColは5なのですが、 このマクロを実行しても何も起こらないです。 なぜでしょうか?

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 2).Value = Cells(ii, 2).Value _ And Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 5).Value = Cells(ii, 5).Value Then Dim iii As Byte iii = 1 Rows(ii).Delete Shift:=xlUp End If Next ii If iii = 1 Then Rows(i).Delete Shift:=xlUp iii = 0 Next i End Sub データーが下の表のように入っております。     A    B    C    E    F 1  1/26  a1234  fdsa  5000  C1 2  1/27  a4567  sdfa  4000  T2 3  1/28  a1234  dfsa  5000  C1 4  1/30  b4567  asdf  6600  A2 5  2/10  b4567  fsda  6600  A2 6  2/10  a1234  afds  5000  C1 B列、E列、F列が完全一致(重複1行目と3行目と6行目・4行目と5行目)で削除し結果的に2行目だけ残る方法がしたいのですが、このマクロですと少ないデータですとうまく動くのですが、『大量のデータを一気に削除出来ない』、『同じ重複が3つ以上のデータが多数ある場合データが削除されずに残ってしまう』エラーが出てしまいます。どうかお教えください。

  • 【VBA】 通し番号の入力について

    こんばんは。 こちらの識者の方々にはいつもお世話になっています。 VBAの件で質問があります。 B列の最終行までA列に001から文字列で連番を振りたい場合、どのような構文になりますでしょうか。 Range("A1:A" & Range("B" & Cells.Rows.Count).End(xlUp).Row).Value = Format(row, "000") は通らなかったのですが、なにかいい構文はありますでしょうか。 データは必ず1000行以下ですので、番号は3桁で大丈夫です。 よろしくお願いいたしますm(_ _)m

専門家に質問してみよう