excel宏将表单保存为具有特定分隔符和机箱的csv

时间:2012-12-13 11:50:45

标签: excel vba excel-vba

我是vb和excel的完全虚拟,试图将我在这里找到的2个宏组合成1,但显然做了一些非常错误的事情,现在我被卡住了..首先我只是使用了这个宏(将其保存为personal.xlsb,以便能够在任何工作簿中使用)

    Sub CSVFile()

    Dim SrcRg As Range
    Dim CurrRow As Range
    Dim CurrCell As Range
    Dim CurrTextStr As String
    Dim ListSep As String
    Dim FName As Variant
    FName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")

    ListSep = ";"
      If Selection.Cells.Count > 1 Then
        Set SrcRg = Selection
      Else
        Set SrcRg = ActiveSheet.UsedRange
      End If
    Open FName For Output As #1
    For Each CurrRow In SrcRg.Rows
      CurrTextStr = ìî
    For Each CurrCell In CurrRow.Cells
      CurrTextStr = CurrTextStr & """" & GetUTF8String(CurrCell.Value) & """" & ListSep
    Next
    While Right(CurrTextStr, 1) = ListSep
      CurrTextStr = Left(CurrTextStr, Len(CurrTextStr) - 1)
    Wend
    Print #1, CurrTextStr
    Next
    Close #1
    End Sub

加上GetUTF8String函数代码。现在工作正常。然后我想到为什么不只是尝试我的有限(这是一个严重的轻描淡写)vb理解,添加以下代码并将CSVFile子更改为一个函数,然后我从下面的子调用,输出文件名为一个参数(代替FName = Application.GetSaveAsFilename)。我想是的,这段代码会自动保存所有工作表,现在让我们确保在保存每张工作表之前运行编码和分隔符/机箱设置功能。这似乎不对,但我认为嘿为什么不试试..

Public Sub SaveAllSheetsAsCSV()
On Error GoTo Heaven

' each sheet reference
Dim Sheet As Worksheet
' path to output to
Dim OutputPath As String
' name of each csv
Dim OutputFile As String

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False

' Save the file in current director
OutputPath = ThisWorkbook.Path


If OutputPath <> "" Then
Application.Calculation = xlCalculationManual

' save for each sheet
For Each Sheet In Sheets

    OutputFile = OutputPath & Application.PathSeparator & Sheet.Name & ".csv"

    ' make a copy to create a new book with this sheet
    ' otherwise you will always only get the first sheet

    Sheet.Copy
    ' this copy will now become active
     CSVFile(OutputFile)
     ActiveWorkbook.SaveAs Filename:=OutputFile, FileFormat:=xlCSV,     CreateBackup:=False
    ActiveWorkbook.Close
Next

Application.Calculation = xlCalculationAutomatic

End If

Finally:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True

Exit Sub

Heaven:
MsgBox "Couldn't save all sheets to CSV." & vbCrLf & _
        "Source: " & Err.Source & " " & vbCrLf & _
        "Number: " & Err.Number & " " & vbCrLf & _
        "Description: " & Err.Description & " " & vbCrLf

GoTo Finally
End Sub

保存,并且我已经设法实现了一些非常不同的东西。在打开任何工作簿时,该宏运行并从该特定工作簿中打开我的工作表作为csv文件(不保存它们)。现在我就像爱丽丝梦游仙境。为什么它在文件打开时运行?这是不可取的,所以我回到宏代码并将其更改回csvfile sub。嗯,这没有帮助,不知道我在那里做了什么,肯定是编辑相同的宏...所以我删除了宏,模块,我无法想象现在的东西在哪里,但它仍在运行+我得到这个警告,宏已停用。无法摆脱它!现在小伙子们,我很抱歉从我身边完全缺乏专业性,这对于一个客户来说应该是一个小小的好处,而不会浪费大量的时间学习vb,因为我的老板不喜欢那样......我我当然对如何在设置分隔符和外壳后自动保存纸张的目标感兴趣。在这一刻,我对如何摆脱那个宏以及隐藏的地方非常感兴趣。我做了什么?!感谢您的耐心等待!

1 个答案:

答案 0 :(得分:1)

我认为问题在于行

OutputPath = ThisWorkbook.Path

因为您是从存储在XLSTART文件夹中的personal.xlsb运行它,所以它在同一位置创建了CSV文件。当Excel启动时,它将尝试加载它在该位置找到的任何文件。

只需找到您的XLSTART文件夹并删除您在那里找到的所有CSV文件。

尝试使用

OutputPath = ActiveWorkbook.Path

XLSTART文件夹位置(取决于您的系统)可能类似于:

C:\Users\YOURNAME\AppData\Roaming\Microsoft\Excel\XLSTART