VB Script in excel to separate a paragraph in lines of 38 - vba

I am working on taking a paragraph and separating that paragraph out in lines of 38 characters. What I was thinking was having a button for the employee to click and it will grab the information out of a certain cell, and place it in a text box of numerous lines that only have 38 characters, so the employee then can copy and paste it in our ERP system. The other kicker is I need a hard return after each line for it to probably be copied over. I was trying to use Str.Substring. Any help would greatly be appreciated.

So you need to take a paragraph and break it into a series of 38 character lines, separated by hard line breaks. The following code does so to the first cell in the worksheet (A1) and puts the clipboard, so all your users have to do is paste.
Sub main()
Dim x As Integer
Dim Output As String
Dim counter As Integer
Dim inputString As String
inputString = Cells(1, 1)
'We're going to go through the input string
'one character at a time
For x = 1 To Len(inputString)
'Each time through, we add one to our counter
counter = counter + 1
'When the counter reaches our breakpoint
If counter = 38 Then
'add a hard carriage return and line feed
Output = Output & vbCrLf
'Reset our counter
counter = 0
End If
'Append the current letter to the output
Output = Output & Mid(inputString, x, 1)
Next
'This puts the output string in the clipboard.
'You need to have a userform in your project for this to work
'or a reference to MSForms.
Dim cb As New DataObject
cb.SetText Output
cb.PutInClipboard
'This cleans up the clipboard object
Set cb = Nothing
End Sub

Here is a word wrap function that breaks the input string by space (replacing any new line characters) and fills the lines with whole words up to the specified margin. Unit tests attached to demonstrate typical usage.
Function getWordWrap(str As String, Optional margin As Long = 78) As String
Dim tokenArr() As String
Dim token As Variant
Dim line As String
Dim numChars As Long
tokenArr = Split(Replace(str, vbNewLine, " "))
For Each token In tokenArr
' if above margin - start a new line
If numChars > 0 And numChars + Len(token) + 1 > margin Then
getWordWrap = getWordWrap & Trim(line) & vbNewLine
numChars = 0: line = ""
End If
line = line & token & " "
numChars = Len(line) - 1
Next
getWordWrap = getWordWrap & Trim(line)
End Function
Sub testGetWordWrap()
' basic tests
Debug.Assert getWordWrap("Illum rerum qui.", 15) = "Illum rerum" & vbNewLine & "qui."
Debug.Assert getWordWrap("", 15) = ""
Debug.Assert getWordWrap("Illum rerum qui quia sequi excepturi adipisci iure.", 15) _
= "Illum rerum qui" & vbNewLine & "quia sequi" & vbNewLine & "excepturi" _
& vbNewLine & "adipisci iure."
' very long words
Debug.Assert getWordWrap("VeryVeryLongWord", 15) = "VeryVeryLongWord"
Debug.Assert getWordWrap("Illum rerum qui. VeryVeryLongWord", 15) _
= "Illum rerum" & vbNewLine & "qui." & vbNewLine & "VeryVeryLongWord"
Debug.Assert getWordWrap("Illum rerum qui. VeryVeryLongWord quia sequi", 15) _
= "Illum rerum" & vbNewLine & "qui." & vbNewLine & "VeryVeryLongWord" _
& vbNewLine & "quia sequi"
' pre-existing new lines
Debug.Assert getWordWrap("Illum rerum qui quia sequi" & vbNewLine & "excepturi adipisci iure.", 15) _
= "Illum rerum qui" & vbNewLine & "quia sequi" & vbNewLine & "excepturi" _
& vbNewLine & "adipisci iure."
' different margins
Debug.Assert getWordWrap("Illum rerum qui.", 1) = "Illum" & vbNewLine & "rerum" & vbNewLine & "qui."
Debug.Assert getWordWrap("Illum rerum qui.", 20) = "Illum rerum qui."
End Sub

Related

Content Control not recognizing content

I was hoping someone could help me work out why the the 'F' value in my code below continues to include my error label in the ErrorMessage String when the Count value is 5?
In the document, the content control contains text just like all the other controls (which work perfectly) but this content Control text value is not being recognised in the VBA code to map error labels.
Have tried just replacing the control and checking the properties match. Debug messages suggest the the value is just being set to the default Content Control Value of "Click or Tap here to input text".
Private Sub Create_Click()
Dim oCC As ContentControl
Dim oCC2 As ContentControl
Dim Mandatory(9) As String
Dim ErrorMessage As String
Dim ErrorCount As Integer
Dim ErrorLabel(9) As String
Dim objDoc As Document
Dim strFilename As String
Dim strFileString As String
Dim Number As String
Mandatory(0) = "A"
Mandatory(1) = "B"
Mandatory(2) = "C"
Mandatory(3) = "D"
Mandatory(4) = "E"
Mandatory(5) = "F"
Mandatory(6) = "G"
Mandatory(7) = "H"
Mandatory(8) = "I"
ErrorLabel(0) = "A Label"
ErrorLabel(1) = "B Label"
ErrorLabel(2) = "C Label"
ErrorLabel(3) = "D Label"
ErrorLabel(4) = "E Label"
ErrorLabel(5) = "F Label"
ErrorLabel(6) = "G Label"
ErrorLabel(7) = "H Label"
ErrorLabel(8) = "I Label"
ErrorMessage = ""
ErrorMessage = "The following mandatory fields are missing: "
For Count = 0 To 8
Set oCC = ActiveDocument.SelectContentControlsByTitle(Mandatory(Count)).Item(1)
MsgBox (oCC.Range.Text)
If Count = 0 Then
Number = ActiveDocument.SelectContentControlsByTitle(Mandatory(Count)).Item(1).Range.Text
End If
If oCC.Range.Text = "Click or tap here to enter text." Or oCC.Range.Text = "0.00" Then
ErrorMessage = ErrorMessage & vbCrLf & vbCrLf & "- " & ErrorLabel(Count)
MsgBox (oCC.Range.Text)
ErrorCount = ErrorCount + 1
End If
Next Count
If ErrorCount > 0 Then
MsgBox (ErrorMessage)
Else
strFileString = Number
MsgBox (strFileString)
strFilename = "Some Text Here" & " - " & strFileString & ".pdf"
With ActiveDocument
NewPath = .Path & "\" & strFilename
.SaveAs2 FileName:=NewPath, FileFormat:=wdFormatPDF
.ExportAsFixedFormat OutputFileName:=strFilename, ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=True, OptimizeFor:=wdExportOptimizeForPrint, _
Range:=wdExportAllDocument, Item:=wdExportDocumentContent
End With
End If
End Sub
Check there are no other content controls with the same title in the document.
I couldn't test your code for lack of data but from your description I guess that the ErrorMessage must be reset with each loop since it will be changed when used and would naturally retain the modified version thereafter.
Except for what follows the loop, I looked closely at your code in order to understand it. Perhaps, the changes I made will be of some use to you.
Option Explicit
Private Sub Create_Click()
Dim Doc As Document
Dim Mandatory() As String
Dim ErrorMessage As String
Dim ErrorCount As Integer
Dim strFilename As String
Dim strFileString As String ' this appears identical with 'Number'
Dim Number As String
Dim Count As Integer ' loop counter
Set Doc = ActiveDocument
Mandatory = Split("A B C D E F G H I")
Number = Doc.SelectContentControlsByTitle(Mandatory(0))(1).Range.Text
For Count = 1 To UBound(Mandatory) + 1
ErrorMessage = "The following mandatory fields are missing: "
With Doc.SelectContentControlsByTitle(Mandatory(Count))(1).Range
MsgBox "Number = " & Number & vbCr & .Text
If .Text = "Click or tap here to enter text." Or _
.Text = "0.00" Then
ErrorMessage = ErrorMessage & vbCrLf & vbCrLf & "- " & Mandatory(Count) & " Label"
MsgBox (.Text)
ErrorCount = ErrorCount + 1
End If
End With
If Count = 1 Then Exit For
Next Count
If ErrorCount > 0 Then
MsgBox (ErrorMessage)
Else
strFileString = Number
MsgBox (strFileString)
strFilename = "Some Text Here" & " - " & strFileString & ".pdf"
With Doc
NewPath = .Path & "\" & strFilename
.SaveAs2 FileName:=NewPath, FileFormat:=wdFormatPDF
.ExportAsFixedFormat OutputFileName:=strFilename, _
ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=True, _
OptimizeFor:=wdExportOptimizeForPrint, _
Range:=wdExportAllDocument, _
Item:=wdExportDocumentContent
End With
End If
End Sub
You can have VBA add the useful (some would say necessary) Option Explicit to all new code modules automatically. Select Tools > Options in the VBE window and check "Require Variable Declaration" on the Editor tab.

