Вы не можете получить несоответствие типов при вызове функции 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