#1
|
|||
|
|||
Save As new file type
I'm a VBA novice. I'm having trouble with SaveAs2. I need to open in Word HTM/HTML documents in a specific folder, then save them as .docx with the same filename in the same folder. I have usable code to open said files in Word, but I can't get the SaveAs feature to work. I've tried various different lines of code found online, but have encountered various errors. Any thoughts on the easiest method?
Thanks. |
#2
|
|||
|
|||
You want to save an html as as word document?
I did this conversion with the following: Code:
Sub saveHtmlAsDocx() Dim d As Document Set d = Documents.Open("C:\scratch\test.html") Dim newfile As String newfile = Replace(d, ".html", ".docx") d.SaveAs2 newfile, FileFormat:=wdFormatDocumentDefault End Sub |
#3
|
|||
|
|||
Thanks, but it looks like I may not have been perfectly clear.
I need a macro to open every HTM or HTML file in a specific folder and convert them all, saved in the same folder with the original file name. I have part of the VBA enough to open and close the files throughout the directory (copied from a macro from another process of mine), but am missing the steps to save a copy as a Word doc. The "Call to SaveAsDocx" part is what I can't figure out. Code:
Sub ConvertHTMLtoDOC() Dim file Dim path As String ' Path to your folder. Make SURE you include the terminating "\" 'YOU MUST EDIT THIS. path = "\\MYPATH" 'Change this file extension to the file you are opening. .htm is listed below. 'YOU MAY NEED TO EDIT THIS. file = Dir(path & "*.htm*") Do While file <> "" Documents.Open FileName:=path & file ' This is the call to the macro you want to run on each file the folder Call SaveAsDocx ActiveDocument.Close ' set file to next in Dir file = Dir() Loop End Sub |
#4
|
|||
|
|||
How about something like this? I think you need to pass the document to the SaveAsDoc function.
Code:
Sub SaveAsDoc(d As Document) Dim newfile As String If InStrRev(d.Name, ".html") > 0 Then newfile = Replace(d, ".html", ".doc") ElseIf InStrRev(d.Name, ".htm") > 0 Then newfile = Replace(d, ".htm", ".doc") End If d.SaveAs2 newfile, FileFormat:=wdFormatDocument97 End Sub Sub ConvertHTMLtoDOC() Dim file Dim path As String path = "C:\scratch\" file = Dir(path & "*.htm*") Do While file <> "" Dim d As Document Set d = Documents.Open(file) Call SaveAsDoc(d) d.Close file = Dir() Loop End Sub |
#5
|
|||
|
|||
I'm getting an error on this.
"Run-time error '5174: Sorry, we couldn't find your file. Is it possible it was moved, renamed, or deleted?" Then it lists the first file in the folder. Debug highlights the "Set d = Documents.Open (file)" line. |
#6
|
|||
|
|||
Maybe pass the entire path to the Open function:
Set d = Documents.Open(path & file) |
#7
|
|||
|
|||
Word clocks for a while like it's trying to do something, but there are no results.
I appreciate your help so far! |
#8
|
|||
|
|||
You may be missing a backslash between the directory name and the filename.
You could try this instead, but I'm not sure: Set d = Documents.Open(path & "\" & file) It could be something else though. Do you know how to use the Immediate Window. If you place this line of code... Code:
Debug.Print path & "\" & file Btw, how many files are you trying to convert. If it's in the 100s, it could just be taking a long time to save them all. |
#9
|
||||
|
||||
The issue is primarily related to the filename. What you need is
Code:
Sub ConvertHTMLtoDOC() Dim strFile As String Dim strPath As String Dim strDocName As String Dim oDoc As Document strPath = "C:\scratch\" strFile = Dir(strPath & "*.htm*") Do While strFile <> "" Set oDoc = Documents.Open(strPath & strFile) 'This line needs to include the path strDocName = Left(oDoc.FullName, InStrRev(oDoc.FullName, ".") - 1) & ".docx" oDoc.SaveAs2 FileName:=strDocName, FileFormat:=wdFormatDocumentDefault oDoc.Close strFile = Dir() Loop Set oDoc = Nothing End Sub
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#10
|
|||
|
|||
That worked perfectly, gmayor. Thank you both!
|
#11
|
|||
|
|||
Hello!
Sometimes this runs in alphabetical order, sometimes randomly. For certain reasons, I do need the code to pull files from the folder in alphabetical order. Is this possible? |
#12
|
||||
|
||||
This relates to the Windows filing system, however it is possible by collecting the filenames, sorting them and then processing the sorted list e.g.
Code:
Sub ConvertHTMLtoDOC() 'Graham Mayor - https://www.gmayor.com - Last updated - 28 Sep 2019 Dim strFile As String Dim strPath As String Dim strDocName As String Dim oDoc As Document Dim oColl As Collection Dim arr() As Variant Dim i As Integer Set oColl = New Collection strPath = "C:\path\" strFile = Dir(strPath & "*.htm*") Do While strFile <> "" oColl.Add strPath & strFile strFile = Dir() Loop arr = toArray(oColl) For i = LBound(arr) To UBound(arr) Set oDoc = Documents.Open(arr(i)) strDocName = Left(oDoc.FullName, InStrRev(oDoc.FullName, ".") - 1) & ".docx" oDoc.SaveAs2 FileName:=strDocName, FileFormat:=wdFormatDocumentDefault oDoc.Close Next i Set oDoc = Nothing End Sub Private Function toArray(ByVal Coll As Collection) As Variant Dim arr() As Variant Dim i As Long ReDim arr(1 To Coll.Count) As Variant For i = 1 To Coll.Count arr(i) = Coll(i) Next toArray = arr QuickSort arr lbl_Exit: Exit Function End Function Private Sub QuickSort(vArray As Variant, _ Optional lng_Low As Long, _ Optional lng_High As Long) Dim vPivot As Variant Dim vTmp_Swap As Variant Dim tmp_Low As Long Dim tmp_High As Long If lng_High = 0 Then lng_Low = LBound(vArray) lng_High = UBound(vArray) End If tmp_Low = lng_Low tmp_High = lng_High vPivot = vArray((lng_Low + lng_High) \ 2) While (tmp_Low <= tmp_High) While (vArray(tmp_Low) < vPivot And tmp_Low < lng_High) tmp_Low = tmp_Low + 1 Wend While (vPivot < vArray(tmp_High) And tmp_High > lng_Low) tmp_High = tmp_High - 1 Wend If (tmp_Low <= tmp_High) Then vTmp_Swap = vArray(tmp_Low) vArray(tmp_Low) = vArray(tmp_High) vArray(tmp_High) = vTmp_Swap tmp_Low = tmp_Low + 1 tmp_High = tmp_High - 1 End If Wend If (lng_Low < tmp_High) Then QuickSort vArray, lng_Low, tmp_High If (tmp_Low < lng_High) Then QuickSort vArray, tmp_Low, lng_High lbl_Exit: Exit Sub End Sub
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#13
|
|||
|
|||
Thanks, but this still opens the files in a random order.
|
Thread Tools | |
Display Modes | |
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
save dialog box promt doesn't save file | brmveen | Word VBA | 2 | 11-04-2015 12:51 AM |
Word 2007 , when I save a .doc or .docx file the file type is showing "Empty" | Tomc29 | Word | 9 | 06-10-2015 03:04 AM |
Set File Type when clicking Save As | Madbags | Word VBA | 1 | 10-10-2014 01:07 PM |
Word file type in 2007 | casaserves | Word | 4 | 08-03-2013 01:11 AM |
Getting COMException Incompatible file type and file extension | sbalerao | Mail Merge | 0 | 04-21-2011 10:30 AM |