我正在使用Excel VBA。我正在回归。列“O”中的数据是因变量。使用do while循环运行此回归8次。
我遇到的问题如下。每次通过时,我都会删除一列。这当然会在第一次通过时将列O移动到第N列,在第二次通过时将列移动到第M列等等。
我需要找到一种方法来使用范围来执行此操作而不使用if then语句。任何人都可以阐明这一点吗?
答案 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)
将返回包含该标题的列的编号。
否则,如果您有标题和表格,只需使用TableName[HeaderName]
调用它,将从您指定的标题下的表格中的列中提取所有数据。请注意下面如何突出显示指定标题下的所有数据。
无论哪种方式,只要标题保留在您指定的行或表中,数据将始终保持不变。