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

问题描述 投票:2回答:1

我是一张使用其他工作表中的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上禁用,否则我可以分享我的实际屏幕。希望清楚。

vba excel-vba excel
1个回答
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 Objects 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 */

插图:

并在您的示例中应用该逻辑:

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

并且该范围的Range("A1")(或Jeeped评论的细胞(1))是$J$2

如需第二次查询,请参阅@ Jeeped的评论:

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

© www.soinside.com 2019 - 2024. All rights reserved.