• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:共通の値をもつ座標の組み合わせについて)

共通の値を持つ座標の組み合わせについて

_Kyleの回答

  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.16

#11,13,15です。 ■>Private anAry(100000)の中の数値 お察しの通り、anAryは解を格納する配列で 100000は格納/出力可能な解の最大件数です。  ※Sample_18ではrtAryに名前が変わってます ReDim Preserve を使って 解を見つけるたびに拡げていく方法もありますが 速度的に遅いようなので予め最大件数を宣言しています。 ■>注意点などあれば まず 宣言した時点で要素数に応じたメモリを確保するので 大きな数を指定すると「メモリが足りません」 ってExcelに怒られるかもしれません。 それから シート上に解を表示する仕様ですから シートの行数以上を指定しても意味ありません。 ■>インデックスが有効範囲にありません 解が十万件超ですか。 (@_@) そういう場合、所要時間の大半が 探索時間ではなく書出時間だと思います。 「VBA⇒セル」の書出しは遅いので、 もし、#10さまのコードで 「C⇒テキスト」の書出しに成功すれば 書出時間の違いだけで逆転するかも、ですね。 ■>1の配置を割り振って 試しに書いてみたんですが… 胡乱というより【饂飩】になっちゃいました(T_T) しかも字数制限に引っ掛かるし orz ◎事前ソート ◎書出時に並び・出現順を再調整 ◎書出時に列数を切り詰めてから貼り付け ◎その他いろいろ ◆150×150/「1」5540コ/ランダム配置/解100493件 の場合で、総所要時間20秒ほどです。(うち書出時間10秒) なお 「ソート」は元々の配置がランダムな場合には ほとんど効果がありません。 「極端に時間がかかる場合に、並の時間で探索する」機能です。 以上ご参考まで。超長乱文,超長乱コード陳謝。<(_ _)> '--------↓ココカラ↓-------- Option Base 1 'Declare Function timeGetTime Lib "winmm.dll" () As Long '宣言-------------- Const tbSiz As Long = 150  Private orTbl(tbSiz, tbSiz) As Boolean  Private dtTbl(tbSiz, tbSiz) As Boolean  Private rsAry()       As Boolean  Private ckAry(tbSiz)    As Long  Private psAry(tbSiz)    As Long  Private odAry(tbSiz)    As Long  Private ctAry(tbSiz)    As Long  Private rtAry(300000)    As Variant  Private rsCnt        As Long  Private rtCnt        As Long  Private psCnt        As Long ' Private c          As Long ' Private t(0 To 3)      As Long   '親P-------------- Sub Sample_18()  '宣言-------  Dim orSht   As Worksheet  Dim rtSht   As Worksheet  Dim ckFlg   As Boolean  Dim i     As Long  Dim j     As Long  Dim k     As Long    '初期化----- ' t(0) = timeGetTime ' c = 0  Erase orTbl, dtTbl, ckAry, psAry, odAry, ctAry, rtAry  ReDim rsAry(tbSiz)  rtCnt = 0  rsCnt = 0  psCnt = 0    Set orSht = Worksheets("Sheet1") '元表シート  Set rtSht = Worksheets("Sheet3") '結果シート    '読込-------  For i = 1 To tbSiz - 1   For j = i + 1 To tbSiz    orTbl(i, j) = orSht.Cells(i + 1, j + 1).Value = 1    orTbl(j, i) = orTbl(i, j)   Next j  Next i    'ソート-----  For i = 1 To tbSiz   odAry(i) = i   orTbl(i, i) = True  Next i    For i = 1 To tbSiz   k = 0   For j = 1 To tbSiz    If orTbl(i, j) Then k = k + 1   Next j   ctAry(i) = k  Next i    Call Sample_s(tbSiz, -1, 1, tbSiz)  Call Sample_s(1, 1, 1, tbSiz \ 2)    '格納-------  For i = 1 To tbSiz   For j = 1 To tbSiz    dtTbl(i, j) = orTbl(odAry(i), odAry(j))   Next j  Next i    '準備-------  For i = 1 To tbSiz   ckFlg = False   For j = 1 To tbSiz    If i <> j And dtTbl(i, j) Then     ckFlg = True     Exit For    End If   Next j   rsAry(i) = ckFlg  Next i   ' t(1) = timeGetTime    '探索-------  Call Sample_r(1, tbSiz) ' t(2) = timeGetTime    '書出-------  If rtCnt > 0 Then Call Sample_d(rtSht) ' t(3) = timeGetTime    '終了-------  Application.StatusBar = False  Erase orTbl, dtTbl, ckAry, psAry, odAry, ctAry, rtAry, _     rsAry   ' Debug.Print timeGetTime - t(0), c, rtCnt, t(1) - t(0), _ '       t(2) - t(1), t(3) - t(2)   End Sub '子P-------------- Private Sub Sample_r( _  ByVal stIdx As Long, _  ByVal edIdx As Long) ' c = c + 1    '宣言-------  Dim tpAry() As Boolean  Dim tpCnt  As Long  Dim nxIdx  As Long  Dim lsIdx  As Long  Dim ckFlg  As Boolean  Dim i    As Long  Dim j    As Long  '主処理-----  For i = stIdx To edIdx   If rsAry(i) Then       tpAry = rsAry    rsCnt = rsCnt + 1    tpCnt = psCnt    ckFlg = True    ckAry(rsCnt) = i    nxIdx = tbSiz    lsIdx = 0        '先行き確認    For j = i + 1 To edIdx     If rsAry(j) Then      If dtTbl(i, j) Then       If j < nxIdx Then nxIdx = j       lsIdx = j      Else       rsAry(j) = False       ckFlg = False      End If     End If    Next j        '再帰    If lsIdx = 0 Then     Call Sample_c    Else     Call Sample_r(nxIdx, lsIdx)    End If        rsAry = tpAry    rsCnt = rsCnt - 1    psCnt = tpCnt    If ckFlg Then Exit Sub    rsAry(i) = False    psCnt = psCnt + 1    psAry(psCnt) = i       End If  Next i   End Sub '--------↓ツヅク↓------------------