vba macro display result of loop to msgbox

I creted a loop checking number of characters length with conditions but sadly it's not properly working,
with approriate no. of loops but not reading the next line, I want to post the result in a MsgBox,
but when I use the msgbox inside the loop I will get a msgbox for every result found or only one msgbox with one result.
What I would like is to display every result in 1 msgbox with a line vbNewLine after each result.
Below is my code:
Public Sub Rs()
Dim Text As String
Dim NumChar As String
Dim i As Integer
Dim NumRows As Long
Application.ScreenUpdating = False
'Get Cell Value
Text = Range("B2").Value
'Get Char Length
NumChar = Len(Text)
NumRows = Range("B2", Range("B2").End(xlDown)).Rows.Count
Range("B2").Select
For i = 1 To NumRows
'Character length validation
If Len(Text) <= 15 Then
MsgBox Chr(149) & " SVC_DESC " & Text & " has " & NumChar & " characters " & " and it's Valid !" & vbNewLine
Else
MsgBox Chr(149) & " SVC_DESC " & Text & " has " & NumChar & " characters " & " and Exceeded allowable number of characters!" & vbNewLine
End If
Next i
Application.ScreenUpdating = True
End Sub
Assign the new text to a string variable and display the string variable outside the loop:
Option Explicit
Sub TestMe()
Dim i As Long
Dim displayText As String
For i = 1 To 3
displayText = displayText & vbCrLf & i
Next i
MsgBox displayText
End Sub
Build a string through concatenation and display the strings after exiting the loop.
Public Sub Rs()
Dim Text As String
Dim NumChar As String
Dim i As Integer
Dim NumRows As Long
dim msg1 as string, msg2 as string
Application.ScreenUpdating = False
'Get Cell Value
Text = Range("B2").Value
'Get Char Length
NumChar = Len(Text)
NumRows = Range("B2", Range("B2").End(xlDown)).Rows.Count
Range("B2").Select
For i = 1 To NumRows
'Character length validation
If Len(Text) <= 15 Then
msg1 = msg1 & Chr(149) & " SVC_DESC " & Text & " has " & NumChar & " characters " & " and it's Valid !" & vbLF
Else
msg2 = msg2 & Chr(149) & " SVC_DESC " & Text & " has " & NumChar & " characters " & " and Exceeded allowable number of characters!" & vbLF
End If
Next i
Application.ScreenUpdating = True
if cbool(len(msg1)) then
msg1 = left(msg1, len(msg1)-1)
MsgBox msg1
end if
if cbool(len(msg2)) then
msg2 = left(msg2, len(msg2)-1)
MsgBox msg2
end if
End Sub
A MsgBox uses Chr(10) aka vbLF for new lines; vbNewLine is overkill.

Run-Time Error 40046: Statement too complex

