我编写了一个宏来获取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进行相同操作),但
有没有人能解决这个问题?
由于
答案 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
缓存对源工作簿的引用,以便我们可以在关闭新文件之前返回到我们开始的位置。