2013-07-29 117 views
1

我有一個大的Excel文件,我需要完全替換12列中的所有值。VBA列循環

現在,每個單元格中都有一個公式,我需要用我自己的公式替換該公式。

我該如何遍歷所有這些列,知道它在哪一行開始,但不知道最後一行(文件不斷更新)。 「A600000」的破解看起來過度。

我是新來的VBA和一些指導將非常感激。

+0

你一般不想循環,如果你能避免它(通過使用例如範圍,或specialcells,或濾波器等)。首先要做的事情是:你想用什麼替換公式? – nutsch

+0

請參閱http://stackoverflow.com/q/17896655/11683 – GSerg

+0

什麼是原始公式以及您想用什麼替換它們。根據公式的格式,這可以在VBA之外的幾個步驟中完成,只需使用查找和替換 – Jaycal

回答

2

是當前工作表中所有使用的單元格的範圍。
您可以使用ActiveSheet.UsedRange.Rows.Count.Columns.Count來獲取此範圍的高度和寬度。

這裏的命中每一個細胞都在範圍內的非常粗糙的功能:

Sub test() 
    Dim thisRange As Range 
    Set thisRange = ActiveSheet.UsedRange 
    With thisRange 
     For y = 1 To .Rows.Count 
      For x = 1 To .Columns.Count 
       thisRange.Cells(y, x).Value = "Formula here" 
      Next x 
     Next 
    End With 
End Sub 

但是你想可能是不同的東西,你可以更具體一點嗎?

+0

它是一個= APF($ Jxx,「string1」,「string2」),我想要替換12列(不是一個接一個地)= RDT(「prog.id」,「string1」,$ Jxx)。 – Alexey

+0

你能指望你的列長度相等,還是未知? – wesmantooth

+0

我不完全確定,但我不會指望這一點。 – Alexey

1

以下將完成您需要做的事情。您只需提供startRow,.Sheets("Name")i參數。如果列的長度都是相同的,那麼UsedRange將工作正常,如果沒有隨機單元格的值在您感興趣的列之外或之下,則請在您的代碼中嘗試此操作(在工作簿的丟棄副本上)

Sub GetLastRowInColumn() 

Dim ws as Excel.Worksheet 
Set ws = Activeworkbook.Sheets("YOURSHEETNAMEHERE") 

Dim startRow as long 
    startRow = 1 

Dim lastRow as long 

Dim i as long  
For i = 1 to 12 'Column 1 to Column 12 (Adjust Accordingly) 

    lRow = ws.Cells(ws.Rows.Count, i).End(xlUp).Row 
    ws.Range(ws.Cells(startRow, i), ws.Cells(lRow, i)).Formula = "=Max(1)" 'Sample Formula 

Next 


End Sub 
1

編輯:固定錯字

的下面功能將建立與變長列的範圍內。使用該功能返回所需的範圍並一次性填充所有相關的單元格。

Function GetVariantColumnRange(MySheet As Excel.Worksheet, _ 
     TopRow As Long, StartColumn As Long, LastColumn As Long) As Excel.Range 

Dim topAddress As String 
Dim bottomAddress As String 

Dim addressString As String 

Dim i As Long 
For i = StartColumn To LastColumn 

    topAddress = MySheet.Cells(TopRow, i).Address 
    bottomAddress = MySheet.Cells(MySheet.Rows.Count, i).End(xlUp).Address 
    addressString = addressString & ", " & topAddress & ":" & bottomAddress 

Next 

addressString = Right(addressString, Len(addressString) - _ 
       InStr(1, addressString, ", ", vbBinaryCompare)) 

Set GetVariantColumnRange = MySheet.Range(addressString) 

End Function 

用法如下...

Sub Test() 

Dim myrange As Range 
Set myrange = GetVariantColumnRange(ThisWorkbook.Sheets(1), 1, 1, 12) 

myrange.Select 'Just a visual aid. Remove from final code. 
myrange.Formula = "=APF($Jxx, "string1", "string2") " 

End Sub