#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"
Чтобы использовать это для вашей проблемы: прочитайте входной файл в строку, а затем за одну операцию записи используйте одну операцию записи для записи результата функции, примененной к строке, используя вызов, аналогичный второму примеру в моем тестовом коде.