jugyou1
質問者

お礼

アドバイスありがとうございました。動かした状況、結果につきましては16番のコメントのお礼にてコメントさせていただきます。

関連するQ&A

  • エクセルVBAでVLookupを使って値を転記する

    エクセル2003で商品の一覧表を作成しています。 Sheet1は商品一覧(左図) Sheet2は価格表(右図)となっています。 マクロを使用して、Sheet1のB列に価格表のデータを転記させたいと考えています。 VLookupになるのかと思い、自分でいろいろとやってみたのですが、 どうしても動作せず、挫折してしまいました。 商品一覧の最後の行までいって、空白セルがくると止まるというのが、 難しくてできませんでした。 どうかお願いいたします。

  • 2つの数字の組み合わせに対応する文字を返すコードを教えてください。

    すみませんがお知恵を拝借させてください。下のような表で,B列の値に0~3,C列の値に0~3のいずれかを入れたとき,2つの数字の組み合わせに対応するA列にある名前を返すコードを教えていただけませんか。  例えば,B列の値=2,C列の値=0のとき,「酒井」と出力したいのですが。 ※2つの数字の組み合わせに重複はありません。範囲は下に書いた10名分のみです。よろしくお願いいたします。  ----------------------------------------- B列の値:_ C列の値:_ A列  B列  C列 ------------------- 大田  3   0 酒井  2   0 三宅  2   1 坂下  1   0 原田  0   0 山内  0   1 山口  1   1 相馬  1   2 渡辺  0   2 安藤  0   3

  • 選択した行の値だけを合計

    選択した行の値だけを、その行のどのセルをダブルクリックしても合計する方法を教えてください。 A列は、ID,B・C列は値があらかじめ入力されています。 D列に、合計を表示させたいです。 関数・VBAでは、一括して合計はでましたが、VBAで必要な行だけの合計の出し方がわかりません。 VBAの勉強のために活かしたいく、よろしくお願いします。

  • エクセルVBAでのまとめ計算

     初めまして、よろしくお願いします。 データーで    A      B     C     D      E ・・・ 1              5     7      2 2              3     7      0 3 4              6     3      6 5              2     8      3 6              0     3      4 ・     ・      ・      ・      ・ ・     ・      ・      ・      ・ 100             3     4      5 という表がありますA列には(C列の値/(D列以降の平均値))をB列には(C列の値-(D列以降の平均値))を表示させたいと思います。たまに3行のような空白の行があります。関数式ではなく、VBAで解る方、よろしくお願いします。

  • 組合せVBA

    環境はExcel2002です A列に連番数字1から100が入力されていて B列の100行には数字のデータがあるとします ある目的の数値Xに一番近くなるB列の組合せをC列に表示したいのです…VBAで B列に表示するのはA列の連番です 『一番近くなる』の意味は2通りあって、両方の算出方法をご教示願います (1)目的の数値Xを絶対超えないで目的の数値Xに一番近くなる組合せ (2)目的の数値Xを必ず超えて目的の数値Xに一番近くなる組合せ

  • エクセル 値が一致しないものを見つけたい

    お世話になります。 エクセルでA列B列にそれぞれ数値が入っている表があり、A列にはあってB列にはない数値を分かるようにしたいと思っています。      A列  B列   C列 1行目  1   1 2行目  1   5 3行目  4   0   4 4行目  5   1    5行目  1   0   1 ・A1、A2、A5の値が1であるように、A・B列とも重複する数値が入ることがあります。 ・A列とB列の値は1対1で対応し、例えばA1がB1と対応するならA2はB4と対応します。 この表ではA3、A5に対応する値がB列にないので、C列にその値を表示させています。 ・一致しない数字を分かるようにする方法にこだわりはなく、例のようにC列に値や×を表示させる、A列に色をつける、一致するものがあった数値は削除する等、なんでも構いません。 お分かりになる方、どうぞよろしくお願いいたします。

  • 【エクセル】歯抜けの空白欄に上段と同じ値を入れたい

    エクセル(2010)で ある表に ところどころ空欄があり、 そこに上段と同じ値を入れたいです。 随時発生する作業のため マクロ(もしくはVBA)が組めればと考えておりますが、 初心者につき、ご教示いただけますでしょうか。 A列:項番 B列:大項目 C列:中項目 D列:小項目 E列:備考 ※1行目:項目名、2行目以降:値 という表で、 A列のナンバリング・D列の小項目 以外は 上と同じ扱いとなるため空欄となってしまっていますが、 アクセス(DB)に取り込むため、空欄の無い形にしたいのです。 ※ちなみに、A列・D列は空欄が無い状態=最終行以下は空白です。 よろしくお願い致します。

  • 【VBA】組み合わせの計算

    VBAにてランダム(適当)な値10個の中で1.5に近い組み合わせを探し、それ以外の値を隣の列に移動させたいのですが、方法がわかりません。 どなたか教えてください

  • Excel VBAにて座標読み込み・配置

    当方、Excel VBAに関しては全くのド素人でございます。 お客さんに頼まれて、次のことをやりたいのですが、どうしたらよいか途方に暮れています。 (-50,-50)~(50,50)までの2mピッチの合計2601個のxyz座標データ(txt)をSheetに読み込み。 A列=x B列=y C列=z そしてAD列・26行のセルを座標(0,0)として、セルにz値を展開したいのです。 横軸=x 縦軸=y BC列・1行が(50,50) E列・51行が(-50,-50) 以上のことをExcel VBAでやりたいのですが・・・ 可能でしょうか? 宜しくお願いします。

  • エクセルVBA 変数Aと変数Bの組み合わせに対応する値を返すコード

    ワークシート上に次の表があり,この表をもとにして,変数A(0~4)と変数B(0~4)の組み合わせに対応するC列の値を返すコードは,どう書いたらよいでしょうか。  例えば,変数Aのセルに●(4),変数Bのセルに▲(0)と入力したら,値のセルに■(5)と表示させたいのです。  どなたか教えていただけませんか。 A列  B列  C列  4   0   5  3   1   4  3   0   5  2   2   3  2   1   4  2   0   4  1   3   2  1   2   2  1   1   3  1   0   3  0   4   1  0   3   1  0   2   2  0   1   3  0   0   3 変数A:● 変数B:▲ 値:■