2

尝试在 Excel 中运行 VBA amcro 时,我收到运行时错误 1004 - 此选择无效错误。

我四处寻找解决方案,到目前为止我尝试过的所有解决方案都没有成功(激活工作表,清除数据下方的行以确保有插入空间以及其他我不记得的空间)。

我正在尝试做的事情:

我们有一个数据集需要基于三列进行排序,不幸的是,内置排序无法按我们的意愿工作。三列是机器、班次和日期/时间。示例数据(按日​​期/时间排序):

Machine1  Days  02/05/2013 07:05
Machine2  Days  02/05/2013 07:05
Machine1  Days  02/05/2013 08:45
Machine1  Late  02/05/2013 15:05

我们希望对它进行排序,使其看起来像这样:

Machine1  Days  02/05/2013 07:05
Machine1  Days  02/05/2013 08:45
Machine2  Days  02/05/2013 07:05
Machine1  Late  02/05/2013 15:05

我的代码:

For rowCount = 4 To 5000
    On Error GoTo nextLoop
    Worksheets("Schedule").Activate
    If ActiveSheet.Cells(rowCount, 1).Value = "" Then
         Exit For
    End If
    If ActiveSheet.Cells(rowCount + 1, 1).Value = "" Then
         Exit For
    End If

    thisMachine = ActiveSheet.Cells(rowCount, 2).Value
    thisShift = ActiveSheet.Cells(rowCount, 4).Value
    thisDay = Mid(ActiveSheet.Cells(rowCount, 5).Value, 1, 10)

    pasteRow = rowCount + 1
    If ActiveSheet.Cells(rowCount + 2, 4).Value <> thisShift Then
        GoTo nextLoop
    End If

    For internalCount = rowCount + 1 To 5000
        If ActiveSheet.Cells(internalCount, 4).Value <> thisShift Then
            Exit For
        End If

        If Mid(ActiveSheet.Cells(internalCount, 5).Value, 1, 10) <> thisDay Then
             Exit For
        End If

        If ActiveSheet.Cells(internalCount, 2).Value = thisMachine Then
            Range(internalCount & ":" & internalCount).Cut
            Range(pasteRow & ":" & pasteRow).Insert
            pasteRow = pasteRow + 1
        End If
    Next internalCount
nextLoop:
Next rowCount

这适用于其中一个文件,但相同格式的另一个文件正在产生错误,并且调试会突出显示该行Range(pasteRow & ":" & pasteRow).Insert作为问题。

数据首先按日期/时间(未显示)排序,这也使班次按顺序排列。然后它遍历表格的每一行,对于每一行它检查它下面的每一行。如果下面的行包含同一天和同一班次并使用同一台机器,则该行将被剪切并粘贴到正在读取的当前行或粘贴的前一行下方 ( pasteRow)。这试图使机器保持时间顺序。如果日期或班次不匹配,则“内部”循环转义,程序移至下一行。

谁能明白为什么这会导致问题?或者为什么它适用于一组数据而不适用于第二组?

抱歉,如果不清楚,我已尽力解释,但很难用文字描述。

谢谢,

克里斯

4

1 回答 1

1

我认为您需要按Day ~> Shift ~> Machine ~> Time订购数据?

如果是这种情况,那么您将需要一个类似的 vba 代码来解决 Excel 2003 的限制,请参阅MrExcel了解更多详细信息:

Range("A1:J1000").Sort Key1:=Range("B2"), Order1:=xlAscending, _
    Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
    xlTopToBottom, DataOption1:=xlSortNormal  
Range("A1:J1000").Sort Key1:=Range("F2"), Order1:=xlAscending, Key2:=Range _
    ("G2"), Order2:=xlAscending, Key3:=Range("A2"), Order3:=xlAscending, _
    Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
    xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _
    DataOption3:=xlSortNormal
于 2013-05-10T11:16:27.477 回答