使用来自另一个工作表的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仍然显示为文字,所以在左边被连成一组。屏幕抓取禁用在我们的电脑,否则我可以分享我的实际屏幕。希望一切都清楚。
发布于 2018-03-06 06:43:40
您需要首先使用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
Edit1:解释了上面的第1段代码。使用.Range("A1")
作为目标利用了Excel中的Range.Range
符号。这意味着您可以使用Range Objects 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 */
Illustration:
并将这一逻辑应用于您的示例:
.Columns(10).Resize(.Rows.count - 1, 1).Offset(1, 0) '/* refers to J2:J1048576 */
而这个范围的Range("A1")
(或如Jeeped注释的单元格(1))是$J$2
。
关于您的第二次询问,请参阅@Jeeped的评论:
“桑迪普在他的第二次查询中提出了一个有效的问题。如果你不强制所有分隔符参数都为false,也许DataType:=xlFixedWidth,FieldInfo:=Array(0,1)会更好。你永远不知道用户在TextToColumns分隔符(S)参数方面留下了什么。”
https://stackoverflow.com/questions/49124720
复制相似问题