列格式转换为数字,但显示为文本

时间:2018-03-06 06:33:52

标签: vba excel-vba excel

我是一张使用其他工作表中的ADO select语句生成的工作表。所以我必须手动设置一些格式。所以这就是我的方式。

With ThisWorkbook.Sheets("Invoice")
    .Columns(1).Resize(.Rows.count - 1, 1).Offset(1, 0).NumberFormat = "yyyy-mmm"
    .Columns(6).Resize(.Rows.count - 1, 1).Offset(1, 0).NumberFormat = "dd-mm-yyyy"
    .Columns(10).Resize(.Rows.count - 1, 1).Offset(1, 0).NumberFormat = "0.00"
End With

此处第1列和第6列转换为两种日期格式。和第10列我需要转换为数字格式。但是1和6转换得很好。但是10仍然显示为文本,因此在左侧排列。屏幕抓取在我们的PC上禁用,否则我可以分享我的实际屏幕。希望它清楚。

1 个答案:

答案 0 :(得分:3)

您需要先使用General将其解析为TextToColumns,然后应用您的格式。像下面这样的东西应该有效:

With .Columns(10).Resize(.Rows.count - 1, 1).Offset(1, 0)
    .TextToColumns Destination:=.Range("A1"), DataType:=xlFixedWidth, _
                   FieldInfo:=Array(0, 1) 
                   'DataType:=xlDelimited, _
                   'FieldInfo:=Array(1, 1)         
    .NumberFormat = "0.00"
End with

或者@Whome评论说,如果是全部数字,那么你可以简单地说:

With .Columns(10).Resize(.Rows.count - 1, 1).Offset(1, 0)
    .Value2 = .Value2      
    .NumberFormat = "0.00"
End with

编辑1:解释上面的第一个代码。使用.Range("A1")作为目标可以利用Excel VBA中的Range.Range表示法。这意味着您可以使用范围对象 Range方法重新编制索引(不确定这是否是正确的术语)Range。例如:

Dim r As Range: Set r = Range("B1:C10")
Debug.Print r.Range("A1").Address '/* this gives you $B$1 */
Degug.Print r.Range("B5").Address '/* this gives you $C$5 */

<强>插图:

enter image description here

在你的例子中应用这个逻辑:

.Columns(10).Resize(.Rows.count - 1, 1).Offset(1, 0) '/* refers to J2:J1048576 */

该范围的Range("A1")(或Jeeped评论的单元格(1))为$J$2

关于第二次询问,请参阅@ Jeeped的评论:

  

&#34; Sandeep在第二次调查中提出了一个有效的观点。如果您不打算将所有分隔符参数强制为false,可能是DataType:= xlFixedWidth,FieldInfo:= Array(0,1)会更好。您永远不会知道用户在TextToColumns定界符参数方面留下了什么。&#34;