Range(cells(x,y))。copy抛出错误1004

时间:2019-06-25 17:05:03

标签: excel vba

我有一个必须每天导出的工作表,其中包含工作时间表。我想做的是在将.csv文件中的数据复制到我的工作簿之前对其进行操作。对于任何给定的一天,该技术最多可以有1天的4个时间表。我正在尝试查找常规班次所在的列,并将其移至E列。

| Supervisor | Technician | On Duty? | Earliest Route Time | Shift 1 Type | Shift 1 Start | Shift 1 End | Shift 2 Type | Shift 2 Start | Shift 2 End |
|------------|------------|----------|---------------------|--------------|---------------|-------------|--------------|---------------|-------------|
| Harold     | Doug       | No       |                     | Meetings     | 8:00 AM       | 9:30 AM     | Regular      | 9:30 AM       | 4:30 PM     |
| Harold     | Greg       | No       |                     | Meetings     | 8:00 AM       | 9:30 AM     | Regular      | 9:00 AM       | 4:30 PM     |
|            |            |          |                     |              |               |             |              |               |             |

我尝试从(Why does Range work, but not Cells?)实现解决方案 还有另一个,但我似乎已经丢失了。

    Sub test_cell()
    Dim sh1 As Worksheet
    Dim x as Integer
    Dim col as Integer

    For Each w In Workbooks  'loop through open workbooks
        If w.Name = "tech_shifts_now.csv" Then
            w.Activate

            Sheets("tech_shifts_now").Select
            Set sh1 = ActiveWorkbook.Sheets("tech_shifts_now")

            x = 3
            If Cells(x, 5) <> "Regular" Then
                With sh1
                    .Range(.Cells(x, 5), .Cells(x, 7)).Copy Destination:=.Range(.Cells(x, 17))  'Move current data to Q
                End With
                'Range("E" & x & ":G" & x).Copy Range("Q" & x)

                'Find the column that regular shift is in
                Rows(x).Find(What:="Regular", LookIn:=xlFormulas, _
                    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                    MatchCase:=False, SearchFormat:=False).Activate

                'get the columns number
                col = ActiveCell.Column

                'copy the data for regular to Column E
                Range(Cells(x, col), Cells(x, col + 2)).Copy Destination:=Range(Cells(x, 5))

                'Copy for Column Q to where we just removed the Regular data from
                Range("Q" & x & ":S" & x).Copy Range(Cells(x, col))
            End If
        End If
    Next w
    End Sub

到达error 1004 Method Range of Object _worksheet failed时,我收到.Range(.Cells(x, 5), .Cells(x, 7)).Copy Destination:=.Range(.Cells(x, 17))

1 个答案:

答案 0 :(得分:1)

您的目的地有误。它应该只是.Cells(x, 17)。或者,.Range(.Cells(x, 17).Address)

Range(Cells(x, col), Cells(x, col + 2)).Copy Destination:=.Cells(x, 17)

为什么? Range object至少有两个构造函数,没有明确地这样声明。如果您使用一个单个参数调用Range,则假定是这样(加重音):

  

使用Range(arg)(其中arg 命名范围)返回代表单个单元格或单元格范围的Range对象

在这里,Range(<something>)需要一个标识范围的字符串,例如Range("A2")Range("Some_Named_Range")等。

当您通过Range(Cells(1,1))时,将对内部(Cells(1,1),本身就是Range)进行评估。由于单细胞Range可以(通常)从其String属性隐式转换为Value,但是由于(通常)不是有效引用,因此会发生错误。 / p>

如前所述,您可以做:Range(Cells(1,1).Address),但我认为这很丑,即使有效。

Range确实有一个接受两个 Range参数的构造函数,但是您正在向该构造函数传递Range对象,该对象期望 ONE < / strong> String参数。隐式转换是在后台进行的,您会遇到难以解决的错误:)

  

使用Range(cell1, cell2)(其中cell1cell2Range对象,它们指定开始和结束单元格)来返回Range对象

按照这种逻辑,您实际上可以执行Range(Cells(1,1), Cells(1,1)),但是同样,不必要地冗长/重复,我不希望使用此约定。