Talk:Microsoft Word Macros
Converting Embedded Images
edit--Rigolo 09:43, 29 March 2006 (UTC) says:
I encounter a lot of word documents that have embedded images in the text. When using these word macro's these images are "lost" and there is also no information in the converted document to identify where these images where in the text. So when you need to convert a lot of documents with embedded images it takes a long time to extract the images and place them correctly in the new wiki document.
I would like to propose the following:
In word you can save a document as HTML. This will create a seperate "folder" with all the embedded images as seperate PNG files. These images are numbered from 1 to n. This might be a quick way of converting all embedded images to files that can be uploaded to a wiki. The drawback is that the images are always numbered from 1 to n for each document and do not get a unique name.
This does not yet solve the reference to these images in the converted document. I noticed that you can use the VBA functions to select the embedded images. These images are either "Shape" objects or "InLineShapes". A function could be written that will loop through all the shapes in the document and replaces it with a [[Image:<name>]] tag where the <name> could be a generic name based on the file-name and sequence number. This way you know at least where your images should be located in the wiki document. Than all that is left is upload the pictures to the wiki.
I also found a project that can extract the image information from a word document with the original resolution. This is code that was created by Stephen Lebans and can be found on his web page web page under the file section Word.zip
Table Conversion Update
editA slightly different way of doing tables that takes colspanning into account. 207.93.211.186 00:40, 18 October 2005 (UTC)
' Convertion des tables Sub wp_wiki_tableau() Dim tableau As Table Dim aRange As Range For Each tableau In ActiveDocument.Tables Dim i As Integer Dim j As Integer Dim totalCols As Integer Dim strCellSep As String ' keep the total rows in a separate variable for ' column spanning totalCols = tableau.Columns.Count For i = 1 To tableau.Rows.Count For j = 1 To tableau.Rows(i).Cells.Count Selection.Find.ClearFormatting ' ' First row will always be considered a header ' All other rows are tabular data. ' If i = 1 Then strCellSep = "!" Else strCellSep = "|" End If ' ' possible column spanning ' If ((j = tableau.Rows(i).Cells.Count) And (j < totalCols)) Then 'irritatingly, the formatting separator is always a pipe tableau.Cell(i, j).Range.InsertBefore " colspan=" & totalCols - j + 1 & "|" End If If j <= tableau.Rows(i).Cells.Count Then tableau.Cell(i, j).Range.InsertBefore strCellSep End If If j = 1 Then If i = 1 Then tableau.Cell(i, j).Range.InsertBefore "{| border=1 cellspacing=0 " & vbCrLf Else tableau.Cell(i, j).Range.InsertBefore "|- " & vbCrLf End If End If If j < tableau.Rows(i).Cells.Count Then tableau.Cell(i, j).Range.InsertAfter " " & strCellSep End If Next j ' tableau.Cell(i, tableau.Columns.Count).Range.InsertAfter vbCrLf & "|" Next i tableau.Cell(tableau.Rows.Count, tableau.Columns.Count).Range.InsertAfter vbCrLf & "|} " Set aRange = tableau.ConvertToText(Separator:="*") aRange.Style = wdStylePlainText 'teste si une ligne a bien été laissée avant et après le tableau If aRange.Start > 2 Then If ActiveDocument.Characters(aRange.Start - 2) <> Chr(13) Then aRange.InsertBefore Chr(13) End If End If ' If ActiveDocument.Characters(aRange.End + 1) <> Chr(13) Then ' aRange.InsertAfter Chr(13) ' End If Next tableau RemplaceSeparateurEtoile End Sub
Word2Wiki 2006-03-22
editI had trouble getting other versions to work, so I cleaned this one up. Enjoy. -GaryLacey 20:56, 22 March 2006 (UTC)
Sub Word2Wiki() Application.ScreenUpdating = False ConvertHeading 1 ConvertHeading 2 ConvertHeading 3 ConvertHeading 4 ConvertHeading 5 ConvertItalic ConvertBold ConvertUnderline ConvertLists ConvertTables ActiveDocument.Content.Copy ' copy to clipboard Application.ScreenUpdating = True End Sub Private Sub ConvertHeading(aHeading As Integer) Dim normalStyle As Style Set normalStyle = ActiveDocument.Styles(wdStyleNormal) ActiveDocument.Select With Selection.Find .ClearFormatting .Style = ActiveDocument.Styles(-1 - aHeading) .Text = "" .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Forward = True .Wrap = wdFindContinue Do While .Execute With Selection If InStr(1, .Text, vbCr) Then ' just process the chunk before newline characters ' pick-up the rest with the next search .Collapse .MoveEndUntil vbCr End If ' don't bother to markup newline characters (prevents a loop, as well) If Not .Text = vbCr Then .InsertBefore String(1 + aHeading, "=") .InsertAfter String(1 + aHeading, "=") End If .Style = normalStyle End With Loop End With End Sub Private Sub ConvertBold() ActiveDocument.Select With Selection.Find .ClearFormatting .Font.Bold = True .Text = "" .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Forward = True .Wrap = wdFindContinue Do While .Execute With Selection If InStr(1, .Text, vbCr) Then ' just process the chunk before newline characters ' pick-up the rest with the next search .Font.Bold = False .Collapse .MoveEndUntil vbCr End If ' don't bother to markup newline characters - prevent a loop If Not .Text = vbCr Then .InsertBefore "'''" .InsertAfter "'''" End If .Font.Bold = False End With Loop End With End Sub Private Sub ConvertItalic() ActiveDocument.Select With Selection.Find .ClearFormatting .Font.Italic = True .Text = "" .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Forward = True .Wrap = wdFindContinue Do While .Execute With Selection If InStr(1, .Text, vbCr) Then ' just process the chunk before newline characters ' pick-up the rest with the next search .Font.Italic = False .Collapse .MoveEndUntil vbCr End If ' don't bother to markup newline characters - prevent a loop If Not .Text = vbCr Then .InsertBefore "''" .InsertAfter "''" End If .Font.Italic = False End With Loop End With End Sub Private Sub ConvertUnderline() ActiveDocument.Select With Selection.Find .ClearFormatting .Font.Underline = True .Text = "" .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Forward = True .Wrap = wdFindContinue Do While .Execute With Selection If InStr(1, .Text, vbCr) Then ' just process the chunk before newline characters ' pick-up the rest with the next search .Font.Underline = False .Collapse .MoveEndUntil vbCr End If ' don't bother to markup newline characters - prevent a loop If Not .Text = vbCr Then .InsertBefore "<u>" .InsertAfter "</u>" End If .Font.Underline = False End With Loop End With End Sub Private Sub ConvertLists() Dim para As Paragraph Dim i As Integer For Each para In ActiveDocument.ListParagraphs With para.Range .InsertBefore " " For i = 1 To .ListFormat.ListLevelNumber If .ListFormat.ListType = wdListBullet Then .InsertBefore "*" Else .InsertBefore "#" End If Next i .ListFormat.RemoveNumbers End With Next para End Sub Private Sub ConvertTables() Dim aTable As Table Dim aRange As Range For Each aTable In ActiveDocument.Tables Set aRange = aTable.ConvertToText(Separator:=wdSeparateByTabs) With aRange .InsertBefore "!" ' header row ' convert rows to |- .Find.Execute _ FindText:="^p", _ ReplaceWith:="^p|-^p|", _ Format:=True, _ Replace:=wdReplaceAll, _ MatchControl:=True ' convert column tabs to || .Find.Execute _ FindText:="^t", _ ReplaceWith:="||", _ Format:=True, _ Replace:=wdReplaceAll, _ MatchControl:=True .InsertParagraphBefore .InsertBefore "{| class='wikitable'" .InsertAfter ("|}") ' fix last row .Find.Execute _ FindText:="^p|-^p||}", _ ReplaceWith:="^p|}", _ Format:=True, _ Replace:=wdReplaceOne, _ MatchControl:=True '.Select Selection.ClearFormatting End With Next aTable End Sub
Mediawiki -> Word converter?
editIt would be useful to have a converter the other way, in order to use Word as a WYSIWYG editor. Anyone know of such a thing? (if someone replies ages from now, a message on my talk page would be great.) Stevage 08:22, 22 May 2006 (UTC)
Can't convert
editGreetings,
I have tried the macros to convert Word to MediaWiki, but I invariably get errors, with a numeric code (Word2Wiki) or without (compiler error、 "cant reduce argument" - Word2MediaWiki). I have a number tables with colspan and rowspan, plus some special character, like the "forced space" before colon or semicolon, which occurs in French documents.
Can somebody help? Thanks in advance. --Mahlerite 08:50, 3 February 2008 (UTC)
A single, definitive version
editIt would be great to have a single, definitive version that does everything in one pass. Now that footnotes can be converted (Word macros#ReadFootnotes) that function should be included.
Anyone have experience of which work and which don't? I'm running Linux, so I can't try them myself. --Chriswaterguy 01:00, 1 July 2008 (UTC)
- Word2MediaWikiPlus does alot of stuff in one package. Check out the Word2MediaWikiPlus SVN repository too. There's a bunch more updated stuff in there that isn't in the packaged release. --Cneubauer 12:31, 1 July 2008 (UTC)
- Okay - I gather this requires an installation of MediaWiki with this extension installed, whereas the macros can be run on any machine with MS Word?
- I'm adding a note to the Word2MediaWikiPlus Feature Requests Tracker about footnotes - hopefully the ReadFootnotes code is of some holp in achieving this. --Chriswaterguy 20:59, 6 July 2008 (UTC)