Почему функция Left возвращает ошибку времени выполнения «424»? - PullRequest
0 голосов
/ 04 февраля 2019

Приведенный ниже код должен копировать значения из ячейки и вставлять первые 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 голосов
/ 04 февраля 2019

Вам необходимо понять, как работают методы и операции присваивания.

Sh.Cells(i, 5) = Left(Sh.Cells(i, 5).Value, 10).Copy

Это назначение выражения левой стороны (LHS) Sh.Cells(i, 5).Value (через неявный элемент по умолчанию)call) значение, возвращаемое выражением правой части (RHS), однако RHS ничего не возвращает.

Left(Sh.Cells(i, 5).Value, 10)

Это выражение возвращает Variant/String длиной до 10 символов.В VBA String - это просто значение (как Integer или Long, за исключением того, что оно содержит текст), а значения в VBA не имеют методов-членов .

Так что вы не можете сделать это:

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

Но опять же, это излишне - вам не нужно включать буфер обмена здесь.

0 голосов
/ 04 февраля 2019

Я видел некоторые ошибки в коде, посмотрите:

  • 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...