痔になりやすい生活習慣とは?

1,2,3,--,n-1,nからm個とる組み合わせのパターンを
セル(1,1)から(nCm、nCm)に表示させる処理をVBAで記述
したいのですが、どうすればいいのでしょうか。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

再帰呼び出しのアルゴリズムは「自分自身を呼び出す」わけですから、普通の上から下へ


読んでいくフローとはひと味違って、考えにくいところがあります(実は私もしばらくや
ってなかったので今回少し手こずりました)。

各行の意味を書きます。


Const nStr As String = "あいうえおかきく" '←n個の文字列
Const m As Integer = 3 '←取り出す個数
Dim n As Integer '←ご質問文のn
Dim rStr As String '←m個取り出した文字列を結合したもの
Dim mRow As Integer '←エクセル表へ書き出す際の行番号
Dim Nest As Integer '←再帰呼び出しの深さ=rStrの何文字目に取り出すのか
'-----------------------
Sub combi()
n = Len(nStr) 'nStrの文字列長をnに代入
If m > n Then Exit Sub 'nよりmが大きければ終了
rStr = String(m, " ") 'rStrにm個の空白を代入
Cells.ClearContents '書き出す表をクリア
mRow = 0 '書き出す行番号0クリア
Nest = 0 '再帰呼び出し深さ0クリア
combiPr (0) 'サブルーチン combiPr を引数0で呼び出し
End Sub
'-----------------------
Sub combiPr(n1) 'サブルーチン開始 引数はその時点での開始位置(nStrの何文字目まで処理したか)
Dim mCol As Integer '←エクセル表へ書き出す際の列番号
For nn = n1 + 1 To n - m + Nest + 1 'nnを開始位置の次の文字から始めて残りの文字数の手前までFor~Nextを繰り返す
Nest = Nest + 1 '再帰呼び出しを1カウントアップ
Mid(rStr, Nest, 1) = Mid(nStr, nn, 1) 'rStrのNest番目にnStrのnn番目を代入
If Nest = m Then 'rStrに取り出したのがm文字目なら
mRow = mRow + 1 'エクセル表の次の行へ
For mCol = 1 To m 'rStrの1文字目からm文字目まで書き出す。
Cells(mRow, mCol).Value = Mid(rStr, mCol, 1)
Next
Else 'そうでなければ、つまり現在の開始位置(=nStrの何文字目まで処理したか)がm個まで達してなければ
Call combiPr(nn) '現在の到達位置(nStrの何文字目まで処理したか)にnnをセットしてcombiPrを呼び出す(再帰呼び出し)
End If
Nest = Nest - 1'再帰呼び出しを1後退
Next
End Sub


手順は原始的なものです。
あ~く まで書かれたカードを8枚ならべて3枚抜き出すことを考えればお解りになるで
しょうか。

あ を一枚抜き出し、
い を抜き出し2枚目に置きます。
う を抜き出し、3枚目とします。←これを く まで繰り返します。

次に、い を戻して う を新たな2枚目とします。
え を抜き出し、3枚目とします。←これを く まで繰り返します。

の繰り返し・・・・

を行っているわけです。

ポイントは、1枚目を抜き出すのは か までだという点です。
き まで抜き出したら(く までしかないので)3枚目のカードがなくなります。
同様に2枚目は き までしか抜き出してはいけません。
これが「For nn = n1 + 1 To n - m + Nest + 1」の「n - m + Nest + 1」の部分の意味です。

テキストベースのみの説明なので伝えにくいのですが、不明な点があったら補足説明しますの
で、またおたずねください。
    • good
    • 0
この回答へのお礼

こんなにもていねいな説明にとても感謝します。
おかげでおおよその意味はつかめました。あと数回読み直し納得がいくようにいたします。

お礼日時:2007/06/13 09:07

> この combiというプロシジャを起動すれば、8個から3個取り出す組み合わせが表示されるはずなんですよね。



そうです。

> しかし、何も表示されません。エラーは何もでませんが。
パラメータとか指摘する必要ありますか。

特にパラメータなど指定する必要はありません。
Excel2002/標準モジュールにて確認しましたが当方の環境では56通りの組合せが表示されます。

この回答への補足

ソフト動作をシュミレートしておおよそどのような
動きをしているのか、説明くださればありがたい。
変数の定義など

