Arrays 按列循环单元格的最有效方法

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

我需要逐列遍历一张表的每个单元格。我认为,将范围转换为数组可能是最明智的选择,因为我需要在68列中循环5000行

我需要用一个设定值替换5000多行(不同位置)的零。下图是我的表格的样子。需要用相应行的平均值替换零

子搜索替换()
将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查看我的编辑