0

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

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

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

4

4 回答 4

1

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

.Cells(RowNumber,ColumnNumber)

每次删除一列时,您可以将列号减一以实现您的目标。

于 2013-09-24T14:01:57.520 回答
1

命名范围将随选择移动。然后,您在代码中使用此名称。egMyData定义为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

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

于 2013-09-24T16:12:55.147 回答
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
于 2013-09-24T15:14:12.573 回答
0

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

在此处输入图像描述

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

在此处输入图像描述

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

于 2013-09-24T18:02:49.750 回答