I'm trying to write a code module using the InsertLines method, but am getting the
Statement too complex Error
My code boils down to this loop:
Dim extractorModule As VBComponent
With extractorModule.codeModule
Dim singItem As codeItem
Dim i As Long
For i = LBound(codeItems) To UBound(codeItems)
singItem = codeItems(i) 'array of private type with .value property
.InsertLines 5, singItem.value 'write to line 5
Next i
End With
Which loops through an array of custom codeItems, and writes their .value to a new module with .InsertLines
singItem.value is a base64 encoded string. If it is a short one, 100 characters say, like this string:
.code_content = "QXR0cmlidXRlIFZCX05hbWUgPSAic2ltcGxlTW9kdWxlIg0KUHJpdmF0ZSBhIEFzIExvbmcNCg=="
no problem. However I want a longer string, this one for example (19000 chars, contains newlines):
.code_content = "QXR0cmlidXRlIFZCX05hbWUgPSAicHJvamVjdENvbXByZXNzb3IiDQonQ29tcHJlc3NvciBtb2R1bGUsIGNvbXByZXNzZXMgYSBsb2FkIG9mIGZpbGVzIGludG8gc3RyaW5ncyB0byBleHBvcnQNCk9wdGlvbiBFeHBsaWNpdA0KUHJpdmF0ZSBUeXBlIGNvZGVJdGVtDQogICAgZXh0ZW5zaW9uIEFzIFN0cmluZw0KICAgIG1vZHVsZV9uYW1lIEFzIFN0cmluZw0KICAgIGNvZGVfY29udGVudCBBcyBTdHJpbmcNCkVuZCBUeXBlDQpQcml2YXRlIENvbnN0IFR5cGVCaW5hcnkgPSAxDQoNClB1YmxpYyBTdWIgY29tcHJlc3NQcm9qZWN0KFBhcmFtQXJyYXkgZmlsZW5hbWVzKCkpDQogICAgJ1N1YiB0byBjb252ZXJ0IHNlbGVjdGVkIGZpbGVzIGludG8gc2VsZi1leHRyYWN0aW5nIG1vZHVsZQ0KICAgICdJbnB1dDoNCiAgICAnICAgZmlsZW5hbWVzOiBhcnJheSBvZiBzdHJpbmdzIGJhc2VkIG9uIG5hbWVzIG9mIG1vZHVsZXMgaW4gcHJvamVjdA0KICAgIElmIE5vdCBwcm9qZWN0X2FjY2Vzc2libGUgVGhlbg0KICAgICAgICBNc2dCb3ggIkFjY2VzcyB0byBWQkEgcHJvamVjdCBpcyByZXN0cmljdGVkLCB0aGlzIHdvbid0IHdvcmshIg0KICAgICAgICBFeGl0IFN1Yg0KICAgIEVuZCBJZg0KDQogICAgRGltIGNvZGVJdGVtcygpIEFzIGNvZGVJdGVtDQogICAgRGltIGFycmF5U3QgQXMgTG9uZywg" & _
"YXJyYXlFbmQgQXMgTG9uZywgaSBBcyBMb25nDQogICAgYXJyYXlTdCA9IExCb3VuZChmaWxlbmFtZXMpDQogICAgYXJyYXlFbmQgPSBVQm91bmQoZmlsZW5hbWVzKQ0KICAgIFJlRGltIGNvZGVJdGVtcyhhcnJheVN0IFRvIGFycmF5RW5kKQ0KICAgIA0KICAgIERlYnVnLlByaW50ICJHZXR0aW5nIERlZmluaXRpb25zLi4uIg0KICAgIFdpdGggVGhpc1dvcmtib29rLlZCUHJvamVjdC5WQkNvbXBvbmVudHMNCiAgICAgICAgJ2xvb3AgdGhyb3VnaCBmaWxlcyBjb21wcmVzc2luZyB0aGVtIGludCA2NCBiaXQgc3RyaW5ncw0KICAgICAgICBGb3IgaSA9IGFycmF5U3QgVG8gYXJyYXlFbmQNCiAgICAgICAgICAgIGNvZGVJdGVtcyhpKSA9IG1vZHVsZURlZmluaXRpb24oZmlsZW5hbWVzKGkpKQ0KICAgICAgICBOZXh0IGkNCiAgICBFbmQgV2l0aA0KICAgIERlYnVnLlByaW50ICwgIkRlZmluaXRpb25zIHNhdmVkIg0KICAgICd3cml0ZSBzdHJpbmdzIHRvIHNrZWxldG9uIGZpbGUNCiAgICAgICAgRGVidWcuUHJpbnQgIldyaXRpbmcgZmlsZS4uLiINCiAgICB3cml0ZVNrZWxldG9uIGNvZGVJdGVtcw0KRGVidWcuUHJpbnQgIkNvbXBsZXRlIg0KRW5kIFN1Yg0KUHJpdmF0ZSBTdWIgd3JpdGVTa2VsZXRvbihjb2RlSXRlbXMoKSBBcyBjb2RlSXRlbSwgT3B0aW9uYWwgd2IgQXMgVmFyaWFudCwg" & _
"T3B0aW9uYWwgQnlSZWYgcHJvamVjdE5hbWUgQXMgU3RyaW5nID0gIm15UHJvamVjdCIpICcgLCBPcHRpb25hbCB3YiBBcyBWYXJpYW50KQ0KICAgIERpbSBpdGVtQ291bnQgQXMgTG9uZw0KICAgIGl0ZW1Db3VudCA9IFVCb3VuZChjb2RlSXRlbXMpIC0gTEJvdW5kKGNvZGVJdGVtcykgKyAxDQogICAgSWYgaXRlbUNvdW50IDwgMSBUaGVuIEV4aXQgU3ViDQogICAgDQogICAgRGltIGJvb2sgQXMgV29ya2Jvb2sNCiAgICBJZiBJc01pc3Npbmcod2IpIFRoZW4gU2V0IGJvb2sgPSBUaGlzV29ya2Jvb2sgRWxzZSBTZXQgYm9vayA9IHdiDQogICAgJ2NyZWF0ZSBzZWxmLWV4dHJhY3RpbmcgbW9kdWxlIGFuZCBzZXQgbmFtZQ0KDQogICAgRGltIGV4dHJhY3Rvck1vZHVsZSBBcyBWQkNvbXBvbmVudA0KICAgIFNldCBleHRyYWN0b3JNb2R1bGUgPSBib29rLlZCUHJvamVjdC5WQkNvbXBvbmVudHMuQWRkKHZiZXh0X2N0X1N0ZE1vZHVsZSkNCiAgICBleHRyYWN0b3JNb2R1bGUuTmFtZSA9IHByb2plY3ROYW1lICdtYXkgZXJyIGlmIGR1cGxpY2F0ZSAtIGNoYW5nZXMNCkRlYnVnLlByaW50ICwgIlByb2plY3QgZmlsZSBhZGRlZCINCiAgICAnd3JpdGUgY29kZSB0byBtb2R1bGUNCiAgICBEaW0gY29kZUluc2VydFBvaW50IEFzIExvbmcNCiAgICBjb2RlSW5zZXJ0UG9pbnQgPSBmaWxsTW9kdWxl" & _
"KGV4dHJhY3Rvck1vZHVsZS5jb2RlTW9kdWxlKSgwKSAneCBjb29yZA0KRGVidWcuUHJpbnQgLCAiUHJvamVjdCBza2VsZXRvbiB3cml0dGVuIg0KICAgICdhbW1lbmQgY29kZSB3aXRoIGNvZGVpdGVtcyBhbmQga2lsbGluZyBsaW5lDQogICAgJ1dpdGggZXh0cmFjdG9yTW9kdWxlLmNvZGVNb2R1bGUNCiAgICANCiAgICBEaW0gdiBBcyBjb2RlTW9kdWxlDQogICAgU2V0IHYgPSBleHRyYWN0b3JNb2R1bGUuY29kZU1vZHVsZQ0KICAgIHYuRGVsZXRlTGluZXMgY29kZUluc2VydFBvaW50DQogICAgRGltIHNpbmdJdGVtIEFzIGNvZGVJdGVtDQogICAgRGltIGkgQXMgTG9uZywgbG93ZXJWYWwgQXMgTG9uZywgdXBwZXJWYWwgQXMgTG9uZw0KICAgIGxvd2VyVmFsID0gTEJvdW5kKGNvZGVJdGVtcykNCiAgICB1cHBlclZhbCA9IFVCb3VuZChjb2RlSXRlbXMpDQoNCiAgICAgICAgDQogICAgJ2xvb3AgdGhyb3VnaCBhZGRpbmcgY29kZSBkZWZpbml0aW9ucw0KICAgIEZvciBpID0gbG93ZXJWYWwgVG8gdXBwZXJWYWwNCiAgICAgICAgc2luZ0l0ZW0gPSBjb2RlSXRlbXMoaSkNCiAgICAgICAgRGltIHMgQXMgU3RyaW5nOiBzID0gcHJpbnRmKFN0cmluZyg0LCB2YlRhYikgJiAiLmNvZGVfY29udGVudCA9IHswfSIsIHNpbmdJdGVtLmNvZGVfY29udGVudCkNCiAgICAgICAgRGVidWcuUHJpbnQg" & _
"LCAiRm9ybWF0dGVkIGZpbmUiDQoNCiAgICAgICAgRGVidWcuUHJpbnQgIm1hZGUgaXQgdG8iDQogICAgICAgIERlYnVnLlByaW50IHMNCiAgICAgICAgdi5JbnNlcnRMaW5lcyBjb2RlSW5zZXJ0UG9pbnQsIHMNCiAgICAgICAgRGVidWcuUHJpbnQgIm1hZGUgaXQgcGFzdCINCicgICAgICAgIC5JbnNlcnRMaW5lcyBjb2RlSW5zZXJ0UG9pbnQsIHByaW50ZihTdHJpbmcoNCwgdmJUYWIpICYgIi5tb2R1bGVfbmFtZSA9ICIiezB9IiIiLCBzaW5nSXRlbS5tb2R1bGVfbmFtZSkNCicgICAgICAgIC5JbnNlcnRMaW5lcyBjb2RlSW5zZXJ0UG9pbnQsIHByaW50ZihTdHJpbmcoNCwgdmJUYWIpICYgIi5leHRlbnNpb24gPSAiInswfSIiIiwgc2luZ0l0ZW0uZXh0ZW5zaW9uKQ0KJw0KJyAgICAgICAgLkluc2VydExpbmVzIGNvZGVJbnNlcnRQb2ludCwgcHJpbnRmKFN0cmluZygzLCB2YlRhYikgJiAiQ2FzZSB7MH0iLCBpdGVtQ291bnQpDQogICAgICAgIGl0ZW1Db3VudCA9IGl0ZW1Db3VudCAtIDENCkRlYnVnLlByaW50ICwgIkluc2VydGVkIGNvZGUgY29udGVudCBmb3IgZmlsZTogIjsgaQ0KICAgIE5leHQgaQ0KDQogICAgRGltIGtpbGxMaW5lIEFzIExvbmcgJ3BsYWNlIGZvciBhZGRpbmcgbGFzdCBiaXQgb2YgY29kZSB0byByZW1vdmUgc2VsZi1leHRyYWN0b3INCicgICAgLkZpbmQgInsx" & _
"fSIsIGtpbGxMaW5lLCAxLCAtMSwgLTENCicgICAgLlJlcGxhY2VMaW5lIGtpbGxMaW5lLCBSZXBsYWNlKC5MaW5lcyhraWxsTGluZSwgMSksICJ7MX0iLCBwcm9qZWN0TmFtZSkNCkRlYnVnLlByaW50ICwgIkluc2VydGVkIGtpbGxMaW5lIg0KICAgICdFbmQgV2l0aA0KICAgIA0KRW5kIFN1Yg0KDQoNClByaXZhdGUgRnVuY3Rpb24gbW9kdWxlRGVmaW5pdGlvbihtb2R1bGVOYW1lLCBPcHRpb25hbCB3YiBBcyBWYXJpYW50KSBBcyBjb2RlSXRlbQ0KICAgIERpbSBjb2RlTW9kdWxlIEFzIFZCQ29tcG9uZW50DQogICAgRGltIGJvb2sgQXMgV29ya2Jvb2sNCiAgICBEaW0gcmVzdWx0IEFzIGNvZGVJdGVtDQogICAgSWYgSXNNaXNzaW5nKHdiKSBUaGVuIFNldCBib29rID0gVGhpc1dvcmtib29rIEVsc2UgU2V0IGJvb2sgPSB3Yg0KICAgIFNldCBjb2RlTW9kdWxlID0gYm9vay5WQlByb2plY3QuVkJDb21wb25lbnRzKG1vZHVsZU5hbWUpDQogICAgJ2dldCBleHRlbnNpb24gYW5kIG5hbWUNCiAgICBTZWxlY3QgQ2FzZSBjb2RlTW9kdWxlLlR5cGUNCiAgICBDYXNlIHZiZXh0X2N0X1N0ZE1vZHVsZQ0KICAgICAgICByZXN1bHQuZXh0ZW5zaW9uID0gIi5iYXMiDQogICAgQ2FzZSB2YmV4dF9jdF9DbGFzc01vZHVsZQ0KICAgICAgICByZXN1bHQuZXh0ZW5zaW9uID0gIi5jbHMiDQogICAgQ2Fz" & _
"ZSB2YmV4dF9jdF9NU0Zvcm0NCiAgICAgICAgcmVzdWx0LmV4dGVuc2lvbiA9ICIuZnJtIg0KICAgIENhc2UgRWxzZQ0KICAgICAgICByZXN1bHQuZXh0ZW5zaW9uID0gIm1pc3NpbmciDQogICAgICAgIG1vZHVsZURlZmluaXRpb24gPSByZXN1bHQNCiAgICAgICAgRXhpdCBGdW5jdGlvbg0KICAgIEVuZCBTZWxlY3QNCiAgICANCiAgICByZXN1bHQubW9kdWxlX25hbWUgPSBjb2RlTW9kdWxlLk5hbWUNCiAgICAnc2F2ZSB0byB0ZW1wIHBhdGgNCiAgICBEaW0gdGVtcFBhdGggQXMgU3RyaW5nDQogICAgdGVtcFBhdGggPSBwcmludGYoInswfVx7MX17Mn0iLCBFbnZpcm9uJCgidGVtcCIpLCByZXN1bHQubW9kdWxlX25hbWUsIHJlc3VsdC5leHRlbnNpb24pDQogICAgY29kZU1vZHVsZS5FeHBvcnQgdGVtcFBhdGgNCiAgICBPbiBFcnJvciBHb1RvIHNhZmVFeGl0DQogICAgcmVzdWx0LmNvZGVfY29udGVudCA9IGNodW5raWZ5KFRvQmFzZTY0KHJlYWRCeXRlcyh0ZW1wUGF0aCkpKSAnZW5jb2RlIGFuZCBjaHVua2lmeQ0KICAgIA0Kc2FmZUV4aXQ6DQogICAgS2lsbCB0ZW1wUGF0aA0KICAgIG1vZHVsZURlZmluaXRpb24gPSByZXN1bHQNCiAgICBJZiBFcnIuTnVtYmVyIDw+IDAgVGhlbiBtb2R1bGVEZWZpbml0aW9uLmV4dGVuc2lvbiA9ICJtaXNzaW5nIg0KRW5kIEZ1bmN0aW9uDQoNClBy" & _
"aXZhdGUgRnVuY3Rpb24gcHJpbnRmKG1hc2sgQXMgU3RyaW5nLCBQYXJhbUFycmF5IHRva2VucygpKSBBcyBTdHJpbmcNCiAgICBEZWJ1Zy5QcmludCAsICIgLT4gRm9ybWF0dGluZyI7IExlbih0b2tlbnMoMCkpOyAiY2hhcnMgaW50byIsICIiIiI7IG1hc2s7ICIiIiINCiAgICBEaW0gaSBBcyBMb25nDQpPbiBFcnJvciBHb1RvIGJhZFByaW50DQogICAgRm9yIGkgPSAwIFRvIFVCb3VuZCh0b2tlbnMpDQogICAgICAgIG1hc2sgPSBSZXBsYWNlJChtYXNrLCAieyIgJiBpICYgIn0iLCB0b2tlbnMoaSkpDQogICAgTmV4dA0KICAgIHByaW50ZiA9IG1hc2sNCiAgICAgICAgRXhpdCBGdW5jdGlvbg0KYmFkUHJpbnQ6DQogICAgcHJpbnRmID0gbWFzaw0KICAgIERlYnVnLlByaW50IFN0cmluZygxMCwgIi0iKQ0KICAgIERlYnVnLlByaW50ICJQcmludEYgZXJyb3Igb24iLCB0b2tlbnMoMCkNCiAgICBEZWJ1Zy5QcmludCBTdHJpbmcoMTAsICItIikNCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRlIEZ1bmN0aW9uIHByb2plY3RfYWNjZXNzaWJsZSgpIEFzIEJvb2xlYW4NCiAgICBPbiBFcnJvciBSZXN1bWUgTmV4dA0KICAgIFdpdGggVGhpc1dvcmtib29rLlZCUHJvamVjdA0KICAgICAgICBwcm9qZWN0X2FjY2Vzc2libGUgPSAuUHJvdGVjdGlvbiA9IHZiZXh0X3BwX25vbmUNCiAgICAgICAgcHJv" & _
"amVjdF9hY2Nlc3NpYmxlID0gcHJvamVjdF9hY2Nlc3NpYmxlIEFuZCBFcnIuTnVtYmVyID0gMA0KICAgIEVuZCBXaXRoDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiByZWFkQnl0ZXMoZmlsZSBBcyBTdHJpbmcpIEFzIEJ5dGUoKQ0KICBEaW0gaW5TdHJlYW0gQXMgT2JqZWN0DQogICcgQURPREIgc3RyZWFtIG9iamVjdCB1c2VkDQogIFNldCBpblN0cmVhbSA9IENyZWF0ZU9iamVjdCgiQURPREIuU3RyZWFtIikNCiAgJyBvcGVuIHdpdGggbm8gYXJndW1lbnRzIG1ha2VzIHRoZSBzdHJlYW0gYW4gZW1wdHkgY29udGFpbmVyDQogIGluU3RyZWFtLk9wZW4NCiAgaW5TdHJlYW0uVHlwZSA9IFR5cGVCaW5hcnkNCiAgaW5TdHJlYW0uTG9hZEZyb21GaWxlIChmaWxlKQ0KICByZWFkQnl0ZXMgPSBpblN0cmVhbS5SZWFkKCkNCkVuZCBGdW5jdGlvbg0KUHJpdmF0ZSBGdW5jdGlvbiBjaHVua2lmeShCeVZhbCBiYXNlIEFzIFN0cmluZywgT3B0aW9uYWwgQnlWYWwgc3RyaW5nTGVuZ3RoIEFzIExvbmcgPSA5MDApIEFzIFN0cmluZw0KJ3NwbGl0cyBhIHN0cmluZyBhdCBldmVyeSBzdHJpbmdMZW5ndGggY2hhcmFjaHRlcnMgYW5kIGRlbGltaXRzDQonMTAyNCBpcyBtYXggY2hhcnMgaW4gYSBsaW5lDQpjaHVua2lmeSA9IEpvaW4oU3BsaXRTdHJpbmcoYmFzZSwgc3RyaW5nTGVuZ3Ro" & _
"KSwgIiAmIF8iICYgdmJDckxmKQ0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gU3BsaXRTdHJpbmcoQnlWYWwgc3RyIEFzIFN0cmluZywgQnlWYWwgbnVtT2ZDaGFyIEFzIExvbmcpIEFzIFN0cmluZygpDQogICAgRGltIHNBcnIoKSBBcyBTdHJpbmcNCiAgICBEaW0gbkNvdW50IEFzIExvbmcNCiAgICBSZURpbSBzQXJyKChMZW4oc3RyKSAtIDEpIFwgbnVtT2ZDaGFyKQ0KICAgIERvIFdoaWxlIExlbihzdHIpDQogICAgICAgIHNBcnIobkNvdW50KSA9ICIiIiIgJiBMZWZ0JChzdHIsIG51bU9mQ2hhcikgJiAiIiIiDQogICAgICAgIHN0ciA9IE1pZCQoc3RyLCBudW1PZkNoYXIgKyAxKQ0KICAgICAgICBuQ291bnQgPSBuQ291bnQgKyAxDQogICAgTG9vcA0KICAgIFNwbGl0U3RyaW5nID0gc0Fycg0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gVG9CYXNlNjQoZGF0YSgpIEFzIEJ5dGUpIEFzIFN0cmluZw0KICBEaW0gYjY0KDAgVG8gNjMpIEFzIEJ5dGUsIHN0cigpIEFzIEJ5dGUsIGkmLCBqJiwgdiYsIG4mDQogIG4gPSBVQm91bmQoZGF0YSkgLSBMQm91bmQoZGF0YSkgKyAxDQogIElmIG4gVGhlbiBFbHNlIEV4aXQgRnVuY3Rpb24NCg0KICBzdHIgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3" & _
"ODkrLyINCiAgRm9yIGkgPSAwIFRvIDEyNyBTdGVwIDINCiAgICBiNjQoaSBcIDIpID0gc3RyKGkpDQogIE5leHQNCg0KICBSZURpbSBzdHIoMCBUbyAoKG4gKyAyKSBcIDMpICogOCAtIDEpDQoNCiAgRm9yIGkgPSBMQm91bmQoZGF0YSkgVG8gVUJvdW5kKGRhdGEpIC0gKG4gTW9kIDMpIFN0ZXAgMw0KICAgIHYgPSBkYXRhKGkpICogNjU1MzYgKyBkYXRhKGkgKyAxKSAqIDI1NiYgKyBkYXRhKGkgKyAyKQ0KICAgIHN0cihqKSA9IGI2NCh2IFwgMjYyMTQ0KQ0KICAgIHN0cihqICsgMikgPSBiNjQoKHYgXCA0MDk2KSBNb2QgNjQpDQogICAgc3RyKGogKyA0KSA9IGI2NCgodiBcIDY0KSBNb2QgNjQpDQogICAgc3RyKGogKyA2KSA9IGI2NCh2IE1vZCA2NCkNCiAgICBqID0gaiArIDgNCiAgTmV4dA0KDQogIElmIG4gTW9kIDMgPSAyIFRoZW4NCiAgICB2ID0gZGF0YShuIC0gMikgKiAyNTYmICsgZGF0YShuIC0gMSkNCiAgICBzdHIoaikgPSBiNjQoKHYgXCAxMDI0JikgTW9kIDY0KQ0KICAgIHN0cihqICsgMikgPSBiNjQoKHYgXCAxNikgTW9kIDY0KQ0KICAgIHN0cihqICsgNCkgPSBiNjQoKHYgKiA0KSBNb2QgNjQpDQogICAgc3RyKGogKyA2KSA9IDYxICcgPSAnDQogIEVsc2VJZiBuIE1vZCAzID0gMSBUaGVuDQogICAgdiA9IGRhdGEobiAtIDEpDQogICAgc3RyKGopID0gYjY0KHYgXCA0" & _
"IE1vZCA2NCkNCiAgICBzdHIoaiArIDIpID0gYjY0KHYgKiAxNiBNb2QgNjQpDQogICAgc3RyKGogKyA0KSA9IDYxICcgPSAnDQogICAgc3RyKGogKyA2KSA9IDYxICcgPSAnDQogIEVuZCBJZg0KDQogIFRvQmFzZTY0ID0gc3RyDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBmaWxsTW9kdWxlKGNvZGVTZWN0aW9uIEFzIGNvZGVNb2R1bGUpIEFzIExvbmcoKQ0KV2l0aCBjb2RlU2VjdGlvbg0KLkluc2VydExpbmVzIDEsICJPcHRpb24gRXhwbGljaXQiDQouSW5zZXJ0TGluZXMgMiwgIlByaXZhdGUgVHlwZSBjb2RlSXRlbSINCi5JbnNlcnRMaW5lcyAzLCAiICAgIGV4dGVuc2lvbiBBcyBTdHJpbmciDQouSW5zZXJ0TGluZXMgNCwgIiAgICBtb2R1bGVfbmFtZSBBcyBTdHJpbmciDQouSW5zZXJ0TGluZXMgNSwgIiAgICBjb2RlX2NvbnRlbnQgQXMgU3RyaW5nIg0KLkluc2VydExpbmVzIDYsICJFbmQgVHlwZSINCi5JbnNlcnRMaW5lcyA3LCAiIg0KLkluc2VydExpbmVzIDgsICJQcml2YXRlIENvbnN0IFR5cGVCaW5hcnkgPSAxIg0KLkluc2VydExpbmVzIDksICJQcml2YXRlIENvbnN0IEZvclJlYWRpbmcgPSAxLCBGb3JXcml0aW5nID0gMiwgRm9yQXBwZW5kaW5nID0gOCINCi5JbnNlcnRMaW5lcyAxMCwgIiINCi5JbnNlcnRMaW5lcyAxMSwgIlByaXZhdGUgRnVuY3Rpb24g" & _
"Z2V0Q29kZURlZmluaXRpb24oaXRlbU5vIEFzIExvbmcpIEFzIGNvZGVJdGVtIg0KLkluc2VydExpbmVzIDEyLCAiICAgIFdpdGggZ2V0Q29kZURlZmluaXRpb24iDQouSW5zZXJ0TGluZXMgMTMsICIgICAgICAgIFNlbGVjdCBDYXNlIGl0ZW1ObyINCi5JbnNlcnRMaW5lcyAxNCwgIiAgICAgICAgICAgICd7MH0iDQouSW5zZXJ0TGluZXMgMTUsICIgICAgICAgIENhc2UgRWxzZSINCi5JbnNlcnRMaW5lcyAxNiwgIiAgICAgICAgICAgIC5leHRlbnNpb24gPSAiIm1pc3NpbmciIiINCi5JbnNlcnRMaW5lcyAxNywgIiAgICAgICAgRW5kIFNlbGVjdCINCi5JbnNlcnRMaW5lcyAxOCwgIiAgICBFbmQgV2l0aCINCi5JbnNlcnRMaW5lcyAxOSwgIkVuZCBGdW5jdGlvbiINCi5JbnNlcnRMaW5lcyAyMCwgIiINCi5JbnNlcnRMaW5lcyAyMSwgIlB1YmxpYyBTdWIgRXh0cmFjdCgpIg0KLkluc2VydExpbmVzIDIyLCAiICAgIERpbSBjb2RlX21vZHVsZSBBcyBjb2RlSXRlbSINCi5JbnNlcnRMaW5lcyAyMywgIiAgICBEaW0gc2F2ZWRQYXRoIEFzIFN0cmluZywgYmFzZVBhdGggQXMgU3RyaW5nIg0KLkluc2VydExpbmVzIDI0LCAiICAgIERpbSBpIEFzIExvbmciDQouSW5zZXJ0TGluZXMgMjUsICIgICAgJ2NoZWNrIGlmIHZicHJvamVjdCBhY2Nlc3NpYmxlIg0KLkluc2VydExpbmVzIDI2LCAiICAg" & _
"IElmIE5vdCBwcm9qZWN0X2FjY2Vzc2libGUgVGhlbiINCi5JbnNlcnRMaW5lcyAyNywgIiAgICAgICAgTXNnQm94ICIiVGhlIFZCQSBwcm9qZWN0IGNhbm5vdCBiZSBhY2Nlc3NlZCBwcm9ncmFtbWF0aWNhbGx5IiIiDQouSW5zZXJ0TGluZXMgMjgsICIgICAgICAgIEV4aXQgU3ViIg0KLkluc2VydExpbmVzIDI5LCAiICAgIEVuZCBJZiINCi5JbnNlcnRMaW5lcyAzMCwgIiAgICAnY2hlY2sgaWYgdGVtcCBmb2xkZXIgYWNlc3NpYmxlIg0KLkluc2VydExpbmVzIDMxLCAiICAgIGkgPSAwIg0KLkluc2VydExpbmVzIDMyLCAiICAgIGJhc2VQYXRoID0gRW52aXJvbigiIlRlbXAiIikgJiAiIlwiIiINCi5JbnNlcnRMaW5lcyAzMywgIiAgICBEbyBXaGlsZSBUcnVlIg0KLkluc2VydExpbmVzIDM0LCAiICAgICAgICBpID0gaSArIDEiDQouSW5zZXJ0TGluZXMgMzUsICIgICAgICAgIGNvZGVfbW9kdWxlID0gZ2V0Q29kZURlZmluaXRpb24oaSkiDQouSW5zZXJ0TGluZXMgMzYsICIgICAgICAgIElmIGNvZGVfbW9kdWxlLmV4dGVuc2lvbiA9ICIibWlzc2luZyIiIFRoZW4iDQouSW5zZXJ0TGluZXMgMzcsICIgICAgICAgICAgICBFeGl0IERvIg0KLkluc2VydExpbmVzIDM4LCAiICAgICAgICBFbHNlIg0KLkluc2VydExpbmVzIDM5LCAiICAgICAgICAgICAgc2F2ZWRQYXRoID0gY3JlYXRlRmls" & _
"ZShjb2RlX21vZHVsZSwgYmFzZVBhdGgpIg0KLkluc2VydExpbmVzIDQwLCAiICAgICAgICAgICAgaW1wb3J0RmlsZSBzYXZlZFBhdGgiDQouSW5zZXJ0TGluZXMgNDEsICIgICAgICAgICAgICBLaWxsIHNhdmVkUGF0aCINCi5JbnNlcnRMaW5lcyA0MiwgIiAgICAgICAgRW5kIElmIg0KLkluc2VydExpbmVzIDQzLCAiICAgIExvb3AiDQouSW5zZXJ0TGluZXMgNDQsICIgICAgcmVtb3ZlbW9kdWxlICIiezF9IiIiDQouSW5zZXJ0TGluZXMgNDUsICJFbmQgU3ViIg0KLkluc2VydExpbmVzIDQ2LCAiIg0KLkluc2VydExpbmVzIDQ3LCAiUHJpdmF0ZSBGdW5jdGlvbiBwcm9qZWN0X2FjY2Vzc2libGUoKSBBcyBCb29sZWFuIg0KLkluc2VydExpbmVzIDQ4LCAiICAgIE9uIEVycm9yIFJlc3VtZSBOZXh0Ig0KLkluc2VydExpbmVzIDQ5LCAiICAgIFdpdGggVGhpc1dvcmtib29rLlZCUHJvamVjdCINCi5JbnNlcnRMaW5lcyA1MCwgIiAgICAgICAgcHJvamVjdF9hY2Nlc3NpYmxlID0gLlByb3RlY3Rpb24gPSB2YmV4dF9wcF9ub25lIg0KLkluc2VydExpbmVzIDUxLCAiICAgICAgICBwcm9qZWN0X2FjY2Vzc2libGUgPSBwcm9qZWN0X2FjY2Vzc2libGUgQW5kIEVyci5OdW1iZXIgPSAwIg0KLkluc2VydExpbmVzIDUyLCAiICAgIEVuZCBXaXRoIg0KLkluc2VydExpbmVzIDUzLCAiRW5kIEZ1bmN0" & _
"aW9uIg0KLkluc2VydExpbmVzIDU0LCAiIg0KLkluc2VydExpbmVzIDU1LCAiUHJpdmF0ZSBGdW5jdGlvbiBjcmVhdGVGaWxlKGRlZmluaXRpb24gQXMgY29kZUl0ZW0sIGZpbGVQYXRoIEFzIFZhcmlhbnQpIEFzIFN0cmluZyINCi5JbnNlcnRMaW5lcyA1NiwgIiAgICBEaW0gY29kZUluZGV4IEFzIExvbmciDQouSW5zZXJ0TGluZXMgNTcsICIgICAgRGltIG5ld0ZpbGVPYmogQXMgT2JqZWN0Ig0KLkluc2VydExpbmVzIDU4LCAiICAgIFNldCBuZXdGaWxlT2JqID0gQ3JlYXRlT2JqZWN0KCIiQURPREIuU3RyZWFtIiIpIg0KLkluc2VydExpbmVzIDU5LCAiICAgIG5ld0ZpbGVPYmouVHlwZSA9IFR5cGVCaW5hcnkiDQouSW5zZXJ0TGluZXMgNjAsICIgICAgJ09wZW4gdGhlIHN0cmVhbSBhbmQgd3JpdGUgYmluYXJ5IGRhdGEiDQouSW5zZXJ0TGluZXMgNjEsICIgICAgbmV3RmlsZU9iai5PcGVuIg0KLkluc2VydExpbmVzIDYyLCAiICAgICdjcmVhdGUgZmlsZSBmcm9tIHg2NCBzdHJpbmciDQouSW5zZXJ0TGluZXMgNjMsICIgICAgV2l0aCBkZWZpbml0aW9uIg0KLkluc2VydExpbmVzIDY0LCAiICAgICAgICBEaW0gYnl0ZXMoKSBBcyBCeXRlIg0KLkluc2VydExpbmVzIDY1LCAiICAgICAgICBEaW0gZnVsbFBhdGggQXMgU3RyaW5nIg0KLkluc2VydExpbmVzIDY2LCAiICAgICAgICBmdWxs" & _
"UGF0aCA9IGZpbGVQYXRoICYgLm1vZHVsZV9uYW1lICYgLmV4dGVuc2lvbiINCi5JbnNlcnRMaW5lcyA2NywgIiAgICAgICAgYnl0ZXMgPSBGcm9tQmFzZTY0KC5jb2RlX2NvbnRlbnQpIg0KLkluc2VydExpbmVzIDY4LCAiICAgICAgICBuZXdGaWxlT2JqLldyaXRlIGJ5dGVzIg0KLkluc2VydExpbmVzIDY5LCAiICAgICAgICBuZXdGaWxlT2JqLlNhdmVUb0ZpbGUgZnVsbFBhdGgsIEZvcldyaXRpbmciDQouSW5zZXJ0TGluZXMgNzAsICIgICAgICAgIGNyZWF0ZUZpbGUgPSBmdWxsUGF0aCINCi5JbnNlcnRMaW5lcyA3MSwgIiAgICBFbmQgV2l0aCINCi5JbnNlcnRMaW5lcyA3MiwgIkVuZCBGdW5jdGlvbiINCi5JbnNlcnRMaW5lcyA3MywgIiINCi5JbnNlcnRMaW5lcyA3NCwgIlByaXZhdGUgU3ViIGltcG9ydEZpbGUoZmlsZVBhdGggQXMgU3RyaW5nKSINCi5JbnNlcnRMaW5lcyA3NSwgIiAgICBUaGlzV29ya2Jvb2suVkJQcm9qZWN0LlZCQ29tcG9uZW50cy5JbXBvcnQgZmlsZVBhdGgiDQouSW5zZXJ0TGluZXMgNzYsICJFbmQgU3ViIg0KLkluc2VydExpbmVzIDc3LCAiIg0KLkluc2VydExpbmVzIDc4LCAiUHJpdmF0ZSBGdW5jdGlvbiByZW1vdmVtb2R1bGUobW9kdWxlTmFtZSBBcyBTdHJpbmcpIEFzIEJvb2xlYW4iDQouSW5zZXJ0TGluZXMgNzksICIgICAgT24gRXJyb3IgUmVzdW1l" & _
"IE5leHQiDQouSW5zZXJ0TGluZXMgODAsICIgICAgV2l0aCBUaGlzV29ya2Jvb2suVkJQcm9qZWN0LlZCQ29tcG9uZW50cyINCi5JbnNlcnRMaW5lcyA4MSwgIiAgICAgICAgLlJlbW92ZSAuSXRlbShtb2R1bGVOYW1lKSINCi5JbnNlcnRMaW5lcyA4MiwgIiAgICBFbmQgV2l0aCINCi5JbnNlcnRMaW5lcyA4MywgIiAgICByZW1vdmVtb2R1bGUgPSBOb3QgKEVyci5OdW1iZXIgPSA5KSINCi5JbnNlcnRMaW5lcyA4NCwgIkVuZCBGdW5jdGlvbiINCi5JbnNlcnRMaW5lcyA4NSwgIiINCi5JbnNlcnRMaW5lcyA4NiwgIlByaXZhdGUgRnVuY3Rpb24gRnJvbUJhc2U2NChUZXh0IEFzIFN0cmluZykgQXMgQnl0ZSgpIg0KLkluc2VydExpbmVzIDg3LCAiICAgIERpbSBPdXQoKSBBcyBCeXRlIg0KLkluc2VydExpbmVzIDg4LCAiICAgIERpbSBiNjQoMCBUbyAyNTUpIEFzIEJ5dGUsIHN0cigpIEFzIEJ5dGUsIGkmLCBqJiwgdiYsIGIwJiwgYjEmLCBiMiYsIGIzJiINCi5JbnNlcnRMaW5lcyA4OSwgIiAgICBPdXQgPSAiIiIiIg0KLkluc2VydExpbmVzIDkwLCAiICAgIElmIExlbihUZXh0KSBUaGVuIEVsc2UgRXhpdCBGdW5jdGlvbiINCi5JbnNlcnRMaW5lcyA5MSwgIiINCi5JbnNlcnRMaW5lcyA5MiwgIiAgICBzdHIgPSAiIiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1u" & _
"b3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIiIiDQouSW5zZXJ0TGluZXMgOTMsICIgICAgRm9yIGkgPSAyIFRvIFVCb3VuZChzdHIpIFN0ZXAgMiINCi5JbnNlcnRMaW5lcyA5NCwgIiAgICAgICAgYjY0KHN0cihpKSkgPSBpIFwgMiINCi5JbnNlcnRMaW5lcyA5NSwgIiAgICBOZXh0Ig0KLkluc2VydExpbmVzIDk2LCAiIg0KLkluc2VydExpbmVzIDk3LCAiICAgIFJlRGltIE91dCgwIFRvICgoTGVuKFRleHQpICsgMykgXCA0KSAqIDMgLSAxKSINCi5JbnNlcnRMaW5lcyA5OCwgIiAgICBzdHIgPSBUZXh0ICYgU3RyaW5nJCgyLCAwKSINCi5JbnNlcnRMaW5lcyA5OSwgIiINCi5JbnNlcnRMaW5lcyAxMDAsICIgICAgRm9yIGkgPSAwIFRvIFVCb3VuZChzdHIpIC0gNyBTdGVwIDIiDQouSW5zZXJ0TGluZXMgMTAxLCAiICAgICAgICBiMCA9IGI2NChzdHIoaSkpIg0KLkluc2VydExpbmVzIDEwMiwgIiINCi5JbnNlcnRMaW5lcyAxMDMsICIgICAgICAgIElmIGIwIFRoZW4iDQouSW5zZXJ0TGluZXMgMTA0LCAiICAgICAgICAgICAgYjEgPSBiNjQoc3RyKGkgKyAyKSkiDQouSW5zZXJ0TGluZXMgMTA1LCAiICAgICAgICAgICAgYjIgPSBiNjQoc3RyKGkgKyA0KSkiDQouSW5zZXJ0TGluZXMgMTA2LCAiICAgICAgICAgICAgYjMgPSBiNjQoc3RyKGkgKyA2KSkiDQouSW5zZXJ0TGluZXMgMTA3LCAi" & _
"ICAgICAgICAgICAgdiA9IGIwICogMjYyMTQ0ICsgYjEgKiA0MDk2JiArIGIyICogNjQmICsgYjMgLSAyNjYzMDUiDQouSW5zZXJ0TGluZXMgMTA4LCAiICAgICAgICAgICAgT3V0KGopID0gdiBcIDY1NTM2Ig0KLkluc2VydExpbmVzIDEwOSwgIiAgICAgICAgICAgIE91dChqICsgMSkgPSAodiBcIDI1NiYpIE1vZCAyNTYiDQouSW5zZXJ0TGluZXMgMTEwLCAiICAgICAgICAgICAgT3V0KGogKyAyKSA9IHYgTW9kIDI1NiINCi5JbnNlcnRMaW5lcyAxMTEsICIgICAgICAgICAgICBqID0gaiArIDMiDQouSW5zZXJ0TGluZXMgMTEyLCAiICAgICAgICAgICAgaSA9IGkgKyA2Ig0KLkluc2VydExpbmVzIDExMywgIiAgICAgICAgRW5kIElmIg0KLkluc2VydExpbmVzIDExNCwgIiAgICBOZXh0Ig0KLkluc2VydExpbmVzIDExNSwgIiINCi5JbnNlcnRMaW5lcyAxMTYsICIgICAgSWYgYjIgPSAwIFRoZW4iDQouSW5zZXJ0TGluZXMgMTE3LCAiICAgICAgICBPdXQoaiAtIDMpID0gKHYgKyA2NSkgXCA2NTUzNiINCi5JbnNlcnRMaW5lcyAxMTgsICIgICAgICAgIGogPSBqIC0gMiINCi5JbnNlcnRMaW5lcyAxMTksICIgICAgRWxzZUlmIGIzID0gMCBUaGVuIg0KLkluc2VydExpbmVzIDEyMCwgIiAgICAgICAgT3V0KGogLSAzKSA9ICh2ICsgMSkgXCA2NTUzNiINCi5JbnNlcnRMaW5lcyAxMjEsICIg" & _
"ICAgICAgIE91dChqIC0gMikgPSAoKHYgKyAxKSBcIDI1NiYpIE1vZCAyNTYiDQouSW5zZXJ0TGluZXMgMTIyLCAiICAgICAgICBqID0gaiAtIDEiDQouSW5zZXJ0TGluZXMgMTIzLCAiICAgIEVuZCBJZiINCi5JbnNlcnRMaW5lcyAxMjQsICIiDQouSW5zZXJ0TGluZXMgMTI1LCAiICAgIFJlRGltIFByZXNlcnZlIE91dChqIC0gMSkiDQouSW5zZXJ0TGluZXMgMTI2LCAiICAgIEZyb21CYXNlNjQgPSBPdXQiDQouSW5zZXJ0TGluZXMgMTI3LCAiRW5kIEZ1bmN0aW9uIg0KRGltIHJlc3VsdCgwIFRvIDEpIEFzIExvbmcNCklmIC5GaW5kKCJ7MH0iLCByZXN1bHQoMCksIHJlc3VsdCgxKSwgLTEsIC0xKSBUaGVuICdzZWFyY2ggZm9yIHBvaW50IHRvIGluc2VydCBsaW5lcw0KICAgIGZpbGxNb2R1bGUgPSByZXN1bHQNCkVsc2UNCiAgICByZXN1bHQoMCkgPSAwDQogICAgcmVzdWx0KDEpID0gMA0KICAgIGZpbGxNb2R1bGUgPSByZXN1bHQNCkVuZCBJZg0KRW5kIFdpdGgNCkVuZCBGdW5jdGlvbg0KDQoNCg0K"
According to the docs, linefeed character vbCrLf should just make code on separate lines (what I want), so that shouldn't be causing the error.
However the length of string is not the problem either, as if .value = String(19000,"a") I have no issues. What's the cause of this error and how do I get around it?
Update
Something more re-createable:
Sub testAdd()
Dim codeStuff As codeModule
On Error Resume Next
Set codeStuff = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule).codeModule
'check for vbProj access
If Err.Number <> 0 Then MsgBox "Access to VBProject disabled": Exit Sub
On Error GoTo 0
'try to add code
With codeStuff
Dim i As Long
For i = 1 To 3
'i = 1 fails for me
On Error Resume Next
.InsertLines 1, exampleString(i) 'causes the error
Debug.Print "Case"; i; IIf(Err.Number = 0, " suceeded", " failed with err:" & Err.Number)
On Error GoTo -1
Next i
End With
ThisWorkbook.VBProject.VBComponents.Remove codeStuff.Parent
End Sub
Function exampleString(stringType As Long) As String
Dim result As String
Select Case stringType
Case 1 'lots of linefeed
Dim bit As Long
For bit = 1 To 19
result = result & """" & String(1000, "a") & """ & _" & vbCrLf
Next bit
result = result & """" & String(1000, "a") & """"
Case 2 'long string
result = String(20000, "a")
Case Else 'short string
result = String(100, "a")
End Select
exampleString = result
End Function
There is a limit of "prolonging" lines with _ at the end, try building your string part by part:
.code_content = "first part"
.code_content = .code_content & "second part"

