Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 2010-将格式化数字写入CSV的VBA代码_Vba_Excel_Csv - Fatal编程技术网

Excel 2010-将格式化数字写入CSV的VBA代码

Excel 2010-将格式化数字写入CSV的VBA代码,vba,excel,csv,Vba,Excel,Csv,我正在制作一个5页的工作簿,其中第5页上名为ExportCSV的按钮将数据导出到第3页。更具体地说,该按钮运行一个逐行运行的VBA代码,并检查前3个单元格中的数据。如果前三个单元格中有任何单元格有数据,则选中整行。选择所有包含数据的行后,数据将逐行写入CSV文件(但文件本身以分号分隔) 我遇到的问题是,一些单元格格式正在被复制,但一些没有被复制。例如,为记帐而使用$格式化的单元格中的值格式正确,表示“$12345678.90”显示为“$12345678.90”。但是,格式为记帐但不使用$的单元格

我正在制作一个5页的工作簿,其中第5页上名为
ExportCSV
的按钮将数据导出到第3页。更具体地说,该按钮运行一个逐行运行的VBA代码,并检查前3个单元格中的数据。如果前三个单元格中有任何单元格有数据,则选中整行。选择所有包含数据的行后,数据将逐行写入CSV文件(但文件本身以分号分隔)

我遇到的问题是,一些单元格格式正在被复制,但一些没有被复制。例如,为记帐而使用$格式化的单元格中的值格式正确,表示“$12345678.90”显示为“$12345678.90”。但是,格式为记帐但不使用$的单元格中的值未正确写入csv,表示“12345678.90”写入为“12345678.9”

下面是讨论中的宏

Dim planSheet As Worksheet
Dim temSheet As Worksheet

Private Sub ExportCSV_Click()
    Dim i As Integer
    Dim j As Integer
    Dim lColumn As Long
    Dim intResult As Integer
    Dim strPath As String
    On Error GoTo Errhandler
    Set temSheet = Worksheets(3)
    i = 2
    Do While i < 1001
        j = 1
        Do While j < 4
            If Not IsEmpty(temSheet.Cells(i, j)) Then
                temSheet.Select
                lColumn = temSheet.Cells(2, Columns.Count).End(xlToLeft).Column
                temSheet.Range(temSheet.Cells(2, 1), temSheet.Cells(i, lColumn)).Select
            End If
            j = j + 1
        Loop
        i = i + 1
    Loop
    Application.FileDialog(msoFileDialogFolderPicker).InitialFileName = Application.ActiveWorkbook.Path
    Application.FileDialog(msoFileDialogFolderPicker).Title = "Select a Path"
    Application.FileDialog(msoFileDialogFolderPicker).ButtonName = "Select Path"
    intResult = Application.FileDialog(msoFileDialogFolderPicker).Show

    If intResult <> 0 Then
        'dispaly message box
        strPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
    End If

    Dim X As Long, FF As Long, S() As String
    ReDim S(1 To Selection.Rows.Count)
    For X = 1 To Selection.Rows.Count
        S(X) = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(Selection.Rows(X).Value)), ";")
    Next
    FF = FreeFile
    FilePath = strPath & "\Data" & Format(Now(), "yyyyMMddhhmmss") & ".csv"
    Open FilePath For Output As #FF
    Print #FF, Join(S, vbNewLine)
    Close #FF

    Errhandler:
        ...Error Handling Code omitted

