我是一张使用其他工作表中的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上禁用,否则我可以分享我的实际屏幕。希望它清楚。
答案 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 */
<强>插图:强>
在你的例子中应用这个逻辑:
.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;