为什么Left函数返回运行时错误'424'?

时间:2019-02-04 19:36:31

标签: excel vba

下面的代码应从一个单元格复制值,并将其前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

2 个答案:

答案 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只是一个值(类似于IntegerLong是一个值,但其中包含文本),并且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