我是一张使用其他工作表中的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上禁用,否则我可以分享我的实际屏幕。希望清楚。
您需要首先使用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定界符参数。“