-2

我有一张包含以下数据的表格:

在此处输入图像描述

在此处输入图像描述

现在 Excel 共有 36 个任务,每个任务有 4 列。第一个任务 .ie Task1 名称将始终从 L 列开始。36 个任务已被描述为 144 列。现在我们需要逐行检查并检查 TNStart Start date < T(N+1) Start date.then 该行将被选为坏行。简而言之,当任务编号从 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 检索数据。CopyFromRecordset然后,您可以使用该方法非常简单地将数据导出到新的 Excel 电子表格。

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 中的示例)。

Google您的 朋友StackOverflow也是如此。

于 2012-12-17T09:50:55.060 回答