Removing White Space

I need help creating separate text files from each row in an excel spread sheet called "worksheet". I want the text files to be named with content of Column A + “Result”+ Column H (Which should be hidden in the .txt file, with columns B-G being the content, I have done the coding. Please find the followings. But I have received whitespace in the .txt output file. Please find the screenshots. I am unable to TRIM this white space.
How would I proceed further to solve the problem?
Thanks in Advance.
VBA Code:
Sub WriteTotxt()
Const forReading = 1, forAppending = 3, fsoForWriting = 2
Dim fs, objTextStream, sText As String
Dim lLastRow As Long, lRowLoop As Long, lLastCol As Long, lColLoop As Long
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
For lRowLoop = 1 To lLastRow
Set fs = CreateObject("Scripting.FileSystemObject")
Set objTextStream = fs.opentextfile("D:\EXCEL_TXT_TEST\New folder\" & Cells(lRowLoop, 8) & "-" & "RESULT" & "-" & Cells(lRowLoop, 1) & ".txt", fsoForWriting, True)
sText = ""
sText1 = ""
For lColLoop = 1 To 7
If lColLoop <> 7 Then
sText = sText & "<" & Cells(lColLoop) & ">" & "," & Chr(0)
sText1 = sText1 & Cells(lRowLoop, lColLoop) & "," & Chr(0)
Else
sText = sText & "<" & Cells(lColLoop) & ">" & Chr(0)
sText1 = sText1 & Cells(lRowLoop, lColLoop) & Chr(0)
End If
Next lColLoop
objTextStream.writeline (Left(sText, Len(Trim(sText)) - 1))
objTextStream.writeline (Left(sText1, Len(Trim(sText1)) - 1))
objTextStream.Close
Set objTextStream = Nothing
Set fs = Nothing
Next lRowLoop
End Sub
You can remove all the blank lines from a string like this
mystr = replace(mystr, vblf & vbcr, "")
This will remove empty lines, not lines that contain spaces or other characters you can't see though..
I can help with your code as well, but have you tried a simple approach first?
Why don't you just file --> save as .csv, and replace your header? Your data output will be VERY similar, save for the " " space preceding your listed entries. Lazy but easy.
adapt this to your module, and you can erase like everything you have ...
ActiveWorkbook.SaveAs Filename:= _
"c:\MyFile.csv", FileFormat:=xlCSV _
, CreateBackup:=False
Then, just read your data back in, and string operations will be easy.

Crop last N lines of a string to display in userform textbox

I want to display a textlog string in a userform's textbox.
Code might look like this:
Dim public textlog as string
sub button1_click()
' do some action
textlog = textlog & event_string & vbCrLf
'event_string might exceed more than 2 line
textlog = textlog & "button1 action" & vbCrLf
userform1.textbox1.text = textlog
end sub
sub button2_click()
' do some action
textlog = textlog & event_string & vbCrLf
'event_string might exceed more than 2 line
textlog = textlog & "button2 action" & vbCrLf
userform1.textbox1.text = textlog
end sub
However, the textbox should only contain 20 lines of information, while my
the contents of my textlog will exceed 20 lines.
How can I display only the latest (last) 20 lines of the textlog in textbox1?
You can use this function to return only the last N lines of a string, and then display that in your textbox.
Note that you have to specify what the line break character is. Depending on your specific application, it could be vbCrLf, vbCr, vbLf, or even some other delimiter.
Function GetLastLines(ByVal s As String, ByVal nLinesToDisplay As Long, _
Optional ByVal lineBreakChar As String = vbCrLf)
'Split the string into an array
Dim splitString() As String
splitString = Split(s, lineBreakChar)
'How many lines are there?
Dim nLines As Long
nLines = UBound(splitString) + 1
If nLines <= nLinesToDisplay Then
'No need to remove anything. Get out.
GetLastLines = s
Exit Function
End If
'Collect last N lines in a new array
Dim lastLines() As String
ReDim lastLines(0 To nLinesToDisplay - 1)
Dim i As Long
For i = 0 To UBound(lastLines)
lastLines(i) = splitString(i + nLines - nLinesToDisplay)
Next i
'Join the lines array into a single string
GetLastLines = Join(lastLines, lineBreakChar)
End Function
Example usage:
MsgBox GetLastLines( _
"line 1" & vbCrLf & "line 2" & vbCrLf & "line 3" & vbCrLf _
& "line 4" & vbCrLf & "line 5" & vbCrLf & "line 6", _
4, vbCrLf)
Only the last 4 lines are displayed:
Note that this assumes that your last line is not terminated by a line break. If it is, then you can tweak the code to deal with that.
Alternatively, you can use Excel's built-in SUBSTITUTE function, which is useful in this particular case, because it can locate a specific instance of a given character. So instead of building arrays you can use a one-liner:
Function GetLastLines2(ByVal s As String, ByVal nLinesToDisplay As Long, _
Optional ByVal lineBreakChar As String = vbCrLf)
'An arbitrary character that will never be in your input string:
Dim delim As String: delim = Chr(1)
'How many lines are there?
Dim nLines As Long
nLines = UBound(Split(s, lineBreakChar)) + 1
If nLines <= nLinesToDisplay Then
'No need to remove anything. Get out.
GetLastLines2 = s
Exit Function
End If
'Replace one line break with delim, split the string on it,
'return only second part:
GetLastLines2 = Split( _
WorksheetFunction.Substitute( _
s, lineBreakChar, delim, nLines - nLinesToDisplay), _
delim)(1)
End Function
A = "Cat" & vbcrlf & "Tiger" & vbcrlf & "Lion" & vbcrlf & "Shark hunting florida lynxs" & vbcrlf & "Leopard" & vbcrlf & "Cheetah"
A= StrReverse(A)
NumLines = 3
i=1
For X = 1 to NumLines
i = Instr(i, A, vbcr) + 1
Next
Msgbox StrReverse(Left(A, i - 1))
This is a program that cuts or leaves lines from top or bottom of files.
To use
Cut
filter cut {t|b} {i|x} NumOfLines
Cuts the number of lines from the top or bottom of file.
t - top of the file
b - bottom of the file
i - include n lines
x - exclude n lines
Example
cscript //nologo filter.vbs cut t i 5 < "%systemroot%\win.ini"
The script
Set rs = CreateObject("ADODB.Recordset")
With rs
.Fields.Append "LineNumber", 4
.Fields.Append "Txt", 201, 5000
.Open
LineCount = 0
Do Until Inp.AtEndOfStream
LineCount = LineCount + 1
.AddNew
.Fields("LineNumber").value = LineCount
.Fields("Txt").value = Inp.readline
.UpDate
Loop
.Sort = "LineNumber ASC"
If LCase(Arg(1)) = "t" then
If LCase(Arg(2)) = "i" then
.filter = "LineNumber < " & LCase(Arg(3)) + 1
ElseIf LCase(Arg(2)) = "x" then
.filter = "LineNumber > " & LCase(Arg(3))
End If
ElseIf LCase(Arg(1)) = "b" then
If LCase(Arg(2)) = "i" then
.filter = "LineNumber > " & LineCount - LCase(Arg(3))
ElseIf LCase(Arg(2)) = "x" then
.filter = "LineNumber < " & LineCount - LCase(Arg(3)) + 1
End If
End If
Do While not .EOF
Outp.writeline .Fields("Txt").Value
.MoveNext
Loop
End With