Первая строка подраздела перед циклом

#vba

#vba

Вопрос:

Эта функция разбивает одну длинную непрерывную строку на более мелкие и добавляет префикс и суффикс/

Эта строка кода вызывает у меня проблемы, мне это нужно, потому что первый префикс отличается от других, но это приводит к тому, что первая строка создается дважды, не уверен, как переписать строку / код, чтобы преодолеть это?

 .WriteLine "s = """ amp; Trim$(Mid$(strInput, 1, intSize * AtomSize)) amp; """"
  

Вот полный suc:

 Sub StringBuilder(intSize As Integer, Optional AtomSize As Long = 3)
Dim i As Long
Dim strInput As String

strInput = CreateObject("Scripting.FileSystemObject").OpenTextFile(CurrentProject.Path amp; "input.txt").ReadAll
With CreateObject("Scripting.FileSystemObject").CreateTextFile(CurrentProject.Path amp; "output.txt", True)
    .WriteLine "s = """ amp; Trim$(Mid$(strInput, 1, intSize * AtomSize)) amp; """"
  For i = 1 To Len(strInput) - intSize * AtomSize Step intSize * AtomSize
    .WriteLine "s = s amp; """ amp; Trim$(Mid$(strInput, i, intSize * AtomSize)) amp; """"
  Next
  .WriteLine "s = s amp; """ amp; Trim$(Mid$(strInput, i, intSize * AtomSize)) amp; """"
End With

End Sub
  

Комментарии:

1. Для i = 2 в Len(strInput) — шаг intSize * AtomSize Шаг intSize * AtomSize ?

2. Почему бы вам не абстрагироваться от части кода, которая разбивает строку на отдельную функцию и отделяет ее от ввода-вывода файла? Это было бы чище и проще в отладке. Кроме того, неплохо явно закрывать файлы.

3. Для i = 2 в Len(strInput) — intSize * Шаг AtomSize intSize * AtomSize пробовал это, но, похоже, испортил вывод

4. Джон Коулман не могли бы вы показать пример кода для того, что вы предлагаете

Ответ №1:

Простое изменение

.WriteLine "s = """ amp; Trim$(Mid$(strInput, 1, intSize * AtomSize)) amp; """"

Для

.WriteLine "s = """

 Sub StringBuilder(intSize As Integer, Optional AtomSize As Long = 3)
    Dim i As Long
    Dim strInput As String

    strInput = CreateObject("Scripting.FileSystemObject").OpenTextFile(CurrentProject.Path amp; "input.txt").ReadAll
    With CreateObject("Scripting.FileSystemObject").CreateTextFile(CurrentProject.Path amp; "output.txt", True)
        .WriteLine "s = """
      For i = 1 To Len(strInput) - intSize * AtomSize Step intSize * AtomSize
        .WriteLine "s = s amp; """ amp; Trim$(Mid$(strInput, i, intSize * AtomSize)) amp; """"
      Next
      .WriteLine "s = s amp; """ amp; Trim$(Mid$(strInput, i, intSize * AtomSize)) amp; """"
    End With

End Sub
  

Ответ №2:

Вот функция, которая может использоваться для разделения строки на группы:

 Function GroupString(s As String, groupSize As Long, _
        Optional delim As String = ",", _
        Optional prefix As String = "", _
        Optional postfix As String = "") As String

    Dim n As Long, m As Long, i As Long
    Dim chunks As Variant

    n = Len(s)
    m = Int(n / groupSize)
    If n Mod groupSize = 0 Then
        ReDim chunks(0 To m - 1)
    Else
        ReDim chunks(0 To m) 'includes final chunk of size < groupSize
    End If

    For i = 0 To m - 1
        chunks(i) = Mid(s, 1   i * groupSize, groupSize)
    Next i

    If n Mod groupSize > 0 Then
        chunks(m) = Mid(s, 1   m * groupSize) 'final chunk
    End If

    GroupString = prefix amp; Join(chunks, delim) amp; postfix

End Function
  

Чтобы проверить это:

 Sub test()
    Dim myString As String

    myString = "abcd"
    Debug.Print GroupString(myString, 2, , "[", "]")

    myString = "This is a very long string, it would be nice if it were split into several lines, where each line is assigned to a variable"
     Debug.Print GroupString(myString, 20, """" amp; vbCrLf amp; "s = s amp; """, "s = """, """")
End Sub
  

С выводом:

 [ab,cd]
s = "This is a very long "
s = s amp; "string, it would be "
s = s amp; "nice if it were spli"
s = s amp; "t into several lines"
s = s amp; ", where each line is"
s = s amp; " assigned to a varia"
s = s amp; "ble"
  

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