End Sub
将平面图尺寸标注为工作表
将工作表作为工作表
私有子导出CSV_单击()
作为整数的Dim i
作为整数的Dim j
暗柱与长柱一样
将结果设置为整数
将strPath设置为字符串
关于错误转到错误处理程序
Set temSheet=工作表(3)
i=2
当我<1001时做
j=1
当j<4时,执行此操作
如果不是等空的(项目表单元格(i,j)),那么
项目表。选择
lColumn=temSheet.Cells(2,Columns.Count).End(xlToLeft).Column
temSheet.Range(temSheet.Cells(2,1),temSheet.Cells(i,lColumn))。选择
如果结束
j=j+1
环
i=i+1
环
Application.FileDialog(msoFileDialogFolderPicker)。InitialFileName=Application.ActiveWorkbook.Path
Application.FileDialog(msoFileDialogFolderPicker).Title=“选择路径”
Application.FileDialog(msoFileDialogFolderPicker).ButtonName=“选择路径”
intResult=Application.FileDialog(msoFileDialogFolderPicker).Show
如果结果为0,则
'显示消息框
strPath=Application.FileDialog(msoFileDialogFolderPicker)。选择editems(1)
如果结束
尺寸X为长,FF为长,S()为字符串
重拨S(1到Selection.Rows.Count)
对于X=1到Selection.Rows.Count
S(X)=连接(WorksheetFunction.Transpose(WorksheetFunction.Transpose(Selection.Rows(X.Value)),“;”)
下一个
FF=自由文件
FilePath=strPath&“\Data”和Format(Now(),“yyyyMMddhhmmss”)和“.csv”
打开输出为#FF的文件路径
打印#FF,连接(S,vbNewLine)
关闭#FF
错误处理程序:
…忽略了错误处理代码
端接头

我需要能够复制单元格的精确格式。将no-$cells转换为$cells将不起作用,因为不带$cells的值将在稍后的过程中用于计算,该过程可以处理逗号,但不能处理$,并且我无法更改稍后计算的代码(执行计算的专有插件)。此外,行具有混合内容,这意味着行中的某些值是文本而不是数字。

我最终听从了David Zemens的建议,对X=1的Selection.Rows.Count的
部分进行了彻底检查,如下所示

For X = 1 To Selection.Rows.Count
    For Y = 1 To Selection.Columns.Count
        If Y <> Selection.Columns.Count Then
            If IsNumeric(temSheet.Cells(X + 1, Y).Value) Then
                If temSheet.Cells(X + 1, Y).Value = 0 Then
                    S(X) = S(X) & ";"
                Else
                    S(X) = S(X) & Replace(temSheet.Cells(X + 1, Y).Text, " ", "") & ";"
                End If
            Else
                S(X) = S(X) & Trim(temSheet.Cells(X + 1, Y).Text) & ";"
            End If
        Else
            If IsNumeric(temSheet.Cells(X + 1, Y).Value) Then
                If temSheet.Cells(X + 1, Y).Value <> 0 Then
                    S(X) = S(X) & Replace(temSheet.Cells(X + 1, Y).Text, " ", "")
                End If
            Else
                S(X) = S(X) & Trim(temSheet.Cells(X + 1, Y).Text)
            End If
        End If
    Next
Next
X=1到Selection.Rows.Count的

对于Y=1到Selection.Columns.Count
如果Y Selection.Columns.Count,则
如果是数字(temSheet.Cells(X+1,Y).Value),则
如果temSheet.Cells(X+1,Y).Value=0,则
S(X)=S(X)&“
其他的
S(X)=S(X)&替换(temSheet.Cells(X+1,Y).文本“,”)&
如果结束
其他的
S(X)=S(X)和修剪(temSheet.Cells(X+1,Y).Text)和“
如果结束
其他的
如果是数字(temSheet.Cells(X+1,Y).Value),则
如果项目表单元格(X+1,Y).值为0,则
S(X)=S(X)&Replace(temSheet.Cells(X+1,Y).文本“,”)
如果结束
其他的
S(X)=S(X)和修剪(temSheet.Cells(X+1,Y).Text)
如果结束
如果结束
下一个
下一个

需要更多的格式。它一个单元格一个单元格地进行,故意跳过工作表的第一行。某些单元格的
.Text
属性在值之前或$and值之间返回空白,因此必须将其删除
Trim
删除前导空格和结尾空格,而
Replace
替换导出中的所有空格。

对于x=1的Selection.Rows.Count循环,您需要对
进行大量的修改。您必须对每行范围内的值数组进行逐单元格迭代,并更新数组以包含格式化的值(默认情况下,它将使用完全不知道任何格式的
.Value
)。这有意义吗?如果是这样的话,试一试,如果你陷入困境,我们会尽力帮助你。这是有道理的。我想我只是想看看是否有人有想法不必这样做。对,我不认为当你处理有条件地更改需要写入的值时,有另一种方法是从整个选择的行范围隐式转换到数组,然后使用
Join
函数将该数组强制为字符串,以便将其写入FSO文件。那里的隐式转换将使用行中每个单元格的
.Value
。相反,您需要从单元格的
.Text
属性构建数组,我认为一次只能生成一个单元格/值。@DavidZemens是正确的。看看答案。干得好。如果性能是一个问题,您可以首先将整行/范围
.Value
放入一个数组中,然后进行迭代,而不是逐个单元格进行迭代。它可能会更快,但在小型数据集上可能不明显。如果有数千行,我可能会这样做。通常数据集并没有那么大,但我用abou运行了一个测试