如何在Excel VBA中使用带有移位列的范围?

时间:2013-09-24 13:10:12

标签: excel vba excel-vba

我正在使用Excel VBA。我正在回归。列“O”中的数据是因变量。使用do while循环运行此回归8次。

我遇到的问题如下。每次通过时,我都会删除一列。这当然会在第一次通过时将列O移动到第N列,在第二次通过时将列移动到第M列等等。

我需要找到一种方法来使用范围来执行此操作而不使用if then语句。任何人都可以阐明这一点吗?

4 个答案:

答案 0 :(得分:1)

您可以按以下方式访问单元格:

.Cells(RowNumber,ColumnNumber)

每次删除列时,都可以将列号减1以实现目标。

答案 1 :(得分:1)

命名范围将随选择一起移动。然后在代码中使用此名称。例如MyData定义为Sheet1!O:O。如果删除了列,则Excel将自动更改指定范围的地址。

示例:

ActiveWorkbook.Names.Add Name:="TempRange", RefersTo:="=Sheet1!O1"
Range("TempRange").Value = Range("TempRange").Address
Range("A:A").Delete
Range("TempRange").Value = Range("TempRange").Address

另外,请注意,地址不会改变, BUT 它引用的单元格,因为您会在O1和N1中看到值$O$1

答案 2 :(得分:0)

如果没有看到代码,很难想象你正在做什么,但是你可以考虑使用Range Offset函数。在此范围之前,之后和之后删除列时,查看范围值的变化情况。然后设计一个可以处理这些情况的小语句。

例如:

Option Explicit

Sub x()

    Dim rngCurrent As Range
    Dim wksCurrent As Worksheet

    Set wksCurrent = ActiveSheet

    ' Example 1: The range in question is in a column after the column to delete

    Set rngCurrent = wksCurrent.Cells(20, 31)

    Debug.Print rngCurrent.Address '$AE$20

    wksCurrent.Range("O:O").Delete

    Debug.Print rngCurrent.Address '$AD$20  (it decreased automatically)

    Set rngCurrent = rngCurrent.Offset(0, -1) ' Reset column to previous column, in this case 30

    Debug.Print rngCurrent.Address '$AC$20


    ' Example 2: The range in question is a column before the deleted column
    Set rngCurrent = wksCurrent.Cells(20, 3)

    Debug.Print rngCurrent.Address '$C$20

    wksCurrent.Range("O:O").Delete

    Debug.Print rngCurrent.Address '$C20  (no change since the deleted column was after this range)

    Set rngCurrent = rngCurrent.Offset(0, -1) ' Reset column to previous column, in this case 30

    Debug.Print rngCurrent.Address '$B20


    ' Example 3: The range in question is the same as the deleted column
    Set rngCurrent = wksCurrent.Cells(20, 15)

    Debug.Print rngCurrent.Address '$O$20

    wksCurrent.Range("O:O").Delete

    'Debug.Print rngCurrent.Address 'Error: Object Required, the cell pointed no longer exists

    'Set rngCurrent = rngCurrent.Offset(0, -1) ' Error: Object Required

    'Debug.Print rngCurrent.Address '$O19  ' Error: Object Required

    ' Example 4: The range in question is the same as the deleted column. Avoid the error.
    Set rngCurrent = wksCurrent.Cells(20, 15)

    Debug.Print rngCurrent.Address '$O$20

    wksCurrent.Range("O:O").Delete

    Set rngCurrent = wksCurrent.Range("O20").Offset(0, -1) ' Refer to the worksheet to reset the range, instead of to the range itself

    Debug.Print rngCurrent.Address '$N20

End Sub

答案 3 :(得分:0)

是表中的数据吗?或者至少有一个标题?如果有标题但没有表格,您可以使用匹配,=MATCH("Column Header",1:1,0)将返回包含该标题的列的编号。

enter image description here

否则,如果您有标题和表格,只需使用TableName[HeaderName]调用它,将从您指定的标题下的表格中的列中提取所有数据。请注意下面如何突出显示指定标题下的所有数据。

enter image description here

无论哪种方式,只要标题保留在您指定的行或表中,数据将始终保持不变。