-2

以下のようなデータを含むシートがあります。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

現在、Excelには合計36のタスクがあり、各タスクには4つの列があります。最初のタスク.ieTask1の名前は、常にL列から開始されます。36のタスクが144の列に記述されています。次に、行ごとに調べて、TNStart開始日<T(N + 1)開始日かどうかを確認する必要があります。そうすると、その行が不良行として選択されます。簡単に言うと、タスク番号が1から36に増える場合、開始日はそれぞれ昇順である必要があります。それが失敗した場合は、行を不良データとしてマークする必要があります。

ファッショナブルな方法でこれを行うためにここで私を助けてくれませんか?

Option Explicit

Dim objExcel1
Dim strPathExcel1
Dim objSheet1,objSheet2
Dim IntRow1,IntRow2
Dim ColStart

Set objExcel1 = CreateObject("Excel.Application")'Object for Condition Dump

strPathExcel1 = "D:\AravoVB\Copy of Original   Scripts\CopyofGEWingtoWing_latest_dump_21112012.xls"
objExcel1.Workbooks.Open strPathExcel1
Set objSheet1 = objExcel1.ActiveWorkbook.Worksheets(1)
Set objSheet2 = objExcel1.ActiveWorkbook.Worksheets("Bad Data")

objExcel1.ScreenUpdating = False
objExcel1.Calculation = -4135  'xlCalculationManual

IntRow2=2
IntRow1=4
Do Until IntRow1 > objSheet1.UsedRange.Rows.Count
    ColStart = objExcel1.Application.WorksheetFunction.Match("Parent Business Process ID", objSheet1.Rows(3), 0) + 1 
    Do Until ColStart > objSheet1.UsedRange.Columns.Count And objSheet1.Cells(IntRow1,ColStart) = ""
        If objSheet1.Cells(IntRow1,ColStart + 1) > objSheet1.Cells(IntRow1,ColStart + 5) and objsheet1.cells(IntRow,ColStart + 5) <> "" Then
            objSheet1.Range(objSheet1.Cells(IntRow1,1),objSheet1.Cells(IntRow1,objSheet1.UsedRange.Columns.Count)).Copy
            objSheet2.Range(objSheet2.Cells(IntRow2,1),objSheet2.Cells(IntRow2,objSheet1.UsedRange.Columns.Count)).PasteSpecial
            IntRow2=IntRow2+1
            Exit Do
        End If
        ColStart=ColStart+4
    Loop

    IntRow1=IntRow1+1
Loop

objExcel1.ScreenUpdating = True
objExcel1.Calculation = -4105   'xlCalculationAutomatic

パフォーマンスが悪い

私のシートは2000行で、不正なデータ選択基準は144列になっています。現在、出力は25分後に表示されるため、全体的なパフォーマンスが向上します。したがって、より高速なものにすることで、皆さんに助けを求めています。

悪い行を別のシートに対処しているときにも可能ですか?また、悪い列を赤でマークします

4

1 に答える 1

4

ADODBを介してExcelスプレッドシートに接続し、SQLを使用してデータを取得することをお勧めします。次に、このメソッドを使用して、データを新しいExcelスプレッドシートに非常に簡単にエクスポートできますCopyFromRecordset

Option Explicit

Dim conn, cmd, rs
Dim clauses(34), i
Dim xlApp, xlBook

Set conn = CreateObject("ADODB.Connection")
With conn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "Data Source=""C:\path\to\excel\file.xlsx"";" & _
        "Extended Properties=""Excel 12.0;HDR=Yes"""

    'If you don't have Office 2007 or later, your connection string should look like this:
    '.ConnectionString = "Data Source=""C:\path\to\excel\file.xls"";" & _
    '    "Extended Properties=""Excel 8.0;HDR=Yes"""

    .Open
End With

For i = 0 To 34
    clauses(i) = "[Task" & i + 1 & " Start Date] < [Task" & i + 2 & " Start Date]"
Next

Set cmd = CreateObject("ADODB.Command")
cmd.CommandText = "SELECT * FROM [WorksheetName$] WHERE " & Join(clauses, " OR ")
cmd.ActiveConnection = conn
Set rs = cmd.Execute

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Add
xlBook.Sheets(1).Range("A1").CopyFromRecordset cmd.Execute

C:\path\to\excel\file.xlsxおよびWorksheetNameを適切な値に 置き換えます。


更新しました

いくつかのリンク:

VBScript /WSH/スクリプトランタイム

ADODB-ActiveXデータオブジェクト

オフィスクライアントの開発

MSDNのサンプルの多くは、VBAまたはVB6を使用しています。VBA / VB6をVBScriptに移植するための簡単な紹介については、こちらを参照してください。覚えておくべき主なポイントは、これらのトピックのほとんど(ADODB、Excel、スクリプトランタイム)はVBScript固有ではないということです。これらはCOM対応言語で使用できるオブジェクトモデルであり、使用法は非常によく似ています(Pythonの例についてはこちらを参照してください)。

StackOverflowと同様に、Googleあなたの 友達です。

于 2012-12-17T09:50:55.060 に答える