combi(0)で0を入れる意味は

補足日時:2007/06/08 14:28
    • good
    • 0
この回答へのお礼

やり直したらうまく表示されました。ご回答どうもありがとうございました。

お礼日時:2007/06/08 12:59

再帰(的)呼び出しのアルゴリズムになると思います。


以下のソースでいかがでしょうか。

Const nStr As String = "あいうえおかきく" '←n個の文字列
Const m As Integer = 3 '←取り出す個数
Dim n As Integer
Dim rStr As String
Dim mRow As Integer
Dim Nest As Integer
'-----------------------
Sub combi()
n = Len(nStr)
If m > n Then Exit Sub
rStr = String(m, " ")
Cells.ClearContents
mRow = 0
Nest = 0
combiPr (0)
End Sub
'-----------------------
Sub combiPr(n1)
Dim mCol As Integer
For nn = n1 + 1 To n - m + Nest + 1
Nest = Nest + 1
Mid(rStr, Nest, 1) = Mid(nStr, nn, 1)
If Nest = m Then
mRow = mRow + 1
For mCol = 1 To m
Cells(mRow, mCol).Value = Mid(rStr, mCol, 1)
Next
Else
Call combiPr(nn)
End If
Nest = Nest - 1
Next
End Sub

この回答への補足

この combiというプロシジャを起動すれば、8個から3個取り出す組み合わせが表示されるはずなんですよね。
しかし、何も表示されません。エラーは何もでませんが。
パラメータとか指摘する必要ありますか。

補足日時:2007/06/07 15:46
    • good
    • 0

問題は(nCm、nCm)でなく(nCm、m)でしょうね。

    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcelでの全通りの組み合わせ出力方法(文字列)

Excelについて全くの初心者で、教えて頂きたい質問があります。

Excelの文字列の全通りの組み合わせを出力がしたいのですが、その方法が分かりません。
例えばセルAに
・りんご
・みかん
・いちご

セルBに
・だいこん
・キャベツ
・トマト

があり、別のセルにその全通りの組み合わせを出力
(文字と文字の間はスペース)

りんご だいこん
りんご キャベツ
りんご トマト
みかん だいこん
みかん キャベツ
みかん トマト
いちご だいこん
いちご キャベツ
いちご トマト

この様に出来る方法はあるでしょうか?
また出来ればその裏(だいこん りんご)も出力したいと考えており、キーワードは3つまで出来るようになりたいです。

どなたかご存じでしたら、ぜひお教え下さい。
よろしくお願いします。

Aベストアンサー

A列B列は1行目からデータがあるものとします。
C列に転記するものとします。

以下の手順をおためしください。

1.Altキー+F11キーでVisualBasicEditorを呼び出します。

2.メニューから挿入、標準モジュールで出てきたコードウィンド(右側の白い広い部分)に以下のコードをコピペします。

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

3.Alt+F11キーでワークシートへもどります.

4.メニューから、ツール、マクロ、マクロで出てきたマクロ名(test01)を選択して実行

これでできます。
これがわかれば「裏」というのも簡単ですよね。
以上はVBAでの回答ですが、外していたらごめんなさい。

A列B列は1行目からデータがあるものとします。
C列に転記するものとします。

以下の手順をおためしください。

1.Altキー+F11キーでVisualBasicEditorを呼び出します。

2.メニューから挿入、標準モジュールで出てきたコードウィンド(右側の白い広い部分)に以下のコードをコピペします。

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行...続きを読む

QExcelですべての組合せ(重複組合せ)を出力するには?

Excelですべての組合せ(重複組合せ)を出力するには?

次の条件のような場合、Excelですべての組合せ(重複組合せ)をVBAで出力するにはどうしたらいいのでしょうか?

10種類のお菓子の中から、好きなものを3個選んでセットにするとします。
同じものを複数選ぶのはありですが「菓子A、菓子B、菓子C」と「菓子B、菓子C、菓子A」は選んだ順が違うだけで同じ組合せなので、どちらか片方だけにします。

この場合、すべての組合せの数は Excelの関数で求めることができるようで COMBIN(10+3-1,3) = 220 通りあることまではわかりましたが、このすべての組合せの一覧をどのようにして出力したらいいのかがわかりません。

いろいろ検索した結果、順列という方法は見つかりましたが、重複組合せでの方法は見つけることができませんでした。
また、Accessを使っても似たようなことができるのでしょうか? 直積?

