Как исправить проблемы Left, Mid? Я получаю сообщение об ошибке «Несоответствие типов 13» в строке слева - PullRequest
0 голосов
/ 28 октября 2019

Я читаю строки из ячеек и разделяю их по началу их имени. Я использую функцию Left и сравниваю ее с началом, но я получаю

Ошибка 13 "Несоответствие типов"

Я нашел что-то в Интернете и здесь, как VBA Left(str, 2) но это тоже не работает.

Sub start()

Dim strprj As String
Dim LastRow, radek As Long

LastRow = Worksheets("PROJECT_OFFERSNDA").Range("A1").CurrentRegion.Rows.Count
For radek = 0 To LastRow - 1
    strprj = Worksheets("PROJECT_OFFERS-NDA").Range("A1").Offset(radek)
    If Left(strprj, 2) = "\\" Then
        MsgBox Str
    End If
Next radek
End Sub

1 Ответ

2 голосов
/ 28 октября 2019

Вы не можете получить несоответствие типов при вызове функции Left с этим кодом, потому что strprj гарантированно будет String:

Dim strprj As String

Если вы получаете несоответствие типов ошибка, она должна быть в этой строке:

strprj = Worksheets("PROJECT_OFFERS-NDA").Range("A1").Offset(radek)

Поскольку эта инструкция читает Variant и неявно приводит ее к String - это может быть успешным, еслиЯчейка содержит любое значение, которое может быть представлено в виде строки или может быть ошибочным с несоответствием типов в противном случае.

Это может произойти, если в ячейке, с которой вы читаете, содержится значение ошибки, например #VALUE!, #NA или #REF!.

Решение состоит в том, чтобы избежать чтения ячеек во что-либо, кроме Variant.

Dim cellValue As Variant
cellValue = Worksheets("PROJECT_OFFERS-NDA").Range("A1").Offset(radek).Value

, а затем для проверки того, что мы 'Вы просматриваете:

If Not IsError(cellValue) Then
    strprj = Left(cellValue, 2)
    '...
End If

Есть и другие проблемы:

LastRow = Worksheets("PROJECT_OFFERSNDA").Range("A1").CurrentRegion.Rows.Count

Это не обязательно надежно. Во-первых, вы не хотите разыменовывать этот лист каждый раз, когда он вам нужен. Вытащите его в локальную переменную:

Dim ws As Worksheet
Set ws = ActiveWorkbook.Worksheets("PROJECT_OFFERSNDA") '<~ ThisWorkbook? another workbook? Be specific!

Это также потенциальная проблема:

Dim LastRow, radek As Long

radek - это целое число Long, .... и LastRowявляется неявным Variant/Empty. И вам не нужно radek для еще нескольких строк, поэтому объявляйте это, когда вам это нужно. Получение последнего ряда обычно более надежно с Range.End, используемым снизу листа:

Dim lastRow As Long
lastRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

Dim radek As Long '<~ what's wrong with "currentRow"? why "radek"?
For radek = 0 To lastRow - 1
    '...
Next

Этот цикл сбивает с толку. Range.Offset сбивает с толку. Вам нужно знать, какую строку искать для отладки, и убедиться, что данные в порядке, но ничто в вашем коде не указывает прямо на этот номер строки.

Dim currentRow As Long
For currentRow = 2 To lastRow

    Dim cellValue As Variant
    cellValue = ws.Cells(currentRow, 1).Value

    If Not IsError(cellValue) Then

        Dim projectPath As String '<~ "strprj" wants more vowels, and "str" prefix is irrelevant!
        projectPath = cellValue

        If Left(projectPath, 2) = "\\" Then
            MsgBox projectPath
        End If

    Else
        Debug.Print "Row " & currentRow & " contains an error, cannot process."
    End If
Next
...