Arrays 按列循环单元格的最有效方法
我需要逐列遍历一张表的每个单元格。我认为,将范围转换为数组可能是最明智的选择,因为我需要在68列中循环5000行 我需要用一个设定值替换5000多行(不同位置)的零。下图是我的表格的样子。需要用相应行的平均值替换零Arrays 按列循环单元格的最有效方法,arrays,excel,vba,Arrays,Excel,Vba,我需要逐列遍历一张表的每个单元格。我认为,将范围转换为数组可能是最明智的选择,因为我需要在68列中循环5000行 我需要用一个设定值替换5000多行(不同位置)的零。下图是我的表格的样子。需要用相应行的平均值替换零 子搜索替换() 将wb设置为工作簿 设置wb=ThisWorkbook 我想我会坚持多久 Dim j尽可能长 变暗lr为长 暗色如长 Dim rng()作为变量 将ws设置为工作表 作为变体的Dim-arr 设置ws=wb.工作表(1) 'lr=包含数据的最后一行 设置ws=Act
子搜索替换()
将wb设置为工作簿
设置wb=ThisWorkbook
我想我会坚持多久
Dim j尽可能长
变暗lr为长
暗色如长
Dim rng()作为变量
将ws设置为工作表
作为变体的Dim-arr
设置ws=wb.工作表(1)
'lr=包含数据的最后一行
设置ws=ActiveSheet
使用ActiveSheet
lr=范围(“C”和Rows.Count).End(xlUp).Row
'最后一列编号MO66
col=范围(“BP1”)。列
'具有平均值的克隆
colavg=范围(“BQ1”)。列
'Debug.Print colavg
'定义范围
“单元格(行、列)!
'我的范围存储为数组
rng=范围(单元格(3,3),单元格(3,col+6))。价值
'循环遍历数组的每个值
对于i=1至70'70列
如果rng(1,i)=0,则
rng(1,i)=5.34
如果结束
接下来我
以
端接头
假设每行只显示一次查找值(0)
请尝试此代码并阅读注释以调整它以满足您的需要
Public Sub ReplaceValueWithRowAverage()
Dim evalRange As Range
Dim evalCell As Range
Dim targetCell As Range
Dim targetValue As Double ' Adjust type to fit your needs
Dim averageValue As Double ' Adjust type to fit your needs
Dim evalSheetName As String
Dim evalRangeAddress As String
targetValue = 0
evalSheetName = "Sheet1"
evalRangeAddress = "A5:BP5232" ' This could be UsedRange with SpecialCells if sheet contains the target range
Application.ScreenUpdating = False
' Set the range to be evaluated
Set evalRange = ThisWorkbook.Worksheets(evalSheetName).Range(evalRangeAddress)
' Loop through each row
For Each evalCell In evalRange.Columns(1).Cells
' Get the average value
averageValue = evalCell.Offset(0, evalRange.Columns.Count - 1).Value2
' Find the target cell with value in row
Set targetCell = evalCell.Resize(1, evalRange.Columns.Count - 1).Find(targetValue, LookIn:=xlFormulas, LookAt:=xlWhole)
' Replace the value with row average
If Not targetCell Is Nothing Then targetCell.Value2 = averageValue
Next evalCell
Application.ScreenUpdating = True
MsgBox "Finished"
End Sub
编辑:
要替换所有引用,可以使用Range.Replace方法
Public Sub ReplaceValueWithRowAverage()
Dim evalRange As Range
Dim evalCell As Range
Dim targetCell As Range
Dim targetValue As Double ' Adjust type to fit your needs
Dim averageValue As Double ' Adjust type to fit your needs
Dim evalSheetName As String
Dim evalRangeAddress As String
targetValue = 0
evalSheetName = "Sheet1"
evalRangeAddress = "A5:BP5232" ' This could be UsedRange with SpecialCells if sheet contains the target range
Application.ScreenUpdating = False
' Set the range to be evaluated
Set evalRange = ThisWorkbook.Worksheets(evalSheetName).Range(evalRangeAddress)
' Loop through each row
For Each evalCell In evalRange.Columns(1).Cells
' Get the average value
averageValue = evalCell.Offset(0, evalRange.Columns.Count - 1).Value2
' Replace all ocurrences in row
evalCell.Resize(1, evalRange.Columns.Count - 1).Cells.Replace What:=targetValue, Replacement:=averageValue, _
LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, _
SearchFormat:=False, ReplaceFormat:=False
Next evalCell
Application.ScreenUpdating = True
MsgBox "Finished"
End Sub
我没有使用数组,因为在这种情况下,循环通过每个单元格的速度非常快
注意:如果有效,请记住标记答案以帮助他人将单元格值复制到数组中。然后修改了该数组。显然,这不会影响从中复制阵列的单元格。如果要将其复制回单元格,请按相反的顺序执行,
Range(单元格(3,3),单元格(3,col+6)).Value=rng
。编辑并发布一些示例数据,以及您预期的结果。您能否告诉我,当满足条件时,如何替换数组中的值,然后将其粘贴到我从数组中获取的范围内?@RicardoDiaz我刚刚做了,您如何计算平均值?谢谢,但行中可能有多个零,所以我必须逐列检查每个单元格,看看它是否等于零,然后替换它!。我试着用两个for循环和单元格,但对5000行来说太长了。@neutronhammer查看我的编辑