将目录中的所有xlsx文件转换为文本

时间:2017-07-04 14:40:23

标签: excel-vba excel-2010 vba excel

我正在尝试在。xlsm中创建一个按钮,该按钮会将.xlsx目录中的每个~100 myFolder个文件转换为.txt。以下VBA代码返回Expected End Sub错误。即使可能存在其他纸张,数据也总是在“纸张1”中。

Dos命令执行并转换文件,但它们不可读(与excel格式化有关?)。我不知道该怎么办?谢谢:))

待办事项

cd C:\Users\Desktop\folder
Copy *.xlsx *.txt

VBA

Option Explicit

Private Sub CommandButton1_Click()


Dim oFSO, myFolder
Dim xlText

myFolder = "C:\Users\Desktop\folder"


Set oFSO = CreateObject("Scripting.FileSystemObject")
xlText = -4158 'Excel txt format enum
Call ConvertAllExcelFiles(myFolder)
Set oFSO = Nothing

Call MsgBox("Done!")


Sub ConvertAllExcelFiles(ByVal oFolder)
Dim targetF, oFileList, oFile
Dim oExcel, oWB, oWSH

Set oExcel = CreateObject("Excel.Application")
oExcel.DisplayAlerts = False
Set targetF = oFSO.GetFolder(oFolder)
Set oFileList = targetF.Files
For Each oFile In oFileList
If (Right(oFile.Name, 4) = "xlsx") Then
    Set oWB = oExcel.Workbooks.Open(oFile.Path)
    For Each oWSH In oWB.Sheets
        Call oWSH.SaveAs(oFile.Path & ".txt", FileFormat:=xlTextWindows)
    Next
    Set oWSH = Nothing
    Call oWB.Close
    Set oWB = Nothing
End If
Next
Call oExcel.Quit
Set oExcel = Nothing
End Sub

1 个答案:

答案 0 :(得分:1)

您的代码的第一行属于Private Sub CommandButton1_Click()
(必须由End Sub

关闭

Option Explicit并且正确的代码缩进可以在这种情况下提供帮助

试试这个版本:

Option Explicit

Private Sub CommandButton1_Click()
    Dim myFolder As String

    myFolder = "C:\Users\Desktop\folder"
    ConvertAllExcelFiles myFolder
    MsgBox "Done!"
End Sub

Public Sub ConvertAllExcelFiles(ByVal folderPath As String)
    Dim xlApp As Object, wb As Workbook, ws As Variant, fso As Object
    Dim fileList As Object, itm As Object, fileName As String

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fileList = fso.GetFolder(folderPath).Files
    Set xlApp = CreateObject("Excel.Application")
    xlApp.DisplayAlerts = False

    For Each itm In fileList
        If Right(itm.Name, 4) = "xlsx" Then
            Set wb = xlApp.Workbooks.Open(itm.Path)
            fileName = fso.GetParentFolderName(itm.Path) & "\" & fso.GetBaseName(itm.Path)
            If True Then    'if converting all sheets use For loop (Change True to False)
                wb.Sheets(1).SaveAs fileName & ".txt", FileFormat:=xlTextWindows
            Else
                For Each ws In wb.Sheets
                  ws.SaveAs fileName & " - " & ws.Name & ".txt", FileFormat:=xlTextWindows
                Next
                Set ws = Nothing
            End If
            wb.Close:   Set wb = Nothing
        End If
    Next
    xlApp.Quit
End Sub