2013-09-24 99 views
0

我在Excel VBA中工作。我正在進行迴歸。 「O」列中的數據是因變量。使用do while循環正在運行這個迴歸8次。如何在Excel VBA中使用移動列的範圍?

我遇到的問題如下。在每次通過時,我正在刪除一列。這當然會將列O移動到第一遍的第N列,第二遍的第M列等。

我需要找到一種方法來使用範圍來做到這一點,而無需使用if then語句。任何人都可以闡明這一點嗎?

+0

你能分享一些代碼,以便我們能夠理解你到底想要達到什麼目的嗎? –

+1

會顛倒列的工作順序嗎? – pnuts

+2

'不使用if語句'???這是一本雜誌的追求嗎? –

回答

1

您可以訪問細胞:

.Cells(RowNumber,ColumnNumber) 

每次你刪除列,你可以減少一個列號來實現你的目標。

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 
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 

還,注意地址並沒有改變,但引用的單元格呢,你會看到的價值$O$1兩個O1和N1

0

IS表中的數據?或者至少有一個標題?如果存在標題但沒有表格,則可以使用匹配,=MATCH("Column Header",1:1,0)將返回包含該標題的列的編號。

enter image description here

否則,如果你有頭和一個表,你可以簡單地用TableName[HeaderName]呼叫,它將把所有的數據從列在表中指定的標題下。請注意以下內容如何突出顯示指定標題下的所有數據。

enter image description here

無論哪種方式,數據將始終保持不變,將您的信息,只要頭部保持您指定的行或表所示。