|
▼Hirofumi さん:
>>そのまま併用してテストしてみましたが、かなり速いです
>>しかし現状65536行まで今は、満たすデータが手元に無く
>>しっかり試したわけでわないです。
>
>先ず元々のコードの確認をして置きます
>元のコードでは、品番と納期をKeyとして、このKeyが等しい行が合った場合
>その行の計画数を合計して、Key重複の行を削除すると言う動作ですね?
>一応、当方のコードは、この様に組んだつもりです
>ただ、実際のデータで試して居ないので、結果が希望通りに出て居るのかを良く検証して下さい
>また、このコードは、シート最終行から上にデータ最終行を探しているので
>原理上、扱えるデータの最大行は65535行に成りますので宜しく
>
>>1.再度質問したいのですがこれは、行数が、追加されてもこの速さ維持できますか??。
>
>此れに就いてはどう言う意味なのか解りませんが?
>先ず、元のコードに就いて言うと、最後の方で
>「オートフィルターで空白以外のセルを絞り込む」の後、抽出された行をCopy、Pasteして居ます
>この時、データ行数が多い場合Excelがエラーを出している様です(連続しない範囲が8192?箇所を超える)
>此れが、フリーズした様に見える若しくはしている様です
>実際、Testデータとして、61503行(内Keyに就いての重複20000行)のデータを用意して
>Win98、Excel2000、メモリ256Mで実行した場合はフリーズ
>Vista、Excel2007、メモリ2Gで実行した場合も1時間たっても終了しないので実行中止の状態でした
>また、当方のコードで同じデータでTestした結果は
>Win98、Excel2000、メモリ256Mで実行した場合は、10秒〜16秒程度で完了している様です
>Vista、Excel2007の場合、2秒弱?
>
>>2.素人に近い私ですので、この構文が理解できない部分がかなりあります。
>>どういう流れの処理か簡潔に教えていただけないでしょうか?
>
>フローは、
>1、データの行数を取得
>2、データ最終列の後ろの列(E列)に先頭〜最終行までの連番を振ります
>3、データを品番順の納期順で整列します
>4、データを上から見て行って、前の行と品番が等しく且つの納期が等しい場合
> 計画数を、品番、納期の同値先頭行に加算て行きます
> 同時に、同値の場合、2で振った連番を消し(削除する印を付ける)、
> 削除する行数をカウントします
> ただ、連番の消去は直接セルに対して行わず、配列上で行ってLoop後にE列に再出力を行います
>5、この作業が終わった所で、連番列(E列)をKeyとして全体を整列します
>6、整列すると、連番を消去して行はデータの下に集まります
>7、データ行の後ろから、カウントした削除行数分行削除を行います
>以上
>
>>3.もしこのままの速さで維持できるならばこのまま使わせていただきたいのですが・・・?
>結果が合うなら、使って下さい(コード理解する努力も行って下さい)
>
>
>後、B列の日付の書式設定を忘れていましたので以下の★印を追加して下さい
>
> '列幅の調整
> .Parent.Columns.AutoFit
> 'B列の書式設定
> .Offset(, 1).Resize(lngRows).NumberFormat = "yyyy/m/d" '★追加
> End With
>
>Wayout:
度々質問する形で申し訳ありません理解した上で使わせていただきたいので
下記内容をおしえてください
1.lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row + 1
A列のデータ範囲を示しているのはなんとなくわかるのですが少しわからないです?
たとえば1000行データがある場合1000行-1-999-2=997行のデータ範囲という事でしょうか???
2. DataSort rngList.Resize(lngRows, clngColumns + 1), vntKeys, vntOrders
データ範囲を並べ替えしているコードみたいですが、後のvntkeysとvntOrdersのところで
vntKeysが二次元配列の変数が格納vntOrders動的配列の変数のようですが、考えてもわからず
?です
3.
If vntTop(1, vntKeys(j) + 1) <> vntData(1, vntKeys(j) + 1) Then
vntTop vntDateがバリアント型で宣言されているので配列なのはなんと無くわかるのですが1行目はそのままで列の所を0〜インデックスの最大値までカウントさせて+1させてそれぞれ比較しているところのイメージがつかめません?
4.
vntKeys = Array(0, 1)
A列B列をそれぞれ二次元配列でvntKeysに格納しているという解釈でいいのでしょうか?
5.
vntItems(lngStart + 1, 1) _
= vntItems(lngStart + 1, 1) + vntData(1, clngItems + 1)
A列とB列(品番/納期)が同じ場合数量を足す形だと思うのですが?
i = 1 To lngRows’///1〜データ範囲
vntData = rngList.Offset(i).Resize(, clngColumns).Value
’///配列VntDateにセルA1(1〜データ範囲に移動(カウント)).範囲指定(,4列右までの範囲(E列)).の値
を格納している
と解釈しているのですが?この構文だと1レコードすべて同じ場合つまりロットNO(D列)
の値も一緒ではないと合計をしない形におもえています。
ロット番号も同じデータはなく品番納期のみダブります。
その部分の計画数を合計した形にしたいのですが・・・・・?
|
|