即使合并范围位于下方,也只选择一列

时间:2017-05-19 14:16:05

标签: excel vba excel-vba

测试案例

取一张空白纸,然后合并范围"D2:F2"。您可以手动执行此操作。

然后,只需点击电子表格顶部的E字母,即可激活宏录制器并选择列E。您将获得以下内容:

Columns("E:E").Select

现在,尝试直接从同一个宏运行这行代码:您会看到它选择了三列D, EF

问题:

这是宏录制器的错误吗?或者更确切地说,是VBA本身的一个错误(检测我的列中的合并范围,并决定扩展选择,即使明确要求选择一个列)?我该如何通过VBA代码选择只有一个合并范围所在的列,就像我可以手动完成一样?

需要:

我有一个年份在线上的电子表格,下面一行有几个月,下面一行有几天。 因此,日子只是细胞,但几个月,特别是几年是共享/合并的细胞在几天之内。

我的需求就是检测当天并选择列,以便用户查看他们应该在哪一天查看数据。但是,由于上面广泛合并的“年”细胞,整年选择。 enter image description here

4 个答案:

答案 0 :(得分:4)

不,这不是错误。

原因:尝试手动选择E1到E5的范围。这就是使用Columns时所发生的事情(" E:E")。选择。可以把它想象成。选择不选择列,而是从上到下选择每个单元格。

.select方法不是你应该依赖的东西。你究竟想用什么选择?还有另一种(可以说是更好的方法)来做到这一点。

编辑:另外,正如我父亲总是说的,不应该使用合并的单元格。他使用"在选择中心#34;相反,它看起来就像一个合并的单元格而没有任何看似错误的行为。

需要:我会使用宏来突出显示数据......可能是这样的......

Range("E7").Interior.ColorIndex = RGB(0, 0, 0)

答案 1 :(得分:1)

您可能知道日期开始的行。因此,您可以定义从第一天行到最后一天行的范围,而不是选择整个列,并选择该范围。

答案 2 :(得分:1)

<强>需求:

您的表格应具有此值和格式

sample picture

然后你可以循环遍历第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