自动格式化存储为字符串的数字

时间:2016-02-16 17:40:23

标签: excel vba excel-vba

我构建了一个例程,可以复制和粘贴数据,并在将数据导入我的书后对所述数据执行各种分析。分析部分工作正常,但数据看起来是在各种excel书籍中作为字符串存储在它们实际上是ints和longs时。 Excel识别出这一点,并用绿色的小刻度标记每个单元格,并让我将它们格式化为数字,因为它们存储为字符串或者我认为是“文本”。它大大减慢了工作簿的速度,因为大约有10个选项卡包含这些信息,并且它们都有相同的问题。

问题的另一部分是数据中的合法字符串是 NOT 数字,因此将整个表单格式化为数字将不起作用。

例如:从中导入数据的工作表可能在第5,6行中有字符串,而在A列中的所有字符串和从C到大约J的列中的所有字符串都会将数字格式化为字符串或文本。然后可能会有几行中断,模式将重新开始。

提前致谢!

下面的代码仅用于访问和复制数据,因为其余的分析是在相当大的功能中进行的:

Function GetOiData(productID As String, targetSheet As Worksheet, controlPanel As Worksheet)
'Function access OI data from the CME website and copies it into the book for all products
Dim filePath As String
Dim reportDate As String

reportDate = controlPanel.Cells(1, 5)
filePath = "http://www.cmegroup.com/CmeWS/exp/voiProductDetailsViewExport.ctl?media=xls&tradeDate=" & reportDate & "&reportType=P&productId=" & productID

Workbooks.Open Filename:=filePath
Cells.Select
Selection.Copy

targetSheet.Activate
With targetSheet
    .Cells(1, 1).Select
    .Paste
    .Cells(1, 1).Select
End With

'Clears clipboard and closes CSV file to avoid potential contamination
Application.CutCopyMode = False
Windows("voiProductDetailsViewExport").Activate
Application.DisplayAlerts = False
Workbooks("voiProductDetailsViewExport").Close
Application.DisplayAlerts = True

End Function

1 个答案:

答案 0 :(得分:1)

  

第一个问题: ...但是数据似乎在各种excel书籍中作为字符串存储在实际的整数和长期内。

假设不存在前导或尾随空格或不间断空格,请运行此快速例程以循环工作簿并将类似文本的数字转换为真数。

Sub fixTextThatLookLikeNumbers()
    Dim w As Long, c As Long

    With ActiveWorkbook
        For w = 1 To .Worksheets.Count
            With .Worksheets(w)
                For c = 1 To .UsedRange.Columns.Count
                    With .Columns(c)
                        If CBool(Application.CountA(.Cells)) Then _
                            .TextToColumns Destination:=.Cells(1), _
                                    DataType:=xlFixedWidth, FieldInfo:=Array(0, 1)
                    End With
                Next c
            End With
        Next w
    End With
End Sub

这适用于格式为General的列,但不适用于专门格式化为Text的列。

  

第二个问题:问题的另一部分是数据中的合法字符串不是数字,因此将整个表格格式化为数字将不起作用。

如果您目前正在使用混合匹配格式,则可以修改该代码以强制所有列的常规格式。

以下是对函数代码的快速重写,该代码应使用原始值的直接传输,而不是复制和粘贴(或粘贴)操作。

Function GetOiData(productID As String, targetSheet As Worksheet, controlPanel As Worksheet)
    'Function access OI data from the CME website and copies it into the book for all products
    Dim filePath As String, reportDate As String, data As Range

    reportDate = controlPanel.Cells(1, 5).Value
    filePath = "http://www.cmegroup.com/CmeWS/exp/voiProductDetailsViewExport.ctl?media=xls&tradeDate=" & reportDate & "&reportType=P&productId=" & productID

    With Workbooks.Open(Filename:=filePath, ReadOnly:=True)

        With .Worksheets(1).Cells(1, 1).CurrentRegion
            targetSheet.Cells(1, 1).Resize(.Rows.Count, .Columns.Count) = .Value2
        End With

        'closes CSV file to avoid potential contamination
        Application.DisplayAlerts = False
        .Close SaveChanges:=False
    End With

    'this always turns back on when you exit the function
    'Application.DisplayAlerts = True

End Function