Excel VBAの質問です。

画像

Visual Basic127閲覧xmlns="http://www.w3.org/2000/svg">250

ベストアンサー

0

早期回答、誠にありがとうございます。どのように組み立ててあるのか、二晩考えても、いまだ良く分からない状態でが、修正して頂きたい点があります。 マクロ実行すると、添付資料のように、共通分析項目 0 の組み合わせが表示されます。これを 3 の分析項目がある組み合わせに変更して頂けないでしょうか。 実際には200ぐらいの分析項目があり、その中で3の数が多い石土砂の組み合わせを見つけ出す事が目的です。今後、任意に変更出来るように、『3の数が何個以上ある組み合わせを表示させる』とプログラミングして頂けると非常に助かります。 今回は『3の数が5個以上ある組み合わせを表示する』にしたいのですが、よろしくお願いいたします。 説明不足で大変申し訳ありませんでした。

画像

その他の回答(1件)

0

処理を分けるとできます。が、出力も別々に分けなければなりません。 私の場合(未完成)、各96行位が処理の限界(画面白くなった)でした。それを2つに分けて処理したところすんなり処理できました。方法は以下の通りですが、貴方のコードが分からないため概要だけ提示します。 以下は各行96行のものを48で分けたものです。この方法で実行すれば、数百行の処理ができると思われます。 各行が数百行の場合、もっと小分けにしなければならないのではないかと思います。小分け量を見つけるには試行錯誤で処理限界手前の行数を見つけなければなりません。その数値を今回は48としたものです(96でも問題ありませんでしたが敢えて48にしました)。また、各192行の場合は48のところが設定31で限界に近かったです。出力は4つに分けました(石の124行まで処理。125行目以降の残りは小分けしていないため処理していません)。これらを考えると、数百行の場合は設定は5~10行でもエラーになるかも知れません。そんな場合は「Sub test_1」を更に分けて「test_1_2, test1_3,・・・・」というふうに処理を分ければできます。但し、行数が大きすぎて、最初の設定が1行でも処理限界を超えた場合には、各行数を分割したファイルを作って対処する以外にないかと思います(この場合は組み合わせに漏れがでます)。なお、小分けする処理行設定は石のみです(土、砂はそのまま本処理で行っています。)。 ちなみに、私が作ったコードは未完成ですが、「3」のものが同じところに2つあった場合配列取得し、それを出力するもので、余分なものは出力しない方法です。本処理はDo~Loop型です。 ご参考までに。 Sub test_1() Dim i As Long Dim sh As String '出力シート名 Dim ii, r As Long '石の開始位置、石の最終行 For i = 1 To 2 If i = 1 Then sh = "合算1" ii = 1 '合算1に出力する開始位置 r = 48 '見つけた処理限界の行数 ElseIf i = 2 Then sh = "合算2" ii = 49 r = 96 '48の倍数 ・・・・ End If Call test_2(sh, ii, r) Next i End Sub 以下本処理 Sub test_2(ByVal sh As String, ByVal ii As Long, ByVal r As Long) ・・・・ End Sub

前述よりもっと良い方法を見つけました。 メモリを解放する方法です。 この方法では前述で小分けしていたものが一気に処理できると思い実験をしました。結果は、 各データ192行のものを処理し、石約80行で中断させましたが、それまでの処理が約15分かかり、その処理結果の行数は962562行に達していました(余分なものを出力しない方式なのですが)。石の半分までいかない処理(192行中80行)で、エクセルの最終行数1048576行近くまで達してしまいました。このことから、各行が数百行あるものをエクセルで処理するためには出力シートを変えながら進める必要がありそうです。そこまでは試していません。