我在 Excel VBA 中工作。我正在运行回归。“O”列中的数据是因变量。这个回归使用 do while 循环运行了 8 次。
我遇到的问题如下。每次通过时,我都会删除一列。这当然会在第一次通过时将 O 列移动到 N 列,在第二次通过时将 M 列移动等等。
我需要找到一种使用范围来执行此操作而不使用 if then 语句的方法。任何人都可以阐明这一点吗?
您可以通过以下方式访问单元格:
.Cells(RowNumber,ColumnNumber)
每次删除一列时,您可以将列号减一以实现您的目标。
命名范围将随选择移动。然后,您在代码中使用此名称。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 中看到值
如果不看代码,很难想象你在做什么,但你可以考虑使用 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
是表格中的数据吗?或者至少有一个标题?如果有标题但没有表,则可以使用 match,=MATCH("Column Header",1:1,0)
将返回包含该标题的列的编号。
否则,如果您有标题和表,您可以简单地调用它,TableName[HeaderName]
将从您指定的标题下的表中的列中提取所有数据。请注意下面如何突出显示指定标题下的所有数据。
无论哪种方式,只要标题保留在您指定的行或表格中,数据将始终保持不变。