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

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

我们的产品使用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将在评估所有function之后将这些数字转换为数字单元格,并且删除所有逗号。 虽然文件中的2万行左右是正确的,但是这影响了4行左右打破了整个系统。

有没有办法触发Excel来评估CSV的function,而不用完全从VBA中更改单元格格式? 从CSV到SYLK的格式不是一个选项,因为Java CSV生成器是由不同的部门处理的。

您可以将所有单元格的格式转换为文本(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 

我有一个可能适合的替代技术。

我创build了一个包含26,000个值的工作表:string,数字,date,带有逗号和公式的数字。

我在上面的内部代码是:

  ValueCell = .Cells(RowCrnt, ColCrnt).Formula If IsNumeric(Replace(ValueCell, ",", "")) Then .Cells(RowCrnt, ColCrnt).Formula = Replace(ValueCell, ",", "|") End If 

.Cells(RowCrnt, ColCrnt).Formula如果单元格包含一个值,则给出公式,否则返回该值。 如果删除的任何逗号的值或公式是数字,我用pipe道replace任何逗号。

有26,000个电池,耗时59秒。 这比较有利于你每500行额外的45秒?

任何值如“1,2,3,15,654”现在将是“1 | 2 | 3 | 15 | 654”,但我认为这不是一个问题。 如果你有嵌套的string,比如“ab,cd,ef”,它们仍然会包含逗号。 也许testing一个领先的“=”来消除公式,并自动replace其他所有的逗号将是一种可能性。

下面的代码耗时78秒,对26,000个单元运行。

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

希望这有助于只给你新的想法。

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

您是否考虑过直接从您的Java程序使用例如Apache POI写入Excel电子表格? 在我看来,这比整个CSV公式业务要简单得多,不太容易出错,也不会出错。