Last active
January 19, 2019 19:51
-
-
Save sandraros/eff5869b60ab1639efa3f2ca16652043 to your computer and use it in GitHub Desktop.
VBA macro to paste into MS Word, which converts text lines with tab characters representing tables into tables without tab, but instead with values right-padded with spaces (markdown version too) so that to fit perfectly for usage of HTML <pre>...</pre>
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Rem 1) select the text lines representing a table whose columns are separated by the tab character | |
Rem 2) run this macro | |
Rem 3) result: the tab characters are replaced by two or more space characters such a way each column | |
Rem has the same number of characters | |
Rem 4) you may then copy/paste those text lines inside HTML <pre>...</pre> it will look like a table | |
Sub tabs_to_spaces() | |
Dim par As Paragraph | |
Dim pars() As Paragraph | |
Dim arr(50) As Integer ' 50 tabs maximum per line | |
Application.ScreenUpdating = False | |
max_ztab = -1 | |
For Each par In Selection.Paragraphs | |
old_x = 1 | |
ztab = LBound(arr) | |
Do While old_x <> 0 | |
x = InStr(old_x, par.Range.Text, Chr(9)) | |
If x = 0 Then | |
zlen = Len(par.Range.Text) - old_x + 1 | |
Else | |
zlen = x - old_x | |
End If | |
If zlen > arr(ztab) Then arr(ztab) = zlen | |
If ztab > max_ztab Then max_ztab = ztab | |
ztab = ztab + 1 | |
If x = 0 Then | |
Exit Do | |
Else | |
old_x = x + 1 | |
End If | |
Loop | |
Next | |
ReDim pars(Selection.Paragraphs.Count) | |
For i = 1 To Selection.Paragraphs.Count | |
Set pars(i) = Selection.Paragraphs(i) | |
Next | |
For i = 1 To UBound(pars) | |
Set par = pars(i) | |
old_x = 1 | |
ztab = LBound(arr) | |
Do | |
x = InStr(old_x, par.Range.Text, Chr(9)) | |
If x = 0 Then | |
Exit Do | |
End If | |
Call par.Range.Characters(x).Delete | |
zlen = arr(ztab) - (x - old_x) + 2 ' + 2 spaces between each column | |
ztab = ztab + 1 | |
Call par.Range.Characters(x).InsertBefore(Space(zlen)) | |
old_x = x + zlen | |
Loop | |
Next | |
Application.ScreenUpdating = True | |
End Sub | |
Sub tabs_to_markdown() | |
Dim par As Paragraph | |
Dim pars() As Paragraph | |
Dim arr(50) As Integer ' 50 tabs maximum per line | |
Application.ScreenUpdating = False | |
' calculate array "arr" containing column widths, and max_ztab | |
max_ztab = -1 | |
For Each par In Selection.Paragraphs | |
old_x = 1 | |
ztab = LBound(arr) | |
Do While old_x <> 0 | |
x = InStr(old_x, par.Range.Text, Chr(9)) | |
If x = 0 Then | |
zlen = Len(par.Range.Text) - old_x + 1 | |
Else | |
zlen = x - old_x | |
End If | |
If zlen > arr(ztab) Then arr(ztab) = zlen | |
If ztab > max_ztab Then max_ztab = ztab | |
ztab = ztab + 1 | |
If x = 0 Then | |
Exit Do | |
Else | |
old_x = x + 1 | |
End If | |
Loop | |
Next | |
ReDim pars(Selection.Paragraphs.Count) | |
For i = 1 To Selection.Paragraphs.Count | |
Set pars(i) = Selection.Paragraphs(i) | |
Next | |
For i = 1 To UBound(pars) ' CAUTION must be 1, not lbound(pars) | |
Set par = pars(i) | |
Call par.Range.InsertBefore("| ") | |
old_x = 1 + Len("| ") | |
ztab = LBound(arr) | |
While old_x < par.Range.Characters.Count | |
' get the position of the next TAB character | |
x = InStr(old_x, par.Range.Text, Chr(9)) | |
If x <> 0 Then | |
' delete the TAB character | |
Call par.Range.Characters(x).Delete | |
Else | |
x = par.Range.Characters.Count | |
End If | |
' insert | |
column_right = Space(arr(ztab) - (x - old_x) + 1) + "| " | |
Call par.Range.Characters(x).InsertBefore(column_right) | |
old_x = x + Len(column_right) | |
' next column | |
ztab = ztab + 1 | |
Wend | |
Next | |
Application.ScreenUpdating = True | |
End Sub |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment