VBA Split Cells и вставка только определенных ячеек - PullRequest
0 голосов
/ 19 марта 2019

обновлено *

Я новичок в VBA, поэтому помощь будет принята

У меня есть лист, где я в столбце А содержание в этой структуре:

A1: Заголовок столбцаA2: 044000 randomwordx (3 пробела между числом и случайными словами)
A3: 056789 randomwordy (3 пробела между числом и случайными словами) A4:

A5: a.) Случайные слова
A6: 3.randomwords A7:

A8: 600000 случайных словz (3 пробела между числом и случайными словами)
A9: 654124 случайных слов (3 пробела между числом и случайными словами)

разделитель между числами и случайными словами в столбце A равенвсегда 3x пробела

я хочу сделать следующее:

Перейти к столбцу A - выбрать все ячейки, которые начинаются с 6-значного числа

  • разбить эти ячейки и вставить их в столбец C и D

  • столбец C должен содержать только начальный номер, удалить все начальные нули (если ячейка A2 имеет, например, 044000, ячейка C2 должнабыть 44000)

  • столбец D должен содержать только текст, который следует после начального номера столбца A (в этом примере D2 должен быть "randomwordx"

  • ячеек в столбце A, которыйпустые или не начинаются с 6-значного числа, НЕ должны вставляться в столбцы C и D (в этом примере A4, A5, A6, A7 НЕ должны вставляться в столбцы C и D)

Так оно и должно выглядеть

Столбец C: C1: Заголовок столбца

C2: 44000

C3: 56789

C4: 60000

C5: 653124

Столбец D:

D1: Заголовок столбца

D2: randomwordx *

D3: randomwordy

D4:randomwordz

D5: randomwords

Мне удалось продвинуться так далеко, поэтому помощь была бы оценена

Option Explicit

Sub Splitcolumn() 
Dim mrg As Range
Dim LastRow As Long
Dim r As Range
Dim splitted() As String

With Sheets("test")
    Set mrg = Sheets("test").Range("A4:A" & LastRow)
    For Each r In mrg 
        splitted = Split(r.Value, "   ") 
        r.Value = splitted(0)
        r.Offset(2, 3).Value = splitted(1) & "   " & splitted(2)
    Next r
End With
End Sub

я получил ошибку во время выполнения 1004

спасибоза вашу помощь

1 Ответ

0 голосов
/ 19 марта 2019

Это должно делать то, что вы хотите. Я использовал ответ Portland Runner на этот пост , чтобы установить ссылку на RegEx в своем VBA и узнать синтаксис для нее. Вместо каждого цикла я вычисляю последнюю строку столбца A и использую цикл for с таким количеством итераций. Переменная i установлена ​​в 2, чтобы пропустить заголовок в строке 1.

Sub SplitCol()
    'Set references to active workbook and sheet
    Dim wb As Workbook
    Dim ws As Worksheet
    Set wb = ActiveWorkbook
    Set ws = wb.ActiveSheet

    'Create Regular Expression object and set up options
    Dim regEx As New RegExp
    With regEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        '[0-9] means that regex will check for all digits
        '{6} means that a minimum of 6 consecutive chars must meet the [0-9] criteria
        .pattern = "[0-9]{6}"
    End With

    'All .Methods and .Properties will belong to ws object due to With
    With ws
        'Determine how many rows to loop through
        Dim lastRowA As Long
        lastRowA = .Range("A" & .Rows.Count).End(xlUp).Row

        'Main loop
        Dim i As Integer
        For i = 2 To lastRowA
            'Make sure there is a value in the cell or code will error out
            If Cells(i, 1).Value <> "" Then
                'Test regex of cell
                If regEx.Test(Split(Cells(i, 1).Value, "   ")(0)) Then
                    'If regex was true, set 3rd column (C) equal to numbers and
                    '4th column (D) equal everything else
                    Cells(i, 3).Value = Split(Cells(i, 1).Value, "   ")(0)
                    Cells(i, 4).Value = Split(Cells(i, 1).Value, "   ")(1)
                End If
            End If
        Next
    End With

    'Release regEx object to reduce memory usage
    Set regEx = Nothing

End Sub

Вот как должен выглядеть код на листе.

...