应用函数后保持单元格文本格式

时间:2012-02-14 16:34:39

标签: excel vba format

我将展示一些人为的例子,所以请耐心等待。

我们的产品利用CSV文件处理过渡数据,在Excel用户界面之间发送数据,Java程序可以操作并将其传输到SQL后端。我们有一个VBA脚本,按以下顺序处理所有Excel工作:

在一个Excel文档中将所有8个CSV文件加载到8张纸中。然后迭代批量数据执行以下操作:

'Loop over data:
    Dim r As Range
    ...
    r.NumberFormat = "General"
    r.Formula = r.Formula
'End loop

这会导致整个工作表填充CSV中的数据,其中数字单元格具有文本外观,Excel公式仍未评估。运行r.Formula = r.Formula会触发所有正确评估的函数。唯一的问题是数字格式。

CSV文件有时包含嵌套的CSV。例如,单个单元格可能包含“1,2,3,15,654”。这些单元格始终显示为文本。但是,有一个边缘情况,其中单元格可能是漂亮的打印数字,例如“10,456,345”Excel将在评估所有函数后将这些数字转换为数字单元格,并删除所有逗号。虽然文档中的20,000行左右是正确的,但这影响的4行会破坏整个系统。

有没有办法触发Excel从CSV评估函数而不完全从VBA更改单元格格式?将格式从CSV更改为SYLK不是一种选择,因为Java CSV生成器由不同的部门处理。

3 个答案:

答案 0 :(得分:1)

您可以将格式化为所有单元格上的文本(Cells.NumberFormat =“@”),然后循环它们并在以“=”开头的单元格上使用您的代码。 如果性能是一个问题,您应该将工作表内容放在一个数组中,处理该数组并将其放回工作表。 如果您发布更多代码和示例数据,人们将能够仔细查看。

修改

例如,将以下值放在“Sheet1”的A列(从A1到A4)中,并使用文本格式:

13246
13564,4654,4565
654
=A1+A3

并使用以下代码:

Sub test()

    Dim a As Variant
    Dim result As Variant

    a = Sheets("Sheet1").UsedRange
    ReDim result(1 To UBound(a, 1), 1 To UBound(a, 2)) As Variant

    For i = 1 To UBound(a, 1)
      For j = 1 To UBound(a, 2)
        If Left(a(i, j), 1) = "=" Then
          result(i, j) = a(i, j)
        Else
          result(i, j) = "'" & a(i, j)
        End If
      Next j
    Next i

    Sheets("Sheet1").Cells(1, 2).Resize(UBound(result, 1), UBound(result, 2)) = result

End Sub

结果放在B栏中,并且是:

13246
13564,4654,4565
654
13900

答案 1 :(得分:1)

我有一种可能适用的替代技术。

我创建了一个包含26,000个值的工作表:字符串,数字,日期,带有逗号和公式的数字。

我在上面的代码上运行了一个循环:内部代码是:

     ValueCell = .Cells(RowCrnt, ColCrnt).Formula
     If IsNumeric(Replace(ValueCell, ",", "")) Then
       .Cells(RowCrnt, ColCrnt).Formula = Replace(ValueCell, ",", "|")
     End If
如果单元格包含一个,则

.Cells(RowCrnt, ColCrnt).Formula给出公式,否则给出值。如果删除了任何逗号的值或公式是数字,我用管道替换任何逗号。

有26,000个细胞需要59秒。这与每500行额外的45秒相比是否有利?

像“1,2,3,15,654”这样的任何值现在都是“1 | 2 | 3 | 15 | 654”,但我认为这不是问题。如果你有嵌套字符串,如“ab,cd,ef”,它们仍然会包含逗号。也许测试一个领先的“=”来消除公式并自动替换其他所有内容中的逗号。

以下代码需要78秒才能对26,000个单元格进行运行。

     ValueCell = .Cells(RowCrnt, ColCrnt).Formula
     If Left(ValueCell, 1) <> "=" Then
       .Cells(RowCrnt, ColCrnt).Formula = Replace(ValueCell, ",", "|")
     End If

希望如果只是为了给你新的想法,这会有所帮助。

答案 2 :(得分:0)

我提出了另一种更直接的方法:

您是否曾考虑使用以下方法直接从Java程序写入Excel电子表格? Apache POI?在我看来,与整个CSV公式相比,它会更直接,更少人为,更不容易出错。