できれば、3個固定ではなく5個の場合も出来るとうれしいです。
よろしくお願いします。

Aベストアンサー

>同じものを複数選ぶのはありですが「菓子A、菓子B、菓子C」と「菓子B、菓子C、菓
つまり「菓子A、菓子A、菓子A」も「菓子A、菓子A、菓子B」もあり ですね。
№2さんのコードをお借りして
Sub Test()
  Dim myStr As Variant
  Dim rowX As Long
  Dim i As Long, j As Long, k As Long
  Const MaxNum = 10

  myStr = Split("A B C D E F G H I J")
  rowX = 1
  For i = 0 To MaxNum - 1
    For j = i To MaxNum - 1
      For k = j To MaxNum - 1
        Cells(rowX, 1).Value = myStr(i)
        Cells(rowX, 2).Value = myStr(j)
        Cells(rowX, 3).Value = myStr(k)
        rowX = rowX + 1
      Next k
    Next j
  Next i
End Sub

>同じものを複数選ぶのはありですが「菓子A、菓子B、菓子C」と「菓子B、菓子C、菓
つまり「菓子A、菓子A、菓子A」も「菓子A、菓子A、菓子B」もあり ですね。
№2さんのコードをお借りして
Sub Test()
  Dim myStr As Variant
  Dim rowX As Long
  Dim i As Long, j As Long, k As Long
  Const MaxNum = 10

  myStr = Split("A B C D E F G H I J")
  rowX = 1
  For i = 0 To MaxNum - 1
    For j = i To MaxNum - 1
      For k = j To MaxNum - 1
       ...続きを読む

QエクセルでnCr (組み合わせ)の作成方法

どなたかご存じでしたら回答願います。
ミニロトとロト6をエクセルを使用して予想に利用しております。
その中で知りたいのは、下記の場合のエクセルVBAのソースです。

●知りたいこと。

(1)ミニロトの場合は、31個から5個全てが一致すると一等ですが、
 「25個から5個選択した場合の組み合わせ(25C5)」作成方法

(2)ロト6の場合は、43個から6個全てが一致すると一等ですが、
 「24個から6個選択した場合の組み合わせ(24C6)」作成方法。

●入力

(1)ミニロトの場合は、下記のように5×5マスに重複しない数字が入っています。
  数字は毎回変わります。
  1   2 5 6 7
10 4 11 13 15
8 9 17 21 28
14 16 18 20 25
19 22 23 24 27

(2)ロト6の場合は、下記のように6×4マスに重複しない数字が入っています。
  数字は毎回変わります。

  1   2 5 6 7 19
10 4 11 13 5 22
8 9 17 21 28 23
14 16 18 20 25 24

●出力

  VBAを実行すると、新シートにそれぞれ、25C5又は、24C6の全組み合わせが出力される。

【注意事項】
   ・使用しているエクセルは2010です。

以上、ご回答よろしくお願いします。

どなたかご存じでしたら回答願います。
ミニロトとロト6をエクセルを使用して予想に利用しております。
その中で知りたいのは、下記の場合のエクセルVBAのソースです。

●知りたいこと。

(1)ミニロトの場合は、31個から5個全てが一致すると一等ですが、
 「25個から5個選択した場合の組み合わせ(25C5)」作成方法

(2)ロト6の場合は、43個から6個全てが一致すると一等ですが、
 「24個から6個選択した場合の組み合わせ(24C6)」作成方法。

●入力

(1)ミニロトの場合は、下記のように5×5マス...続きを読む

Aベストアンサー

過去のQ&A(参考URL)を参照なさってはいかがでしょう?

参考URL:http://oshiete.goo.ne.jp/qa/5571459.html

QExcelでデータ全通り組み合わせ出力方法

Excelでデータ全通り組み合わせ出力方法について教えて頂けますと助かります。

セルA~Eに、数がまちまちのアイテム名が入っています。
(セルA~Eというのは例で、変則的に全てのアイテム数は増減します。)

全ての組合せをセルG~Kに各々書き出してくれる方法はあるでしょうか?
(イメージ添付あり)

できればセルに入力すれば自動的に組合せが追加されていくのが理想です。
Excel2010を使用しており、VBAは初心者です。


