|
▼みかん さん:
★いったんアップしたレスを削除し、一部訂正して再度アップします。
そちらのコードをざっと読みました。
私の理解が正しければ、この処理に、配列からの一括転記はかなり無理ですね。
2次元配列の中身をセルに落とし込むときの絶対条件は、セル側が連続している
ということになります。なので、↑で、【連続している一部】を配列から抜き出して
一括転記するコードをアップしたんですが、今回のように4列とびの1列ずつを
別の列に転記するのは、無理ですねぇ。
(1列ずつの配列からの抜出と一括転記はできますが、意味がないですから)
それと、PasteSpecialでxlPasteFormulaとしていますね。
これに意味があるなら(つまりコピー対象領域に、本当に式があるなら)
たとえば元のセルに =A100+B100 といった式があったとして、それを配列に
式として取り込むことはできますが、別のセルに落とし込んでも =A100+B100
となります。PasteSpecialなら、例えば =E100+F100 となるべきところですね。
この意味でも配列に格納ーー>それを落とし込む ということは不可能になります。
もし、たまたま xlPasteFormula としているだけで、実際は値の転記でいいなら
話は別です。
つまり、BC列、BG列、BK列、。。。。のコピー対象行に式がないなら、この処理は
配列にセル領域から取り込み配列内で加工してシートに一挙に書き戻すということは
簡単に(↑でアップしたような INDEX関数処理を使わずとも)可能です。
ところで、もともとのコード自体に、ちょっと難なきにしもあらず。
Ws.Range(Cells(4, Ij(1) + 1), Cells(Maxrows, Ij(1) + 1)).Select
実は、このコードは【間違った書き方】です。
( ) の中の Cells は、実は Ws ではなく ActiveSheet の領域を指します。
その上にWs.Selectがあるので、この間違いが表に出ていませんが
日本語にすると、Wsの中の領域で、その詳細は ActiveSheetのここからここまで
という意味になります。なので、仮に ActiveSheetがWs ではなかったらデバッグ画面
が登場するところです。で、Ws.Selectだからいいだろうといいたいでしょうが、
それなら、 Ws.Range と、Wsで修飾する必要もなく、単に Range( と書けばいいんです。
(あぁ、私は Ws とつけるのは大変いいこと、というか必要なことだと思ってるんですよ)
そのほかにもループの中で毎回シート選択をするのは、いかがなものかとか、
変数Ijを配列にしている意味が全くないとか エトセトラ エトセトラ。
|
|