InStr не найдет точки в некоторых случаях - PullRequest
1 голос
/ 29 марта 2019

У меня есть строки, которые состоят из начальных точек, за которыми следует число (например, "..2" или ".... 4". Я хочу удалить все начальные точки и преобразовать строку в длинную переменную. Итак, я написал функцию, которая находит ведущие точки в строках и удаляет их. По какой-то причине функция работает для строки типа "..2", но не работает для "... 3". Функция InStr не найдет "." в "... 3". Строки считываются из столбца на рабочем листе. Они не отформатированы каким-либо странным способом, я попытался просто ввести их вручную на новом листе без каких-либо изменений настроек форматирования по умолчанию, те же результаты.

Итак, я попробовал несколько вещей. Я считаю, что должна быть какая-то ошибка, связанная с кодировкой символов, но я не могу понять, как решить эту проблему. Я попытался использовать рекурсивную функцию, используя InStr для удаления точек, а затем попытался использовать функцию разделения с помощью «.» в качестве разделителя, чтобы проверить мое предположение. Split имеет ту же проблему, работает для "..2", но не будет работать для "... 3". Когда я отлаживаю, распечатываю строки, которые я зачитываю, «... 3», кажется, форматируется иначе, чем «..2» или «.1». Я не знаю почему. здесь вы можете увидеть разницу в форматировании

Sub Gruppieren()
'read out strings first
'then try to delete the dots
Dim strArr() As String
Dim lngArr() As Long
Dim lLastRow As Long
Dim i As Long

lLastRow = getFirstEmptyRow("A", Tabelle1.Index) 
ReDim strArr(1 To lLastRow)
ReDim lngArr(1 To lLastRow)

For i = 1 To UBound(strArr)
 strArr(i) = Worksheets(1).Cells(i, 1).Value
 Debug.Print strArr(i)
 strArr(i) = clearLeadingDots(strArr(i))
 'strArr(i) = splitMeIfYouCan(strArr(i))
 If IsNumeric(strArr(i)) = True Then
  lngArr(i) = CLng((strArr(i)))
  Debug.Print lngArr(i)
 End If
Next i
End Sub

'Функции:

Function clearLeadingDots(myText As String) As String
 Dim i As Long

 i = InStr(myText, ".")
  If i <> 0 Then
    myText = Right(CStr(myText), Len(myText) - i)
    clearLeadingDots = clearLeadingDots(CStr(myText))
  Else
    clearLeadingDots = CStr(myText)
    Exit Function
  End If
End Function

Function splitMeIfYouCan(myText As String) As String
 Dim myArr() As String
 Dim i As Long
 myArr = Split(myText, ".")

 splitMeIfYouCan = myArr(UBound(myArr))
End Function

Изменить: Ответ состоял в том, что три точки были автоматически преобразованы в многоточие, поиск и устранение Chr(133) сделали свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...