Я хотел бы проанализировать строки, используя основанную на строках VBA-функцию. Строки импортируются из CSV-файла, где данные поля инкапсулированы между двумя "-символами". Строки хранятся в столбце [A] рабочего листа "SO".
Функция "Parse_Str" анализирует строка, хранит данные в одномерном массиве и предоставляет логический результат, хранящийся в столбце [B]. Он имеет два аргумента:
1. строка для анализа
2. адрес первой ячейки, где диапазон должен быть сохранен в
[A] [B]
"001","Name 1","Descripton 1" =Parse_Str(A2; adres(rij(C2); kolom(C2)))
"002","Name 2","Descripton 2" =Parse_Str(A3; adres(rij(C3); kolom(C3)))
"003","Name 3","Descripton 3" =Parse_Str(A4; adres(rij(C4); kolom(C4)))
"004","Name 4","Desc 4","Rem 4" =Parse_Str(A5; adres(rij(C5); kolom(C5)))
Во время выполнения функции массив сохраняется в диапазоне, начинающемся с C2, C3, C4 и c. Желаемый вывод:
[B] [C] [D] [E] [F]
TRUE 001 Name 1 Description 1
TRUE 002 Name 2 Description 2
TRUE 003 Name 3 Description 3
TRUE 004 Name 4 Desc 4 Rem 4
Исходный код:
Option Explicit
Sub test()
Dim i As Integer
Dim s_SRCE As String, s_DEST As String
Dim b As Boolean
Dim r As Range
'Clear destination fields
Worksheets("SO").Range("C2", "F5").Value = ""
For i = 2 To 5
Set r = Worksheets("SO").Range("A" & i)
s_SRCE = r.Value
s_DEST = Worksheets("SO").Range("C" & i).Address
'Parse string and fill destination fields
b = Parse_Str(s_SRCE, s_DEST)
Next i
End Sub
Function Parse_Str(s_TRN As String, s_ADR As String) As Boolean
Dim i As Integer, n As Integer, p As Integer, q As Integer
Dim r As Range
Dim a() As String
'Replace combinations of comma and double qoutes by '|'
s_TRN = Replace(Replace(Replace(Replace(Replace(s_TRN & ",", "0000000000", ""), """,""", "|"), ",""", "|"), """,", "|"), """", "")
'Get number of fields
n = Len(s_TRN) - Len(Replace(s_TRN, "|", ""))
ReDim a(1 To n)
'Parse string to array
p = 1
For i = 1 To n
q = InStr(p, s_TRN, "|")
a(i) = Mid(s_TRN, p, q - p)
p = q + 1
Next i
Set r = Worksheets("SO").Range(s_ADR)
Set r = r.Resize(1, n)
r.Value = a
Parse_Str = Worksheets("SO").Range(s_ADR).Value <> ""
End Function
Запуск подпрограммы «Test» обеспечивает требуемый вывод в листе «SO».
Однако, вызывая функцию «Parse_Str» из листа «SO», он не 't и приводит к # VALUE ошибкам в столбце [B].