Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 工作簿.Worksheets.Columns()是否使用数字而不是字符串?_Excel_Vba - Fatal编程技术网

Excel 工作簿.Worksheets.Columns()是否使用数字而不是字符串?

Excel 工作簿.Worksheets.Columns()是否使用数字而不是字符串?,excel,vba,Excel,Vba,目前我能做两件事中的一件 我可以使用显示要更改宽度的列的字符串,也可以一次使用列号1,如下所示: re_wb.Worksheets(1).Columns(last_col + 1, last_col + 2).ColumnWidth = 23 这就像一根弦一样好用 re_wb.Worksheets(1).Columns("K:J").ColumnWidth = 23 问题是我必须动态地找到最后一列,然后在工作表中再添加两列。这是通过查找最后一列,然后在最后一列编号上使用+1和+2向标题的第一

目前我能做两件事中的一件

我可以使用显示要更改宽度的列的字符串,也可以一次使用列号1,如下所示:

re_wb.Worksheets(1).Columns(last_col + 1, last_col + 2).ColumnWidth = 23
这就像一根弦一样好用

re_wb.Worksheets(1).Columns("K:J").ColumnWidth = 23
问题是我必须动态地找到最后一列,然后在工作表中再添加两列。这是通过查找最后一列,然后在最后一列编号上使用
+1
+2
向标题的第一个单元格添加值来实现的

last_col = re_wb.Worksheets(1).Cells(1, re_wb.Worksheets(1).Columns.Count).End(xlToLeft).Column
re_wb.Worksheets(1).Cells(1, last_col + 1).Value = "Correct Per CL"
re_wb.Worksheets(1).Cells(1, last_col + 2).Value = "Is reassignment needed?"
对于两列,分别用最后一列数字+1和+2写两行来编辑其宽度并不是什么大问题,但考虑到一系列列可以使用字符串,是否可以使用两组数字?(或更多数字,取决于一次需要编辑的列数。)

我试过这样的方法:

re_wb.Worksheets(1).Columns(last_col + 1, last_col + 2).ColumnWidth = 23

没有运气。鉴于我无法预测列的字母是什么,是否可以使用数字来定义列的范围,或者我只需要像上面一样一次定义一个列?

如果您知道要更改宽度的第一列和最后一列,您可以将数字转换为字母(请参阅此网站:)然后转换整个范围

以下是此方法的一个示例:

Dim start_column As String, end_column As String
Dim last_col As Integer
last_col = re_wb.Worksheets(1).Cells(1, re_wb.Worksheets(1).Columns.Count).End(xlToLeft).Column

start_column = Split(Cells(1, last_col + 1).Address, "$")(1)
end_column = Split(Cells(1, last_col + 2).Address, "$")(1)
re_wb.Worksheets(1).Columns(start_column & ":" & end_column).ColumnWidth = 23

Range和Entirecumn是您在这里的朋友:

re_wb.Worksheets(1).Range(Cells(1,last_col + 1),Cells(1,last_col + 10)).entirecolumn.ColumnWidth = 23

Excel对象模型中没有“列”这样的东西-
工作表。列(foo)
返回一个
范围。只需构建适当的
范围
,并使用该范围设置列宽:

With re_wb.Worksheets(1)
    .Range(.Cells(1, last_col + 1), .Cells(1, last_col + 2)).ColumnWidth = 23
End With

显然,您希望限定所指的工作表,而不仅仅是范围或单元格

这里有很多很好的示例-就个人而言,我更喜欢使用将数字转换为列字母的函数-这样我就不必太多地更改语法:

Function ColLetter(colnum As Long)

    ColLetter = Split(Cells(1, colnum).Address, "$")(1)

End Function
在您的示例中使用:

re_wb.Worksheets(1).Columns(ColLetter(last_col + 1) & ":" & ColLetter(last_col + 2)).ColumnWidth = 23

谢谢你的回答。这很有效。如果你能在你的答案中加入一个简单的例子,那就值得投票了。由于链接断开,只有链接的答案不会过时。这样做的缺点是在需要的代码中添加更多的行。我认为在这种情况下,这里接受的答案可能是最好的选择。感谢@Mike smtt的输入。如果ActiveSheet不是
re\u wb.Worksheets(1)
,那么它可能会失败,并出现错误1004
entireclumn
也是不必要的。@Comintern true但如果我简单地做了
re_wb.Worksheets(1.Cells(1,last_col+1)
,它应该可以弥补这个问题。@Comintern true,你的答案在这方面更好。我想这是一个简单的问题,你在2分钟内得到了3次相同的答案。:)@vacip ya回想起来,我应该自己想到这个解决方案。“这一点现在已经很明显了。”迈克·SMT事后总是20/20;-)出于某种原因,我总是在这种情况下使用.entireclum。不知道为什么,我会研究这个…@vacip我不确定整个专栏或仅仅是专栏是否会在这里产生影响。两者都会导致整个柱的间距相同。不管怎样都可以。也许整列选项可能会花费更多的cpu时间。这里肯定有很多有用的例子。我在下面的一个答案中添加了一个这样的例子。它不使用函数思想。简单的在代码行中更改列宽。
re_wb.Worksheets(1).Columns(ColLetter(last_col + 1) & ":" & ColLetter(last_col + 2)).ColumnWidth = 23