使用vba在excel中使用前导零复制数字文本

时间:2014-04-22 23:21:29

标签: excel vba excel-vba

我编写了一个宏来获取Excel工作表的内容并将其导出为CSV文件(由其他应用程序导入)。

我的问题是,在导出时,任何包含可以解释为数字的文本的单元格都会转换为数字。这意味着如果文本包含前导零,则会丢失这些内容。

所以,这样的数据:

  

资产0100738 1/05/2003 612

将导出为

  

资产,100738,1 / 05 / 2003,612

我的代码是:

Public Sub ExportSheetAsCSV(ByRef sh As Worksheet)
    Dim dataToExport As Excel.Range
    Dim newWrkbk As Excel.Workbook
    Dim FSO As New FileSystemObject
    Dim dstdir As String
    Dim dstpath As String

    Set dataToExport = sh.UsedRange
    Set newWrkbk = newWorkbook(1, ActiveWorkbook)
    '' Copy Step:
    newWrkbk.Sheets("Sheet1").Range("A1").Resize(dataToExport.Rows.Count, dataToExport.Columns.Count).Value = dataToExport.Value

    dstdir = FSO.BuildPath(FSO.BuildPath(ActiveWorkbook.path, "CSVs"), FSO.GetBaseName(ActiveWorkbook.Name))
    dstpath = FSO.BuildPath(dstdir, sh.Name & ".csv")

    MkDirStructure dstdir

    newWrkbk.SaveAs Filename:=dstpath, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    newWrkbk.Close False
End Sub

通过逐步完成此操作,我可以看到前导零在复制步骤中消失(与保存步骤相反)。

这个问题VBA: preceding zeros dropped when copied over涵盖了类似的问题,但没有一个给定的答案对我有用。接受的答案是将违规单元转换为文本(另一个最佳答案是使用VBA&#39的numberFormat进行相同操作),但

  1. 我事先并不知道哪些细胞需要转换,所以不方便
  2. 单元格的值由公式更新,因此,如果我转换为文本,则公式的文本将成为单元格的值
  3. 日期值将转换为整数表示
  4. 这甚至不起作用。将单元格转换为文本后,前导零仍被剥离。
  5. 有没有人能解决这个问题?

    由于

2 个答案:

答案 0 :(得分:2)

'将所有单元格的格式转换为文本,并在复制数据之前为所需的单元格范围添加以下行...

范围(“B1:X100000”)。NumberFormat =“@”

答案 1 :(得分:1)

好的,经过一些工作后,我发现的解决方法是复制/粘贴特殊而不是将目标范围的值分配给源的值。

所以,这一行:

newWrkbk.Sheets("Sheet1").Range("A1").Resize(dataToExport.Rows.Count, dataToExport.Columns.Count).Value = dataToExport.Value

替换为

Application.CutCopyMode = False
Set oldWrkbk = ActiveWorkbook

dataToExport.Copy
newWrkbk.Sheets("Sheet1").Activate
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
    xlNone, SkipBlanks:=False, Transpose:=False
oldWrkbk.Activate

缓存对源工作簿的引用,以便我们可以在关闭新文件之前返回到我们开始的位置。