问题描述
我有以下代码,该代码读取我的excel数据并将数据正确定位到CSV文件上。我唯一遇到的问题是,当创建CSV文件时,我在Excel工作表中拥有的所有后格式化数据都将改回为每个格式化形式。对于即时我的数据“ mm / dd / yyy”->44067。前导“ 0”的整数,例如“ 01”->1。两个十进制值,例如“ 3.80”和“ 7.00”->“ 3.8 ”和“ 7”。我在寻找解决此问题的方法时遇到了麻烦。这是代码。
Sub ExportCSV()
Dim vArr,x As Long,y As Long
Dim fNum As Long,fileName As String
Dim sLine As String,sVal As String
vArr = Worksheets("ImportFile").UsedRange.Value2
fNum = FreeFile
fileName = Environ$("Userprofile") & "\desktop\2225D_DH.txt"
Open fileName For Output Lock Write As #fNum
For x = LBound(vArr) + 1 To UBound(vArr)
sLine = ""
For y = LBound(vArr,2) To UBound(vArr,2)
If IsInArray(y,Array(9,12,13,14,15,16)) Then
sVal = PadLeft(vArr(x,y),FieldLength(y))
Else
sVal = padright(vArr(x,FieldLength(y))
End If
sLine = sLine & sVal
Next y
Print #fNum,sLine
Next x
Close fNum
Debug.Print "Saved file " & fileName
MsgBox ("Your CSV File Is Ready!")
End Sub
Function FieldLength(col As Long) As Long
Dim i As Long
Select Case col
Case 1: i = 9
Case 2: i = 6
Case 3: i = 6
Case 4: i = 1
Case 5: i = 2
Case 6: i = 10
Case 7: i = 4
Case 8: i = 4
Case 9: i = 9
Case 10: i = 9
Case 11: i = 9
Case 12: i = 11
Case 13: i = 11
Case 14: i = 11
Case 15: i = 9
Case 16: i = 11
Case 17: i = 1
Case 18: i = 12
Case 19: i = 6
Case 20: i = 12
Case 21: i = 12
Case 22: i = 6
Case 23: i = 12
Case 24: i = 8
Case 25: i = 12
Case 26: i = 12
Case 27: i = 12
Case 28: i = 12
Case 29: i = 1
End Select
FieldLength = i
End Function
Function PadLeft(str,num As Long) As String
If Len(str) > num Then
PadLeft = Left$(str & Space$(num),num)
Else
PadLeft = Space$(num - Len(str)) & str
End If
End Function
Function padright(str,num As Long) As String
padright = Left$(str & Space$(num),num)
End Function
Function IsInArray(searchVal,vArr) As Boolean
Dim val
For Each val In vArr
If searchVal = val Then
IsInArray = True
Exit Function
End If
Next
End Function
解决方法
未经测试,但是类似的东西应该可以工作。
如上所述,如果要使用单元格的格式化值,则需要使用Text
而不是Value2
。
Sub ExportCSV()
Dim fNum As Long,fileName As String
Dim sLine As String,sVal As String
Dim rng As Range,r As Long,c As Long,v
Set rng = Worksheets("ImportFile").UsedRange
fNum = FreeFile
fileName = Environ$("Userprofile") & "\desktop\2225D_DH.txt"
Open fileName For Output Lock Write As #fNum
For r = 1 To rng.Rows.Count
sLine = ""
For c = 1 To rng.Columns.Count
v = rng.Cells(r,c).Text
If IsInArray(c,Array(9,12,13,14,15,16)) Then
sVal = PadLeft(v,FieldLength(c))
Else
sVal = PadRight(v,FieldLength(c))
End If
sLine = sLine & sVal
Next c
Print #fNum,sLine
Next r
Close fNum
Debug.Print "Saved file " & fileName
MsgBox ("Your file Is Ready!")
End Sub