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

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

_Kyleの回答

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

#11です。 #12さまのおっしゃるとおり、元データの並びによっては シートに何もなくても時間がかかる場合がありますね。 早合点の怪答で大変失礼いたしました。 ---------------------- お詫びというわけでもないんですが オリジナルコードを。(^^;;;;;;; まったく胡乱なコードで、 自分でも何やってるのか混乱気味ですが ダミーデータで何度かテストした感じでは #12さまのコードと同じ解が返るようです。 ※チェックのため  結果は【Sheet3】に返す仕様にしています。 ご参考まで。長乱コード陳謝。 '--------↓ ココカラ ↓------------------------ Option Base 1 'Declare Function timeGetTime Lib "winmm.dll" () As Long '宣言---------------------------------- Const mySiz As Long = 150  Private myDat(mySiz, mySiz) As Boolean  Private rsAry()       As Boolean  Private ckAry(mySiz)    As Long  Private psAry(mySiz)    As Long  Private anAry(100000)    As Variant  Private rsCnt        As Long  Private rtCnt        As Long ' Private c          As Long   '親P---------------------------------- Sub Sample_9()   '←お察しください^^;;;;  '宣言----------------------  Dim orSht As Worksheet  Dim rtSht As Worksheet  Dim ckFlg As Boolean  Dim i   As Long  Dim j   As Long  Dim k   As Long ' Dim t   As Long    '初期化--------------------  Erase myDat, ckAry, anAry, psAry  ReDim rsAry(mySiz)  rtCnt = 0  rsCnt = 0 ' t = timeGetTime ' c = 0    Set orSht = Worksheets("Sheet1") '元表シート  Set rtSht = Worksheets("Sheet3") '結果シート    '読込----------------------  For i = 1 To mySiz - 1   For j = i + 1 To mySiz    myDat(i, j) = orSht.Cells(i + 1, j + 1).Value = 1    myDat(j, i) = myDat(i, j)   Next j  Next i    '準備----------------------  For i = 1 To mySiz   ckFlg = False   For j = 1 To mySiz    If myDat(i, j) Then     ckFlg = True     Exit For    End If   Next j   rsAry(i) = ckFlg  Next i    '探索----------------------  Call Sample_s(0, 0, mySiz)    '書出----------------------  If rtCnt > 0 Then   Call Sample_d(rtSht)  End If    '終了----------------------  Application.StatusBar = False  Erase myDat, rsAry, ckAry, anAry, psAry ' Debug.Print timeGetTime - t, c, rtCnt   End Sub '子P---------------------------------- Private Sub Sample_s( _  ByVal itCnt As Long, _  ByVal psCnt As Long, _  ByVal lsCnt As Long _  ) ' c = c + 1    '宣言----------------------  Dim tpAry() As Boolean  Dim ckFlg  As Boolean  Dim i    As Long  Dim j    As Long  Dim k    As Long    '主処理?------------------   '何やってんだか最早自分でも… orz    For i = itCnt + 1 To lsCnt   If rsAry(i) Then    rsCnt = rsCnt + 1    ckAry(rsCnt) = i    tpAry = rsAry    ckFlg = True    If i < mySiz Then     k = i + 1    End If    For j = i + 1 To lsCnt     If rsAry(j) Then      If Not myDat(i, j) Then       rsAry(j) = False       ckFlg = False      Else       k = j      End If     End If    Next j    Call Sample_s(i, psCnt, k)    rsAry = tpAry    rsCnt = rsCnt - 1    If ckFlg Then Exit Sub    rsAry(i) = False    psCnt = psCnt + 1    psAry(psCnt) = i   End If  Next i    'チェック------------------  For i = 1 To psCnt   ckFlg = True   For j = 1 To rsCnt    If Not myDat(ckAry(j), psAry(i)) Then     ckFlg = False     Exit For    End If   Next j   If ckFlg Then Exit Sub  Next i    'ヒット--------------------  rtCnt = rtCnt + 1  anAry(rtCnt) = rsAry  If rtCnt Mod 100 = 1 Then   Application.StatusBar = rtCnt & "件"  End If   End Sub '書出P-------------------------------- Private Sub Sample_d(ByRef rtSht As Worksheet)  '宣言----------------------  Dim dpAry() As Variant  Dim i    As Long  Dim j    As Long  Dim k    As Long    ReDim dpAry(rtCnt, mySiz)  Application.StatusBar = "書き出し中"  '書出配列------------------  For i = 1 To rtCnt   k = 1   rsAry = anAry(i)   For j = 1 To mySiz    If rsAry(j) Then     dpAry(i, k) = j     k = k + 1    End If   Next j  Next i  '書出----------------------  Application.Calculation = xlCalculationManual  Application.ScreenUpdating = False  With rtSht   rtSht.Cells.ClearContents   rtSht.Cells(2, 2).Resize(rtCnt, mySiz).Value = dpAry  End With  Application.Calculation = xlCalculationAutomatic End Sub '--------↑ ココマデ ↑------------------------

jugyou1
質問者

お礼

プログラムコードありがとうございます。 実際に試しましたら、10分程度で終わりました。すごいと感じました。1の数およびパターンによって状況が変わるようですので、回答者様のアドバイスを参考に1の配置を割り振っていこうと思います。 ちなみに、Private anAry(100000)の中の数値を変化させることで出力できる件数が変えられるということでしょうか? 一応Private anAry(200000)にするとインデックスが有効範囲にありませんの表示がなくなったので伺いました。注意点などあれば教えていただけるとありがたいです。

関連する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:▲ 値:■