【问题标题】:Convert an imported column from a text field to a number将导入的列从文本字段转换为数字
【发布时间】:2015-11-30 00:37:59
【问题描述】:

我正在寻找一种将文本转换为数字的方法,然后可以在其他公式中进一步使用。我的专栏看起来很简单:

Data1   Data2
1       1
123     1324
1000    1000
...     ...

我尝试了几种方法:

Range("S:S").NumberFormat = "0"
Range("T:T").NumberFormat = "0"

或复制一个空单元格并将其添加到范围中:

Sheets("Sold_Portfolio").Range("ZZ100000").Copy
Sheets("Sold_Portfolio").Range("T3:T100000").PasteSpecial , xlPasteSpecialOperationAd

但是,除了看到正确的类型之外,Excel 底部只显示了计数。

任何建议如何正确地将 Excel 列转换为数字,然后其他公式可以进一步使用?

我的错误是什么?

更新在这里您可以找到完整的 VBA 代码:

Sub selectFile()

Dim wbI As Workbook, wbO As Workbook
Dim wsI As Worksheet

Set wbI = ThisWorkbook
'sheet where you want to import the sheet in
Set wsI = wbI.Sheets("Sheet_Items")

ChDir (Environ("USERPROFILE") & "\Desktop")
 'Select the file
Fname = Application.GetOpenFilename(filefilter:="Text Files (*.txt),*.txt", MultiSelect:=False)

' check if file is selected
If Fname = False Then
'    MsgBox "No File Was Selected"
    Exit Sub
End If

' delete the current content there
Sheets("Sheet_Items").Range("G3:AB50000").ClearContents

'Set wbO = Workbooks.Open(Fname)
'
'wbO.Sheets(1).Cells.Copy wsI.Cells
'
'wbO.Close SaveChanges:=False
Dim var As String

var = "TEXT;" & Fname
With ActiveSheet.QueryTables.Add(Connection:= _
        var, Destination:=Range("$G$3") _
        )
        .Name = "Sample"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 437
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With



'You need to properly qualify the range for the Replace() method
Columns("S").Replace What:=".", _
                            Replacement:=",", _
                            LookAt:=xlPart, _
                            SearchOrder:=xlByRows, _
                            MatchCase:=False, _
                            SearchFormat:=False, _
                            ReplaceFormat:=False

Columns("T").Replace What:=".", _
                            Replacement:=",", _
                            LookAt:=xlPart, _
                            SearchOrder:=xlByRows, _
                            MatchCase:=False, _
                            SearchFormat:=False, _
                            ReplaceFormat:=False

'Range("S3:S100000") = Range("S3:S100000").Value
'Range("T3:T100000") = Range("T3:T100000").Value
'
'convert to number
'for further details on other available formats have a look at: http://stackoverflow.com/questions/20648149/what-are-numberformat-options-in-excel-vba
'Range("S:S").NumberFormat = "0"
'Range("T:T").NumberFormat = "0"

''get an emtpy cell
'Sheets("Sheet_Items").Range("ZZ100000").Copy
'Sheets("Sheet_Items").Range("S3:S100000").PasteSpecial , xlPasteSpecialOperationAdd
'
'Sheets("Sheet_Items").Range("ZZ100000").Copy
'Sheets("Sheet_Items").Range("T3:T100000").PasteSpecial , xlPasteSpecialOperationAdd

'select the cell B1
Sheets("Sheet_Items").Range("B1").Select

End Sub

【问题讨论】:

  • VALUE() 函数可以在公式中提取相邻列中的文本 - 如果您有数字和非数字数据的混合,它是有弹性的。 .如果做不到这一点,则抓取 VBA 数组中的列,循环遍历数组,将 Clng() 或 Cdb() 应用于每个成员,然后将数组写回范围。
  • 是的,我有点困惑。你说“除了显示正确的类型......”所以单元格的内容IsNumeric?如果是这样,那么您的单元格是一个数字,而问题是“在 Excel 底部显示计数”的公式。但是@Nile 是正确的。 .Value 应将任何数字文本视为数字。
  • @pnuts 你的方法效果很好。你能解释一下为什么吗?我将不胜感激!

标签: vba excel formatting excel-2010


【解决方案1】:

你可能会运行类似:

Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, Tab:=True, FieldInfo:=Array(1, 1)  

在每一列上(这里假设为 A)。

Text to Columns 是一个必须由专有代码支持的向导。它的一项功能是允许选择“导入”数据的格式,然后将其写入现有列并解析到其他列(其中(a)那些为空(除非该要求被覆盖)和(b ) 所选分隔符的右侧或超出给定的固定宽度有数据。

“导入”的数据实际上已经在所选列中。由于在这种情况下不包含任何制表符,因此选择制表符作为分隔符意味着不涉及解析 - 从列中读取数据并重新输入回其中。但是,作为重新输入过程的一部分,格式可能会更改。在这种情况下,array 中的第二个 1 参数定义数字。

专有代码通常比 VBA 快得多。

【讨论】:

    【解决方案2】:

    考虑:

    Sub qwerty()
       Dim r As Range, rng As Range
       Set rng = Intersect(Range("S:T"), ActiveSheet.UsedRange)
       rng.ClearFormats
    
       For Each r In rng
          r.Value = r.Value
       Next r
    End Sub
    

    【讨论】:

    • 感谢您的回答!但是,我的问题是运行这段代码可能需要很长时间。
    • 这不是一个很好的答案:每次“点击”工作表、读取单元格、写入单元格大约需要百分之一秒。您知道您可以使用varArray = myRange.Value 读取单个“命中”中的范围,遍历 VBA 数组中的每个项目,然后将其全部写回单个“命中”到工作表中:myRange.Value = varArray?根据 VBA 标准,从整个列中迭代每个数组项很慢 - 因此请正确定义您的范围 - 但这仍然比直接与每个单元格交互要快 方式,因此它仍然会在一秒钟内运行.
    猜你喜欢
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多