下面的代码应从一个单元格复制值,并将其前10个字符粘贴到该范围内的同一单元格中。在这一行:
Sh.Cells(i, 5) = Left(Sh.Cells(i, 5).Value, 10).Copy
我收到运行时错误“ 424”(需要对象)。在该行之前添加“ set”不起作用。有谁知道为什么在这里触发错误?
Sub fixCellsValue()
Dim wrk As Workbook
Dim Sh As Worksheet
Dim SourceFolder As String
Dim i As Long, lastrow As Long
SourceFolder = ThisWorkbook.PATH & "\source"
If Dir(SourceFolder & "Filename.*") <> "" Then
Set wrk = Application.Workbooks.Open(SourceFolder & "\Filename.xlsx")
Set Sh = wrk.Worksheets(1)
lastrow = Sh.Cells(Sh.Rows.Count, "A").End(xlUp).row
For i = 2 To lastrow
If Len(Sh.Cells(i, 5)) > 10 Then
Sh.Cells(i, 5) = Left(Sh.Cells(i, 5).Value, 10).Copy
Sh.Cells(i, 5).PasteSpecial Paste:=xlPasteValues
Sh.Cells(i,5).Interior.ColorIndex = 6
End If
Next i
End If
End sub
答案 0 :(得分:5)
您需要了解方法和赋值操作的工作原理。
Sh.Cells(i, 5) = Left(Sh.Cells(i, 5).Value, 10).Copy
这是为左侧(LHS)表达式Sh.Cells(i, 5).Value
(通过隐式默认成员调用)分配右侧(RHS)表达式返回的值-但是RHS不返回任何值
Left(Sh.Cells(i, 5).Value, 10)
该表达式返回一个Variant/String
,最多10个字符。在VBA中,String
只是一个值(类似于Integer
或Long
是一个值,但其中包含文本),并且VBA中的值没有 member方法。
所以您不能这样做:
Debug.Print "ABC".Copy
因为成员调用需要一个对象-因此,需要对象。
丢弃.Copy
成员调用,即可解决此错误。
Sh.Cells(i, 5).PasteSpecial Paste:=xlPasteValues
从技术上讲,这是多余的-通过直接分配单元格的Value
可以做到这一点。但是,如果您想调用Range.Copy
,则不能将其作为RHS表达式的一部分,因为Range.Copy
不会返回任何内容-因此您将执行以下操作:
Sh.Cells(i, 5).Copy
Sh.Cells(i, 5).PasteSpecial Paste:=xlPasteValues
但是再说一次,这是多余的-您无需在此处使用剪贴板。
答案 1 :(得分:1)
我在代码中看到了一些错误,看:
If Dir(SourceFolder & "Filename.*") <> "" Then
:代码末尾没有结尾。
Sh.Cells(i, 5) = Left(Sh.Cells(i, 5).Value, 10).Copy
:最后不需要.copy
,您已经在设置值。
最后,您应该具有如下代码:
Sub fixCellsValue()
Dim wrk As Workbook
Dim Sh As Worksheet
Dim SourceFolder As String
Dim i As Long, lastrow As Long
SourceFolder = ThisWorkbook.PATH & "\source"
If Dir(SourceFolder & "Filename.*") <> "" Then
Set wrk = Application.Workbooks.Open(SourceFolder & "\Filename.xlsx")
Set Sh = wrk.Worksheets(1)
lastrow = Sh.Cells(Sh.Rows.Count, "A").End(xlUp).row
For i = 2 To lastrow
If Len(Sh.Cells(i, 5)) > 10 Then
Sh.Cells(i, 5) = Left(Sh.Cells(i, 5).Value, 10)
Sh.Cells(i,5).Interior.ColorIndex = 6
End If
Next i
End If
End sub