VB — разделить строку последовательных данных и отдельно войти в Excel

У меня есть строка данных в виде «X0507Y0512Z0413». Я использую VB для чтения данных с микроконтроллера pic и загружаю данные в excel с помощью сценария VB, найденного в Интернете. Я могу получить первую строку данных в первую ячейку моей электронной таблицы в форме, как указано выше. Однако я хочу разделить эту строку на три столбца X, Y и Z и удалить букву из начала каждой переменной. Он также должен был бы считывать до 20 секунд данных за раз, поэтому каждое значение нужно было бы добавлять к предыдущему. Вот мой скрипт VB до сих пор, я попробовал команду Split() и получил несоответствие типа Error 13.

Private Sub CommandButton3_Click()

   Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
   Dim lngStatus As Long
   Dim strData   As String
   Dim xyzData As String

   intPortID = 4
   lngStatus = CommRead(intPortID, strData, 1)
   xyzData = Split(strData, "X""Y""Z")
   Range("A2,B2,C2").Value = xyzData


End Sub

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

S.J

PS

Было бы проще, если бы каждая переменная была разделена запятой?


person Saran Jackson    schedule 04.04.2013    source источник
comment
Это не VB.NET, похоже на VB6   -  person Steve    schedule 05.04.2013


Ответы (1)


Первая проблема заключается в том, что xyzData устанавливается как строка. Поскольку вы заполняете его из Split, вам нужен массив:

Dim xyzData() as String

Я не могу придумать простой способ разбиения в VBA, поскольку вы каждый раз разбиваете по другому символу - для этого нужна специальная функция. Следующее работает - мой VBA немного заржавел, поэтому, возможно, его можно было бы сделать более аккуратным, но я думаю, что он работает:

Private Function SplitXYZ(strData As String) As String()

    Dim pos1 As Integer
    Dim pos2 As Integer
    Dim char As String
    Dim i As Integer

    Dim ret() As String
    Dim retCount As Integer
    ReDim ret(0)

    For i = 1 To Len(strData)

        'Get and check the character from the string
        char = Mid(strData, i, 1)
        If char = "X" Or char = "Y" Or char = "Z" Then

            'Set the positions for the new range
            pos1 = pos2
            pos2 = i

            'If the range is valid then add to the results
            If pos1 > 0 Then
                ReDim Preserve ret(retCount)
                ret(retCount) = Mid(strData, pos1 + 1, pos2 - pos1 - 1)
                retCount = retCount + 1
            End If

        End If
    Next i

    'Add any final string
    ReDim Preserve ret(retCount)
    ret(retCount) = Mid(strData, pos2 + 1, Len(strData) - pos2)

    SplitXYZ = ret


End Function

Использовать его так же просто, как:

Private Sub Test()

   Dim strData   As String
   Dim xyzData() As String

   strData = "X0507Y0512Z0413"
   xyzData = SplitXYZ(strData)

End Sub

Как вы затем используете разделенный массив, зависит от вас.

Еще одна вещь: если вы можете предположить, что каждая часть данных в вашей строке имеет одинаковую длину (т.е. 4 цифры с буквой впереди), то разбить строку по длине может быть проще, но вы не указали, что это случае, так что я не предполагал.

person Jon Egerton    schedule 04.04.2013
comment
Это работает, но нужно будет найти способ получить каждую разделенную строку в соответствующие ячейки, это не должно быть слишком сложно. Обновлю, когда будет результат. Хотел бы поблагодарить Джона Эгертона, ваш быстрый ответ и понимание были чрезвычайно полезны, я хвалю вас, спасибо. - person Saran Jackson; 10.04.2013