どなたかご存じでしたら、ぜひお教え下さい。
よろしくお願いします。

Aベストアンサー

#1、2、cjです。#1、2、補足欄へのレスです。

取り急ぎ、コードのみ修正しました。
#2を元に書き換えています。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rSrc As Range
  Application.EnableEvents = False
  Set rSrc = Range("B2").CurrentRegion
  Application.EnableEvents = True
  If Intersect(Target, rSrc) Is Nothing Then Exit Sub
  Application.EnableEvents = False
  Call PrintCombi(rSrc)
  Application.EnableEvents = True
End Sub

Sub PrintCombi(ByVal rSrc As Range)
  Dim tnFld As Long
  Dim nRc As Long
  Dim nConti As Long
  Dim nRow As Long
  Dim i As Long
  Dim j As Long

  tnFld = rSrc.Columns.Count
  nConti = 1
  With rSrc(1, rSrc.Columns.Count + 3)
    .CurrentRegion.Clear
    Cells(1).Resize(, tnFld).Copy .Cells(1)
    For i = tnFld To 1 Step -1
      nRc = Cells(Rows.Count, i).End(xlUp).Row
      nRow = 2
      For j = 2 To nRc
        Cells(j, i).Copy Destination:=.Cells(nRow, i).Resize(nConti)
        nRow = nRow + nConti
      Next j
      nConti = nConti * (nRc - 1)
    Next i
    With .Cells(2, 1).Resize(nConti)
      For i = 2 To tnFld
        Range(.Cells(1, i), .Cells(.Cells.Count + 1, i).End(xlUp)).Copy Destination:=.Columns(i)
      Next i
    End With
  End With
End Sub

#1、2、cjです。#1、2、補足欄へのレスです。

取り急ぎ、コードのみ修正しました。
#2を元に書き換えています。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rSrc As Range
  Application.EnableEvents = False
  Set rSrc = Range("B2").CurrentRegion
  Application.EnableEvents = True
  If Intersect(Target, rSrc) Is Nothing Then Exit Sub
  Application.EnableEvents = False
  Call PrintCombi(rSrc)
  Application.EnableEvents = True
...続きを読む

QExcel VBA 組み合わせパターン

A1~A5 に、順に 「あ」「い」「う」「え」「お」が入っています。

B1に「3」を入れたとき
C1以降、各セル1文字ずつで、

あああ
ああい
ああう
…(略)
おおえ
おおお

といった具合に表示させたいのです。
VBAで簡単にできるでしょうか。

※A列のデータ数は変動します。

Aベストアンサー

Sub test()
n = Range("A1").End(xlDown).Row
m = Cells(1, 2).Value
For i = 1 To n ^ m
k = i - 1
For j = m To 1 Step -1
Cells(i, j + 2).Value = Cells(k Mod n + 1, 1).Value
k = k \ n
Next
Next
End Sub

Q組み合わせパターンについて

質問です!

ExcelのA1からG1のセルに、1から7の数字が入力されています。
A1が1、B1が2・・・G1が7
そこから異なった5つを選びセットを作りたいです。
21通りあることが分かるのですが、全てのパターンをExcelで抽出したいです。

よろしくお願いします。

Aベストアンサー

No.2です!
補足に
>順不同でも同じ数字の組み合わせは表示されないようにしたいのです。
とありましたので・・・

「順列」を選択して実行されていませんか?

「組合せ」を選択 → 「標本セル範囲」をクリック → A1~G1を範囲指定 → 
「リスト開始セル」をクリック → 表示開始セルを選択 → 「抜き取り数」で「5」を選択 → 実行

これで重複なしで21種類のデータが表示されると思います。

これでもダメならごめんなさいね。m(_ _)m

Qエクセルで順列の列挙

例えば
1 と 2 という2個の数字(文字)がある場合,

 A列 B列
  1   2
  2   1

1 2 3 という3個の数字(文字)がある場合,

 A列 B列 C列
  1   2   3
  1   3   2
  2   1   3
  2   3   1
  3   1   2
  3   2   1

1 2 3 4 という4個の数字(文字)がある場合,

 A列 B列 C列 D列
  1   2   3   4
  1   2   4   3
   ~ 省略 ~
  4   3   2   1

