使用VBA将XSLX转换为CSV

使用VBA将XSLX转换为CSV,vba,excel,export-to-csv,xlsx,Vba,Excel,Export To Csv,Xlsx,首先,我是VBA的业余爱好者,所以我需要你的帮助 我使用下面的代码将.xlsx转换为.csv,但不知何故,字符不好看。英语可以,但越南语字符不容易看 例如,将此文本“Bạnđánh giáv̀nhàhàngcủa chúng tôi hôm nay nhúnào?”复制到xlsx文件,并使用下面的代码转换为csv。然后这个角色被显示为“Ba?n?a?nh gia?vênha?ha?ng cu?a chu?ng to?i ho?m nay nhu?thêna?o?” 任何人都

首先,我是VBA的业余爱好者,所以我需要你的帮助

我使用下面的代码将
.xlsx
转换为
.csv
,但不知何故,字符不好看。英语可以,但越南语字符不容易看

例如,将此文本“Bạnđánh giáv̀nhàhàngcủa chúng tôi hôm nay nhúnào?”复制到xlsx文件,并使用下面的代码转换为csv。然后这个角色被显示为“Ba?n?a?nh gia?vênha?ha?ng cu?a chu?ng to?i ho?m nay nhu?thêna?o?”

任何人都可以帮我!先谢谢你

Dim fso: set fso = CreateObject("Scripting.FileSystemObject") ' directory in which this script is currently running CurrentDirectory = fso.GetAbsolutePathName(".")

Set folder = fso.GetFolder(CurrentDirectory)

For each file In folder.Files

If fso.GetExtensionName(file) = "xlsx" Then

    pathOut = fso.BuildPath(CurrentDirectory, fso.GetBaseName(file)+".csv")

    Dim oExcel
    Set oExcel = CreateObject("Excel.Application")
    Dim oBook
    Set oBook = oExcel.Workbooks.Open(file)
    oBook.SaveAs pathOut, 6
    oBook.Close False
    oExcel.Quit
End If Next

你不必使用编码UTF-8。adostream可帮助实现此功能

Sub SaveXlsToCsvFiles()
    Dim FileName As String
    Dim Ws As Worksheet, Wb As Workbook
    Dim rngDB As Range
    Dim r As Long, c As Long
    Dim pathOut As String
    Dim File As Object, folder As Object

Dim fso: Set fso = CreateObject("Scripting.FileSystemObject") ' directory in which this script is currently running CurrentDirectory = fso.GetAbsolutePathName(".")

'Set folder = fso.GetFolder(CurrentDirectory)
Set folder = fso.GetFolder(ThisWorkbook.Path)
For Each File In folder.Files

    If fso.GetExtensionName(File) = "xlsx" Then
        If File.Name <> ThisWorkbook.Name Then
            pathOut = fso.BuildPath(CurrentDirectory, fso.GetBaseName(File) + ".csv")
            With File
                Set Wb = Workbooks.Open(.ParentFolder & "\" & .Name)
                Set Ws = Wb.Sheets(1)
                With Ws
                    r = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
                    c = .Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
                    Set rngDB = .Range("a1", .Cells(r, c))
                End With
                TransToCSV pathOut, rngDB
                Wb.Close (0)
            End With
        End If
    End If
Next
Set fso = Nothing
    MsgBox ("Files Saved Successfully")
End Sub
Sub TransToCSV(myfile As String, rng As Range)

    Dim vDB, vR() As String, vTxt()
    Dim i As Long, n As Long, j As Integer
    Dim objStream
    Dim strTxt As String

    Set objStream = CreateObject("ADODB.Stream")
    vDB = rng
    For i = 1 To UBound(vDB, 1)
        n = n + 1
        ReDim vR(1 To UBound(vDB, 2))
        For j = 1 To UBound(vDB, 2)
            vR(j) = vDB(i, j)
        Next j
        ReDim Preserve vTxt(1 To n)
        vTxt(n) = Join(vR, ",")
    Next i
    strTxt = Join(vTxt, vbCrLf)
    With objStream
        .Charset = "utf-8"
        .Open
        .WriteText strTxt
        .SaveToFile myfile, 2
        .Close
    End With
    Set objStream = Nothing

End Sub
子存储xlstocsvfiles()
将文件名设置为字符串
将Ws作为工作表,Wb作为工作簿
Dim rngDB As范围
变暗r为长,c为长
像细绳一样模糊
将文件作为对象,文件夹作为对象
Dim fso:Set fso=CreateObject(“Scripting.FileSystemObject”)”目录,此脚本当前在其中运行CurrentDirectory=fso.GetAbsolutePathName(“.”)
'Set folder=fso.GetFolder(CurrentDirectory)
Set folder=fso.GetFolder(ThisWorkbook.Path)
对于文件夹.Files中的每个文件
如果fso.GetExtensionName(文件)=“xlsx”,则
如果文件名为.Name ThisWorkbook.Name,则
pathOut=fso.BuildPath(当前目录,fso.GetBaseName(文件)+“.csv”)
归档
设置Wb=Workbooks.Open(.ParentFolder&“\”&.Name)
设置Ws=Wb.Sheets(1)
与Ws
r=.Cells.Find(“*”,SearchOrder:=xlByRows,SearchDirection:=xlPrevious)。行
c=.Cells.Find(“*”,SearchOrder:=xlByColumns,SearchDirection:=xlPrevious).Column
设置rngDB=.Range(“a1”,.Cells(r,c))
以
TransToCSV pathOut,rngDB
Wb.Close(0)
以
如果结束
如果结束
下一个
设置fso=无
MsgBox(“成功保存的文件”)
端接头
子TransToCSV(myfile作为字符串,rng作为范围)
Dim vDB,vR()作为字符串,vTxt()作为字符串
尺寸i等于长,n等于长,j等于整数
暗流
作为字符串的Dim strText
设置objStream=CreateObject(“ADODB.Stream”)
vDB=rng
对于i=1至UBound(vDB,1)
n=n+1
重拨虚拟现实(1至UBound(vDB,2))
对于j=1至UBound(vDB,2)
vR(j)=vDB(i,j)
下一个j
重拨保留vTxt(1到n)
vTxt(n)=连接(vR,“,”)
接下来我
strTxt=Join(vTxt,vbCrLf)
带objStream
.Charset=“utf-8”
打开
.WriteText strText
.SaveToFile我的文件,2
.结束
以
设置objStream=Nothing
端接头
您可以参考此链接