VBA Регулярное выражение с разделением строк - PullRequest
0 голосов
/ 24 августа 2018

Может кто-нибудь, пожалуйста, помогите мне с макросом VBA. Я использую приведенный ниже код. Задача состоит в том, чтобы прочитать файл блокнота, который содержит содержимое, и извлечь определенную строку, которая выглядит как «Z012345», и вставить их в строке Excel, например, ячейка A1 будет Z067859, а A2 будет Z002674 и т. Д.,

Пример того, как выглядит содержимое файла блокнота

Содержание:

RAF0A123 Full data len= 134 

  ABATWER01 Recent change by VT0123123 on 11/12/17-11:50
                       INCLUDE(STELLER Z067859 Z002674 Z004671 Z003450 Z005433 Z023123 Z034564 Z034554 Z043212 Z010456 Z014567
                       Z027716 Z028778 Z029439 Z029876 Z035766 Z036460 Z038544 Z046456 Z047680 Z052907 Z053145 Z074674 Z094887

код VBA:

Sub Demo()
Dim myFile As String, text As String, textline As String
Dim regex As Object, str As String
Set regex = CreateObject("VBScript.RegExp")

myFile = "C:\Users\sample.txt"

Open myFile For Input As #1

With regex
  .Pattern = "Z0[0-9]+"
  .Global = Trueq
End With

Set matches = regex.Execute(Input)

For Each Match In matches
Range("A1:A4000").Value = Match.Value
Next Match

  Do Until EOF(1)
  Line Input #1, textline
  text = text & textline
  Loop

  Close #1

End Sub

Ожидаемый результат:

Выходной столбец Excel должен содержать следующее:

Z067859
Z002674
Z004671
Z003450
Z005433
Z023123
Z034564
Z034554
Z043212
Z010456
Z014567
Z027716
Z028778
Z029439
Z029876
Z035766
Z036460
Z038544
Z046456
Z047680
Z052907
Z053145
Z074674
Z094887

Может ли кто-нибудь помочь мне написать макрос для выполнения задачи?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Вместо того, чтобы читать по одной строке за раз, я бы предпочел прочитать весь файл в строку, а затем найти строку и вставить ее.Пример кода

Dim myFile As String, regex As Object, str As String, ctr As Long

myFile = "C:\Users\sample.txt"
With CreateObject("Scripting.FileSystemObject")
    str = .OpenTextFile(myFile, 1).ReadAll
End With

Set regex = CreateObject("VBScript.RegExp")
With regex
  .Pattern = "Z0[0-9]+"
  .Global = True
End With
Set matches = regex.Execute(str)

ctr = 1
For Each Match In matches
  Sheet1.Range("A" & ctr).Value2 = Match
  ctr = ctr + 1
Next Match
0 голосов
/ 25 августа 2018

Пожалуйста, попробуйте ниже и дайте мне знать, что оно соответствует вашим требованиям

Sub Demo()

Dim myFile As String, text As String, textline As String
Dim str As String
Dim LineArray() As String
Dim DataArray() As String
Dim TempArray() As String
Dim rw As Long, col As Long
Dim FileContent As String

Set regex = CreateObject("vbscript.regexp")

Dim allMatches As Object
Delimiter = " "

myFile = "Path\sample.txt"

    With regex
    .Pattern = "Z0[0-9]+"
    .Global = True
    End With

Open myFile For Input As #1

  Do Until EOF(1)
  Line Input #1, textline
  text = text & textline
  Loop

LineArray() = Split(text, vbCrLf)
i = 1
For x = LBound(LineArray) To UBound(LineArray)
    If Len(Trim(LineArray(x))) <> 0 Then
        TempArray = Split(LineArray(x), Delimiter)

        col = UBound(TempArray)
        ReDim Preserve DataArray(col, rw)
        For y = LBound(TempArray) To UBound(TempArray)
          Set allMatches = regex.Execute(TempArray(y))
          Range("A" & i).Value = allMatches.Item(0)
          i = i + 1
        Next y
    End If

      rw = rw + 1

  Next x

  Close #1

End Sub

Спасибо

0 голосов
/ 24 августа 2018

Я действительно думаю, что ваш код там 85%. Я вижу пару вещей неправильно.

1) Вам необходимо прочитать файл, прежде чем пытаться вывести его в Excel. В вашем коде кажется, что вы читаете файл после любого действия в Excel

2) Вы помещаете одно и то же значение в каждую ячейку от A1 до A1000, перезаписывая их каждый раз. Я считаю, что вы хотите зациклить и поместить каждое значение в ячейку.

3) Вы передаете переменную, которая даже не существует, вашему регулярному выражению

Пара изменений, и это может сделать это:

Sub Demo()
Dim myFile As String, text As String, textline As String
Dim regex As Object, str As String
Set regex = CreateObject("VBScript.RegExp")

myFile = "C:\Users\sample.txt"

Open myFile For Input As #1
  Do Until EOF(1)
  Line Input #1, textline
  text = text & textline
  Loop
Close #1

With regex
  .Pattern = "Z0[0-9]+"
  .Global = True
End With

Set matches = regex.Execute(text)

Dim row As Long
row = 1

For Each Match In matches
  Cells(row, 1).Value2 = Match
  row = row + 1
Next Match


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