VBA 列循环

Posted

技术标签:

【中文标题】VBA 列循环【英文标题】:VBA column looping 【发布时间】:2013-07-29 20:16:06 【问题描述】:

我有一个很大的 Excel 文件,我需要完全替换 12 列中的所有值。

现在,每个单元格中都有一个公式,我需要用我自己的公式替换该公式。

我如何遍历所有这些列,知道它从哪一行开始但不知道结束行(文件不断更新)。 “A600000”的破解似乎有点矫枉过正。

我是 VBA 新手,非常感谢一些指导。

【问题讨论】:

如果可以避免循环(例如通过使用范围、特殊单元格或过滤器等),您通常不希望循环。首先要做的事情:你想用什么替换公式? 见***.com/q/17896655/11683 原始公式是什么,您想用什么替换它们。根据公式的格式,这可以通过仅使用查找和替换在 VBA 之外的几个步骤中完成 这是一个 =APF($Jxx, "string1", "string2") 并且我想将 12 列(不是一个接一个)替换为 =RDT("prog.id", ," string1", $Jxx) 【参考方案1】:

ActiveSheet.UsedRange 是当前工作表上所有已使用单元格的范围。 您可以使用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

但是你想要的可能不一样,你能说的更具体点吗?

【讨论】:

这是一个 =APF($Jxx, "string1", "string2") 并且我想将 12 列(不是一个接一个)替换为 =RDT("prog.id", ," string1", $Jxx)。 你能指望你的列长度相等吗,或者这是未知的? 我不完全确定,但我不会指望这一点。 Wally,你的回答确实解决了这个问题,但我还有很多工作要做,所以赞誉并接受 =)【参考方案2】:

以下将完成您需要做的事情。您只需要提供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

【讨论】:

【参考方案3】:

编辑:修正错字

以下函数将构建具有不同长度列的范围。使用该函数返回所需范围并一次性填充所有相关单元格。

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

【讨论】:

以上是关于VBA 列循环的主要内容,如果未能解决你的问题,请参考以下文章

高分跪求 VBA word中实现循环搜索 并在WORD中找到列表 再根据已有数据自动填写进本行其它列

excel vba 的读取列,写入列,循环和if 的一些操作

VBA:循环遍历各种Excel文件并将列复制到主文件中[关闭]

没有 VBA 的迭代/循环替换

vba for循环

使用VBA循环遍历每一列并从大到小排序