MS Access захватывает определенную группу текста, добавляет и зацикливает на следующем разделе в длинном текстовом поле - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть длинное текстовое поле (называемое «reporttext»), которое кто-то импортирует кучу текста, который должен быть отделен и добавлен в другую таблицу.Для каждого случая есть символ «[]», который должен отделять каждый случай.Я хочу, чтобы мой код выполнял поиск первых [] и вторых [], добавлял текст в другую таблицу и затем зацикливался.Таким образом, следующим случаем будет текст между вторым [] и третьим [].

Вот моя строка

Reporttext : [] ksfjjls [] 42244 [] @@@@

Я бы хотел, чтобы это добавилось к новойтаблица называется "заметки", где это будет выглядеть так:

Reporttext
ksfjjls
42244
@@@@

Я использовал макроспосчитать количество [] в текстовом файле, чтобы узнать, сколько раз запустить цикл, но этого вместе с остальным моим кодом просто не происходит.Я знаю, что мой код неверен, но я знаю, что с помощью нескольких настроек это получитсяЛюбая помощь приветствуется.

lengthofnote = Len([reporttext])
start = InStr([reporttext], "[]")
startplus3 = [start] + 3
'find number of cases
firstcase = 1
numcases = StringCountOccurrences([reporttext], "[]")
Dim LCounter As Integer

  For LCounter = [firstcase] To [numcases]
    revisedreporttext = Mid([reporttext], [startplus3], [lengthofnote])
    secondposition = InStr([revisedreporttext], "[]")
    nextreporttext = Mid([reporttext], [startplus3], [secondposition])
    Add_reporttext = "INSERT INTO notes(reporttext) values ('" & nextreporttext & "');"
    DoCmd.RunSQL Add_reporttext  
    firstcase = firstcase + 1
    startplus3 = secondposition
    secondposition = secondposition + 4
  Next LCounter

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Предполагая, что строка всегда начинается с [] и предпочтение состоит в том, чтобы вернуть одну строку, рассмотрим:

Replace(Mid(reporttext, 4), "[] ", vbCrLf)

0 голосов
/ 26 февраля 2019

@ Зев Шпиц прав в том, что вы можете использовать Split() для достижения этой цели.Вы могли бы использовать что-то вроде этого

Option Compare Database
Option Explicit
Sub SplitLongTextField()
    Dim rs As Recordset
    Dim reportTextArr
    Dim qString As String
    Dim i As Long


    qString = "SELECT [reporttext] FROM [Table1]" '<- replace [Table1] with the name of your table with the Long Text field

    Set rs = CurrentDb.OpenRecordset(qString)

    If Not rs.EOF Then
        reportTextArr = Split(rs.Fields("reporttext"), "[]")
    End If

    For i = LBound(reportTextArr) To UBound(reportTextArr)
        If Not reportTextArr(i) = "" Then
            DoCmd.RunSQL "INSERT INTO notes(reporttext) VALUES('" & reportTextArr(i) & "');"
        End If
    Next i

    rs.Close

End Sub

Если вам нужно было сделать это для нескольких записей из вашей исходной таблицы, то вы можете перебрать всю таблицу и повторить операцию, как

Option Compare Database
Option Explicit
Sub SplitLongTextField()
    Dim rs As Recordset
    Dim reportTextArr
    Dim qString As String
    Dim i As Long


    qString = "SELECT [reporttext] FROM [Table1]" '<- replace [Table1] with the name of your table with the Long Text field

    Set rs = CurrentDb.OpenRecordset(qString)

    Do Until rs.EOF
        reportTextArr = Split(rs.Fields("reporttext"), "[]")

        For i = LBound(reportTextArr) To UBound(reportTextArr)
            If Not reportTextArr(i) = "" Then
                DoCmd.RunSQL "INSERT INTO notes(reporttext) VALUES('" & reportTextArr(i) & "');"
            End If
        Next i

        rs.MoveNext
    Loop

    rs.Close

End Sub
...