我有一个必须每天导出的工作表,其中包含工作时间表。我想做的是在将.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))
答案 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)
(其中cell1
和cell2
是Range
对象,它们指定开始和结束单元格)来返回Range对象
按照这种逻辑,您实际上可以执行Range(Cells(1,1), Cells(1,1))
,但是同样,不必要地冗长/重复,我不希望使用此约定。