测试案例
取一张空白纸,然后合并范围"D2:F2"
。您可以手动执行此操作。
然后,只需点击电子表格顶部的E
字母,即可激活宏录制器并选择列E
。您将获得以下内容:
Columns("E:E").Select
现在,尝试直接从同一个宏运行这行代码:您会看到它选择了三列D, E
和F
。
问题:
这是宏录制器的错误吗?或者更确切地说,是VBA本身的一个错误(检测我的列中的合并范围,并决定扩展选择,即使明确要求选择一个列)?我该如何通过VBA代码选择只有一个合并范围所在的列,就像我可以手动完成一样?
需要:
我有一个年份在线上的电子表格,下面一行有几个月,下面一行有几天。 因此,日子只是细胞,但几个月,特别是几年是共享/合并的细胞在几天之内。
答案 0 :(得分:4)
不,这不是错误。
原因:尝试手动选择E1到E5的范围。这就是使用Columns时所发生的事情(" E:E")。选择。可以把它想象成。选择不选择列,而是从上到下选择每个单元格。
.select方法不是你应该依赖的东西。你究竟想用什么选择?还有另一种(可以说是更好的方法)来做到这一点。
编辑:另外,正如我父亲总是说的,不应该使用合并的单元格。他使用"在选择中心#34;相反,它看起来就像一个合并的单元格而没有任何看似错误的行为。
需要:我会使用宏来突出显示数据......可能是这样的......
Range("E7").Interior.ColorIndex = RGB(0, 0, 0)
答案 1 :(得分:1)
您可能知道日期开始的行。因此,您可以定义从第一天行到最后一天行的范围,而不是选择整个列,并选择该范围。
答案 2 :(得分:1)
<强>需求:强>
您的表格应具有此值和格式
然后你可以循环遍历第4行的每一列 - 只是假定 - 并检查每个值是否与今天匹配。接下来,您可以使用Application.Goto
滚动到该单元格。
<强> CODE:强>
Sub FindToday()
Dim wsTable As Worksheet '<~ worksheet with your table
Set wsTable = Sheet2
Dim Cols As Integer '<~ a variable to loop through columns
With wsTable
For Cols = 1 To .Cells(4, .Cells.Columns.Count).End(xlToLeft).Column + 1
If .Cells(4, Cols).Value = Date Then '<~ check if the date is today
Application.Goto wsTable.Cells(1, Cols), True '<~ scroll to that cell if true
Exit For
End If
Next
End With
End Sub
答案 3 :(得分:1)
与这里的某些评论不同,我觉得这个问题是真实的。我会尽力解释。
使用问题中的测试用例,假设我只想在 D 列上执行某些操作(例如更改其列宽),而不将 E 列更改为 F 列。我可以通过选择 D 列在 excel 中执行此操作特别是通过按列标题(按列名称栏中的“D”)。如果我们使用范围选择(鼠标或键盘快捷键 CTRL+SPACE)选择列,它将扩展选择以包括 E 和 F 列。但是如果我们按标题上的 D 列,它只会选择一列。我希望 VBA 也能这样做。
遗憾的是,我找不到任何可以“选择”单个列或范围的内容,其中包括合并多个列或范围的单元格。但是,我可以在该单列上执行操作。
我试过了,没用。我觉得它应该有效。
Range("D:D").Select
没用。扩展选择以包括合并的单元格。我想,这没问题。
Columns("D").Select
没用。扩展选择以包括合并的单元格。我觉得这不行。
Columns("D").EntireColumn.Select
即使这样也没有用。这绝对应该。
所以最后我直接应用了动作,没有选择单元格。
Column("D").ColumnWidth = 10
这做到了。只有 D 列的宽度发生了变化,E 列和 F 列保持不变。同样,我可以做字体更改和其他操作。
唯一的缺点是我必须单独执行所有操作。因此,我使用循环对选择执行操作。
像这样:
For Each x in Range("D:D")
x.font.size = 10
x.font.name = "Calibri"
'...and so on...
Next x