という具合に n 個の数字(文字)がある場合,過不足無く列挙させるマクロ(VBA)を教えてください。
Excelの仕様上65,536行までしかないので,「8個の場合」とかいう限定された個数でもかまいません。
また,123,132,213,…,321 という具合に数値として1列に並べる方法でもかまいません。
また昇り順でなくてもかまいません。 よろしくおねがいします。

Aベストアンサー

こんにちは。

学校の宿題とかではありませんよね。
以下は、再帰を使った、順列生成のアルゴリズムです。
たぶん、大丈夫だと思います。後は、65536を超えないようにしてください。

Const N As Integer = 3 '生成する順列数
Dim k As Long
Dim p(1 To N)
Sub perm_test()
 Dim i As Long
 ActiveSheet.Cells.ClearContents
 k = 0
 For i = 1 To N
  p(i) = i
 Next i
 perm 1
End Sub
Private Sub perm(i As Long)
 Dim j As Long, t As Long
 If i < N Then
  For j = i To N
   t = p(i): p(i) = p(j): p(j) = t
   perm i + 1
   t = p(i): p(i) = p(j): p(j) = t
  Next j
 Else
   For j = 1 To N
    Cells(k + 1, j).Value = p(j)
   Next j
   k = k + 1
 End If
End Sub

こんにちは。

学校の宿題とかではありませんよね。
以下は、再帰を使った、順列生成のアルゴリズムです。
たぶん、大丈夫だと思います。後は、65536を超えないようにしてください。

Const N As Integer = 3 '生成する順列数
Dim k As Long
Dim p(1 To N)
Sub perm_test()
 Dim i As Long
 ActiveSheet.Cells.ClearContents
 k = 0
 For i = 1 To N
  p(i) = i
 Next i
 perm 1
End Sub
Private Sub perm(i As Long)
 Dim j As Long, t As Long
 If i < N Then
  For j = i To N...続きを読む

QエクセルVBA 組み合わせの列挙

例えば、整数型配列a(6)={1,2,3,4,5,6}があったとして、
この中から2つ取り出し、その積と、残りの4つの数の積を求める
マクロを作りたいと考えております。
具体的に言いますと、まず{1,2}を選んだとすると、セルA1に1×2=2が入り、
セルB1に3×4×5×6=360が入るようにしたいです。
同種の質問等を検索した結果、
2つ取り出すときの組み合わせは、再起処理で可能だとは思うのですが、
それと同時に、残り4つの数の積を求めるには、
どうのようにしたら良いのでしょうか?
組み合わせの求め方を含んだ形で、ご教授頂けたら幸いです。
よろしくお願いいたします。

Aベストアンサー

本当は、数学的に解決する方法があるだろうけれども、以下は、結構、ネット内では知られた古くからあるアルゴリズムです。ただ、VBAの実務的には、#1さんの書かれた内容のほうが上なのでした。
以下は、一旦、組み合わせをアルゴリズムで作った後に、その残った補完数を羅列しただけで、後は、Product 関数で計算しました。単に、アルゴリズムにこだわっただけのコードです。

'//
Option Explicit
Sub MakingCombin()
Dim Stock As Variant
Dim i As Long
Dim r_PICK
r_PICK = 2 '抽出数
Stock = Array(1, 2, 3, 4, 5, 6) '配列ストック
ActiveSheet.UsedRange.ClearContents 'データを消す
'実行
Call sCombinations(Stock, r_PICK)
End Sub

