Шагая через, вы получите другой результат - PullRequest
0 голосов
/ 30 октября 2018

У меня есть фрагмент кода, который используется для разделения текста в ячейке. Данные выводятся программой опроса, которая не использует никакого полезного разделителя, поэтому, к сожалению, преобразование текста в столбцы мне не поможет.

Я написал этот фрагмент кода, но оказалось, что результаты в двух случаях различны.

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

  2. Я запускаю код из меню выполнения макроса

В первом случае вывод такой, каким я его задумал. После столбца с заголовком 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? Обычно такие вещи случаются, когда объекты не полностью классифицированы, но я подумал, что на этот раз я решил эту проблему.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

TextToColumns может выполнить это разделение, а DataSeries может поместить последовательность чисел в строку 1.

Sub Macro4()

    Dim lc As Long

    With Worksheets("sheet9")
        .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)).TextToColumns _
                Destination:=.Cells(2, "B"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
                Comma:=True, Tab:=False, Semicolon:=False, Space:=False, Other:=False
        lc = .Cells.Find(What:=Chr(42), After:=.Cells(1, 1), LookAt:=xlPart, LookIn:=xlFormulas, _
                   SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column - 1
        .Cells(1, "B") = 1
        .Cells(1, "B").Resize(1, lc).DataSeries Rowcol:=xlRows, Type:=xlLinear, _
                                                Date:=xlDay, Step:=1, Stop:=4
    End With

End Sub

enter image description here

0 голосов
/ 30 октября 2018

Разница в том, что Cells и Range не полностью квалифицированы. Таким образом, когда вы идете шаг за шагом, вы также выбираете правильный лист, и автоматически это не так.

Всякий раз, когда у вас есть что-то подобное:

ws.Cells(1, col_to_add + j - 1) = Cells(1, col_to_add + j - 2).Value + 1

убедитесь, что вы всегда пишете Worksheet перед Cells(), как здесь - ws.Cells. Или до диапазона - ws.Range(). В противном случае он занимает ActiveSheet или лист с кодом (если не в модуле).

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