У меня есть фрагмент кода, который используется для разделения текста в ячейке. Данные выводятся программой опроса, которая не использует никакого полезного разделителя, поэтому, к сожалению, преобразование текста в столбцы мне не поможет.
Я написал этот фрагмент кода, но оказалось, что результаты в двух случаях различны.
Я запускаю код шаг за шагом, пока не добавится первый столбец, а затем дождусь его завершения
Я запускаю код из меню выполнения макроса
В первом случае вывод такой, каким я его задумал. После столбца с заголовком Crop: XXX
(который содержит необработанные данные, которые необходимо разделить) имеются столбцы для каждой отдельной записи, пронумерованной от 1 до X. Данные из каждой строки начинают разделяться в столбце X и затем перемещаются до Есть записи. Как это:
| Crop XXX | 1 | 2 | 3 | 4 |
|-------------|----|----|----|----|
| X1,X2,X3 | X1 | X2 | X3 | |
| X1,X2,X3,X4 | X1 | X2 | X3 | X4 |
Во втором случае все столбцы имеют номер 1, и каждая новая строка вводит свои данные перед данными предыдущей строки. Вроде таких:
| Crop XXX | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
|-------------|----|----|----|----|----|----|----|
| X1,X2,X3 | | | | | X1 | X2 | X3 |
| X1,X2,X3,X4 | X1 | X2 | X3 | X4 | | | |
Код, который я использую для ввода и нумерации этих столбцов, таков:
If Not UBound(inarray) = 0 Then
For i = UBound(inarray) To LBound(inarray) Step -1
If ws.Cells(1, col + i).Value = i Then
If i = UBound(inarray) Then
Exit For
End If
col_to_add = col + i + 1
Exit For
Else
addcol = addcol + 1
End If
col_to_add = col + i
Next i
If Not i = UBound(inarray) Then
col1 = ConvertToLetter(col_to_add)
col2 = ConvertToLetter(col_to_add + addcol - 1)
ws.Columns(col1 & ":" & col2).Insert shift:=xlToRight
End If
If Not addcol = 0 Then
For j = 1 To addcol
If col_to_add = col + j Then
If j = 1 Then
ws.Cells(1, col_to_add) = 1
Else
ws.Cells(1, col_to_add + j - 1) = Cells(1, col_to_add + j - 2).Value + 1
End If
Else
ws.Cells(1, col_to_add + j - 1) = Cells(1, col_to_add + j - 2).Value + 1
End If
Next j
End If
For k = UBound(inarray) To LBound(inarray) Step -1
ws.Cells(row, col + k) = inarray(k)
Next k
End If
В этом примере Inarray()
- это массив 1d, содержащий следующие значения для первой строки:
| Inarray() | Value |
|-----------|-------|
| 1 | X1 |
| 2 | X2 |
| 3 | X3 |
ConvertToLetter
- это следующая функция:
Function ConvertToLetter(iCol As Integer) As String
Dim vArr
vArr = Split(Cells(1, iCol).Address(True, False), "$")
ConvertToLetter = vArr(0)
End Function
Кто-нибудь может указать, почему эта разница возникает между сценарием 1 и 2? Обычно такие вещи случаются, когда объекты не полностью классифицированы, но я подумал, что на этот раз я решил эту проблему.