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 的一些操作