在VBA中创建列免疫引用?

时间:2018-01-15 16:15:50

标签: excel vba excel-vba

我正在处理一个项目,其中检查所有行和多列的多个条件。问题是从工作表中添加/删除列,并且目前导致我的所有单元格(行,列)引用都关闭+输出不正确的信息。我想知道是否有办法让我的列引用更加健壮,以便它们自动找到正确的标题并在检查时使用它们?此问题的解决方案是否能够考虑包含完全相同的标题文本的多个列?

基本上:

  1. 没有空白列
  2. 列标题有重复(例如,第1列标题:"财务&#34 ;;第15列标题:"财务")
  3. 根据工作表
  4. 中的添加/删除列,向右和向左移动列

    请在下面找到我当前代码的简短示例,并附注:

    Dim i As Integer
    Dim lastRow As Long
    Dim lastCol As Long
    
    lastRow = Range("A1").End(xlDown).Row
    lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
    
    For i = 2 To lastRow
        Select Case Cells(i, 14).Value
            Case Is = "Yes"
                Select Case True
                    Case Cells(i, 63).Value = 6 And _
                        (IsEmpty(Cells(i, 77)) Or IsEmpty(Cells(i, 93)) Or IsEmpty(Cells(i, 109)) Or _
                        IsEmpty(Cells(i, 125)) Or IsEmpty(Cells(i, 141)) Or IsEmpty(Cells(i, 157))) 
                        Cells(i, 174).Value = "True" '^THESE CELL VALUES ALL HAVE THE SAME COLUMN HEADER TITLE
    

2 个答案:

答案 0 :(得分:2)

如果表格一致 - 从A1开始并占用一个连续的块 - 那么Range("A1").CurrentRegion将引用该表。

然后,您可以根据标题使用.CreateNames命名列(即使用命名范围)。

Dim rngTable As Range
Dim rng As Range

Set rngTable = Range("A1").CurrentRegion

rngTable.CreateNames True, False, False, False
' that is, based on the first row headings

Range("Salary").Select 'prove it works

'if necessary, iterate the cells of the column,
For Each rng In Range("Salary")
    rng.Value = rng.Value + 10
Next 'rng

如果列标题重复(“财务”),那么您将被要求确认,第二次出现将否决第一次出现。 (或者你可以说“不”,第一次出现将被命名。)在这种情况下,你最好先纠正这些重复的标题。

纠正重复的标题不一定是直截了当的,但无论如何都应该解决。如果它是可以复制的特定单词“财务”(或单词),那么这使得任务更容易。您可以计算有多少次出现,并将第二次等等更正为“Financials2”。

答案 1 :(得分:1)

Name分配给列的一种简单方法。说列 N 的标题为“付款”。首先将名称“付款”分配给该列:

enter image description here

然后在 VBA 中,我们可以编写如下代码:

Sub dural()
    Dim rng As Range, colly As Long
    Set rng = Range("Payments")
    colly = rng.Column
    For i = 2 To 100
        If Cells(i, colly) = "whatever" Then
            MsgBox "Help"
        End If
    Next i
End Sub

即使您添加/删除列beforre列 N ,代码仍将继续有效。