我将展示一些人为的例子,所以请耐心等待。
我们的产品利用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生成器由不同的部门处理。
答案 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公式相比,它会更直接,更少人为,更不容易出错。