Private Sub sCombinations(ByVal Stock, ByVal r As Long)
 Dim num As Long
 Dim ar As Variant
 Dim ar_sp As Variant
 Dim i As Long, j As Long
 Dim k As Long, t As Long
 Dim rOrg As Long

 rOrg = r 'もとの抽出数を保管
 num = UBound(Stock) - LBound(Stock)
 r = r - 1
 ReDim ar(0, r)
 ReDim ar_sp(0, num)
 Dim ar_compl 'もとの配列ストック
 Dim arTmp
 Dim idx() As Long
 ReDim idx(0 To r)

 For i = 0 To r
  idx(i) = i
 Next i

 For i = 0 To UBound(Stock)
  ar_sp(0, i) = Stock(i)
 Next
  ar_compl = ar_sp
 Do
  For j = r To 0 Step -1
   ar(0, j) = Stock(idx(j))
  Next
  arTmp = ar_compl
  For i = 0 To UBound(idx): arTmp(0, idx(i)) = Null: Next i
  ReDim ar_sp(0, UBound(Stock) - rOrg) '補完変数に移し替え
  For i = 0 To UBound(Stock)
   If Not IsNull(arTmp(0, i)) Then
    ar_sp(0, t) = arTmp(0, i)
    t = t + 1
   End If
  Next i
  k = k + 1  '書き出しの行
  Cells(k, 1).Value = Application.Product(ar)
  'Cells(k, 4).Resize(1, UBound(ar, 2) + 1).Value = ar '明細
  Cells(k, 2).Value = Application.Product(ar_sp)
  'Cells(k, UBound(ar, 2) + 5).Resize(1, UBound(ar_sp, 2) + 1).Value = ar_sp '明細
  i = r: t = 0
  While (idx(i) = num - r + i)
   i = i - 1
   If i = -1 Then
    Exit Sub
   End If
  Wend
  idx(i) = idx(i) + 1
  For j = i + 1 To r
   idx(j) = idx(i) + j - i
  Next j
  ar_sp = ar_compl
 Loop
End Sub

本当は、数学的に解決する方法があるだろうけれども、以下は、結構、ネット内では知られた古くからあるアルゴリズムです。ただ、VBAの実務的には、#1さんの書かれた内容のほうが上なのでした。
以下は、一旦、組み合わせをアルゴリズムで作った後に、その残った補完数を羅列しただけで、後は、Product 関数で計算しました。単に、アルゴリズムにこだわっただけのコードです。

'//
Option Explicit
Sub MakingCombin()
Dim Stock As Variant
Dim i As Long
Dim r_PICK
r_PICK = 2 '抽出数
Stock = Array(1, 2, 3, ...続きを読む

Q組み合わせを抽出するために使う再帰呼び出しについて

1,2,3,4,5の数列から3の数の組合せをワークシートに表示するプログラムを作っています。
このソースは以前他の質問に載っていたものを自分用に多少アレンジしたものです。構造は再帰呼び出しを使って、123、124、125、134、135、145、234、235…345という形で結果を出力します。いろいろと試してみて、計算結果は正しいとわかったのですが、デバックをしていて1つどうしても理解できないことがありました。計算結果が145から234になるとき、カーソルがSub combiPrのEnd subを指したあと直前のEnd ifに移ります。その後Forに移って234以降の計算を始めます。どうしてEnd Subからこのような動作をするのかわかる方いらっしゃいましたら是非ワケを教えてください。よろしくお願いしますm(_ _)m
Const m As Integer = 3 '←取り出す個数
Const n As Integer = 5 '←サンプル数
Dim rStr As String
Dim mRow As Integer
Dim Nest As Integer
Dim A(10) As Variant
Sub combi()

Cells.ClearContents
mRow = 0
Nest = 0
combiPr (0)

End Sub
Sub combiPr(n1)
Dim mCol As Integer
For nn = n1 + 1 To n - m + Nest + 1

Nest = Nest + 1
A(Nest) = nn
If Nest = m Then
mRow = mRow + 1
For mCol = 1 To m
Worksheets(1).Cells(mRow, mCol).Value = A(mCol)
Next
Else
Call combiPr(nn)
End If

Nest = Nest - 1
Next nn
End sub

1,2,3,4,5の数列から3の数の組合せをワークシートに表示するプログラムを作っています。
このソースは以前他の質問に載っていたものを自分用に多少アレンジしたものです。構造は再帰呼び出しを使って、123、124、125、134、135、145、234、235…345という形で結果を出力します。いろいろと試してみて、計算結果は正しいとわかったのですが、デバックをしていて1つどうしても理解できないことがありました。計算結果が145から234になるとき、カーソルがSub combiPrのEnd subを指したあと直前のEnd ifに移ります。...続きを読む

Aベストアンサー

p1(プログラム1)がp2を呼び出し、p2がp3を呼び出し、という再帰呼び出しをビジュアルで書くと下。

p1始
p2始
p3始
p3終
p2終 
p1終

提示されたソースでいうと下(だと思う)。
組み合わせの1桁目をセットするプログラム(プロシージャ)をcombiPr1と書くことにする。
combiPr2が、combiPr3を呼び出しcombiPr3が答えを出力して終了(End Sub)、combiPr2のcombiPr3呼び出し行に戻る。

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング