Excel VBA:无法抑制Range.TextToColumns中字符串的自动转换?
Excel VBA:无法抑制Range.TextToColumns中字符串的自动转换?,excel,vba,Excel,Vba,Range对象的TextToColumns会自动将字符串转换为数字,但最好不要使用此功能。该方法有一个TextQualifier参数,但它似乎不符合我的要求。以下数据说明了这一问题。列A中的字符串用分号分隔,分号分隔文本部分和数字部分。请注意,所有数字都以零开头,第4-6行中的数字都以撇号作为前缀: Column A StringRow1;01000 StringRow2;02000 StringRow3;03000 StringRow4;'01000 StringRow5;'02000 Str
Range
对象的TextToColumns
会自动将字符串转换为数字,但最好不要使用此功能。该方法有一个TextQualifier
参数,但它似乎不符合我的要求。以下数据说明了这一问题。列A中的字符串用分号分隔,分号分隔文本部分和数字部分。请注意,所有数字都以零开头,第4-6行中的数字都以撇号作为前缀:
Column A
StringRow1;01000
StringRow2;02000
StringRow3;03000
StringRow4;'01000
StringRow5;'02000
StringRow6;'03000
下面的宏将字符串拆分为B列中的文本部分和C列中的数字部分
Sub TTC()
Application.DisplayAlerts = False
Dim rToSplit As Range
Set rToSplit = ThisWorkbook.Worksheets(1).Range("A1:A6")
rToSplit.TextToColumns _
Destination:=Range("B1"), _
DataType:=xlDelimited, _
Semicolon:=True, _
TextQualifier:=xlTextQualifierNone
End Sub
最后一列说明了所需的输出:
Column A Column B Column C
Data Output Output Desired Output
StringRow1;01000 StringRow1 1000 01000
StringRow2;02000 StringRow2 2000 02000
StringRow3;03000 StringRow3 3000 03000
StringRow4;'01000 StringRow4 '01000 01000
StringRow5;'02000 StringRow5 '02000 02000
StringRow6;'03000 StringRow6 '03000 03000
我尝试在拆分之前格式化列C,如下所示:rtospilt.Offset(,3).NumberFormat=“@”
,但它没有效果。将TextQualifier
参数切换到xlTextQualifierSingleQuote
具有与第1-3行相同的处理第4-6行的效果
我是在要求不可能的事情吗?或者是否有一些我不知道的应用程序级别设置?或者我可以用A列中的字符串做些聪明的事情吗
(当然,我可以在拆分后循环遍历C列并解决问题,但对于大型数据集来说,这并不吸引人。对于我的特定应用程序,A列中的字符串是由代码生成的,该代码在几个不同的文本文件中搜索数万个文本行中的模式;每个匹配项都添加到一个字典中,然后我使用
array()=字典.Items
和DestinationRange.Value=Application.WorksheetFunction.Transpose(数组)
将数据读取到工作表中。这非常快。我处理此处所述问题的解决方法是将数字字符串保存在一个单独的字典中,该字典在拆分后读取到C列。这很有效,因此出于好奇,我发布了这篇文章,以了解我能学到什么…如果您愿意使用循环:
Sub TTC()
Dim row As Long, lastRow As Long, splitSpot As Integer, cellValue As String
Application.ScreenUpdating = False
With ThisWorkbook.Worksheets(1)
lastRow = .Cells(.Rows.Count, "A").End(xlUp).row
For row = 1 To lastRow
cellValue = CStr(.Range("A" & row).Value)
splitSpot = InStr(cellValue, ";")
.Range("B" & row & ":C" & row).NumberFormat = "@"
.Range("B" & row).Value = Left(cellValue, splitSpot - 1)
If Mid(cellValue, splitSpot, 1) = "'" Then
.Range("C" & row).Value = Right(cellValue, Len(cellValue) - splitSpot + 1)
Else
.Range("C" & row).Value = Right(cellValue, Len(cellValue) - splitSpot)
End If
Next
End With
End Sub
ss:
您可以使用FieldInfo属性设置每列的数据类型。您需要事先知道有多少列,或者知道哪一列将包含数字 FieldInfo参数接受一个数组数组,每个子数组有2个值。第一个值表示列号(从1开始),第二个值是您希望将该列格式化为的列号 在本例中,您希望将所有内容格式化为文本(而不是数字,就像它当前所做的那样),因此您将使用xlTextFormat(这只是一个系统定义的常数,等于2)
太好了!当你意识到这一点的时候,就这么简单了。我以为我已经足够仔细地阅读了文档,但是唉!太感人了。
x.TextToColumns _
Destination:=Range("B1"), _
DataType:=xlDelimited, _
Semicolon:=True, _
TextQualifier:=xlTextQualifierNone, _
FieldInfo:=Array(Array(1, xlTextFormat), Array(2, xlTextFormat)) 'Format columns 1 and 2 as text