Excel 范围(单元格(x,y))。复制抛出错误1004

Excel 范围(单元格(x,y))。复制抛出错误1004,excel,vba,Excel,Vba,我有一个工作表,我必须每天导出,其中包括工作计划。我试图做的是在将.csv文件复制到工作簿之前操作该文件中的数据。对于任何给定的一天,技术人员一天最多可以有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

我有一个工作表,我必须每天导出,其中包括工作计划。我试图做的是在将.csv文件复制到工作簿之前操作该文件中的数据。对于任何给定的一天,技术人员一天最多可以有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     |
|            |            |          |                     |              |               |             |              |               |             |
我已尝试从()实施解决方案 还有一个,但我好像把它弄丢了

    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
子测试单元()
Dim sh1作为工作表
作为整数的Dim x
作为整数的Dim col
通过打开工作簿的工作簿循环中的每个w
如果w.Name=“tech\u shifts\u now.csv”,则
w、 激活
工作表(“技术轮班”)。选择
Set sh1=ActiveWorkbook.Sheets(“技术轮班”)
x=3
如果单元格(x,5)“常规”,则
与sh1
.Range(.Cells(x,5),.Cells(x,7))。复制目标:=.Range(.Cells(x,17))'将当前数据移动到Q
以
'范围(“E”&x&“:G”&x)。复制范围(“Q”&x)
'查找常规shift所在的列
行(x).Find(What:=“Regular”,LookIn:=xlFormulas_
查看:=xlPart,搜索顺序:=xlByRows,搜索方向:=xlNext_
匹配案例:=False,搜索格式:=False)。激活
'获取列数
col=ActiveCell.Column
'将常规数据复制到列E
范围(单元格(x,列),单元格(x,列+2))。复制目标:=范围(单元格(x,列+5))
'将Q列复制到刚才从中删除常规数据的位置
范围(“Q”&x&“:S”&x)。复制范围(单元格(x,列))
如果结束
如果结束
下一个w
端接头

当工作表到达
.Range(.Cells(x,5),.Cells(x,7))时,我收到
错误1004对象的方法范围\u工作表失败。
。复制目标:=.Range(.Cells(x,17))
您的目标错误。它应该是
.Cells(x,17)
。或者,
.Range(.Cells(x,17).Address)

为什么??至少有两个构造函数没有显式调用。如果使用单个参数调用
Range
,则假定为(添加了强调):

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

在这里,
Range()
需要一个字符串来标识一个范围,比如
Range(“A2”)
Range(“一些被命名的范围”)

当您通过
范围(单元格(1,1))
时,将计算内部部分(
单元格(1,1)
,它本身就是一个
范围
)。由于单个单元格的
范围
可以(通常)从其
属性隐式转换为
字符串
,但由于这(通常)不是有效的引用,因此会发生错误

如前所述,您可以这样做:
Range(单元格(1,1).Address)
,但我认为这有点难看,即使是有效的

Range
确实有一个接受两个
Range
参数的构造函数,但您正在将
Range
对象传递给需要一个
字符串
参数的构造函数。隐式转换发生在引擎盖下,您将遇到一个难以排除的错误:)

使用
Range(cell1,cell2)
,其中
cell1
cell2
是指定起始单元格和结束单元格的
Range
对象,以返回范围对象


按照这个逻辑,你实际上可以做
范围(单元格(1,1),单元格(1,1))
,但同样,不必要的冗长/重复,我不喜欢这个约定。

你的目的地是错误的。它应该是
.Cells(x,17)
。或者,它
.Range(.Cells(x,17).Address)
。但前者更好,谢谢。我知道我少了一点东西。。工作起来很有魅力。我感谢你的快速回复。。。你想把你的回答作为一个答案,这样我就可以标记它完整吗?或者我应该用你的答案来更新代码,并将其标记为完成?当然,我还添加了一些详细信息,解释了为什么它不能以这种方式工作。干杯
Range(Cells(x, col), Cells(x, col + 2)).Copy Destination:=.Cells(x, 17)