- ベストアンサー
共通の値を持つ座標の組み合わせについて
_Kyleの回答
- _Kyle
- ベストアンサー率78% (109/139)
#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 '--------↓ツヅク↓------------------
関連するQ&A
- エクセルVBAでVLookupを使って値を転記する
エクセル2003で商品の一覧表を作成しています。 Sheet1は商品一覧(左図) Sheet2は価格表(右図)となっています。 マクロを使用して、Sheet1のB列に価格表のデータを転記させたいと考えています。 VLookupになるのかと思い、自分でいろいろとやってみたのですが、 どうしても動作せず、挫折してしまいました。 商品一覧の最後の行までいって、空白セルがくると止まるというのが、 難しくてできませんでした。 どうかお願いいたします。
- ベストアンサー
- Visual Basic
- 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の勉強のために活かしたいく、よろしくお願いします。
- ベストアンサー
- その他MS Office製品
- エクセル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で解る方、よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセル 値が一致しないものを見つけたい
お世話になります。 エクセルで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列は空欄が無い状態=最終行以下は空白です。 よろしくお願い致します。
- ベストアンサー
- Visual Basic
- 【VBA】組み合わせの計算
VBAにてランダム(適当)な値10個の中で1.5に近い組み合わせを探し、それ以外の値を隣の列に移動させたいのですが、方法がわかりません。 どなたか教えてください
- ベストアンサー
- Excel(エクセル)
- 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:▲ 値:■
- ベストアンサー
- オフィス系ソフト
お礼
アドバイスありがとうございました。動かした状況、結果につきましては16番のコメントのお礼にてコメントさせていただきます。