在列中运行,如果不适用,则直接替换为列右侧的单元格(Excel VBA)

在列中运行,如果不适用,则直接替换为列右侧的单元格(Excel VBA),vba,excel,Vba,Excel,我试图在Excel中开发一个宏,该宏在一列中运行,如果该值表示“N/a”,则将其替换为相应单元格右侧的单元格。因此,如果我正在搜索N/As的列是H列,那么我将从中提取的值将是I列中的下一列。下面是我试图构建的代码: Dim NACol As Range Dim NARange As Range Set NARange = DEV.Sheets("Input File Creator (DND)").Range("H2:H100") Set NACol = .cells.Find(What:=

我试图在Excel中开发一个宏,该宏在一列中运行,如果该值表示“N/a”,则将其替换为相应单元格右侧的单元格。因此,如果我正在搜索N/As的列是H列,那么我将从中提取的值将是I列中的下一列。下面是我试图构建的代码:

Dim NACol As Range
Dim NARange As Range

Set NARange = DEV.Sheets("Input File Creator (DND)").Range("H2:H100")

Set NACol = .cells.Find(What:="#N/A", _
        after:=.Range("H2"), _
        lookat:=xlPart, _
        LookIn:=xlValues, _
        searchorder:=xlByRows, _
        searchdirection:=xlPrevious, _
        MatchCase:=False).Row

For Each NACol In NARange
     'Paste the cell directly from the cell to the right
Next
我被困在这条路上了
如果这是解决此问题的正确方法,则每种方法都是正确的。谢谢

来点简单的好东西怎么样。突出显示不存在错误的列,然后单击“运行”

Sub Test()

    Dim c As Range
    Dim rng As Range

    Set rng = Selection

    For Each c In rng

        Debug.Print c.Value

        If Application.WorksheetFunction.IsNA(c.Value) Then c.Value = c.Offset(0, 1).Value

    Next c


End Sub

来点简单漂亮的怎么样。突出显示不存在错误的列,然后单击“运行”

Sub Test()

    Dim c As Range
    Dim rng As Range

    Set rng = Selection

    For Each c In rng

        Debug.Print c.Value

        If Application.WorksheetFunction.IsNA(c.Value) Then c.Value = c.Offset(0, 1).Value

    Next c


End Sub

对于循环和搜索条件,您的实现都有点不合适。假设N/A值是公式错误的结果,此代码应清除该错误

Dim NARange As Range, CheckCell As Range

Set NARange = DEV.Sheets("Input File Creator (DND)").Range("H2:H100")

For Each CheckCell In NARange
    If Application.WorksheetFunction.IsNA(CheckCell) Then
         CheckCell.Offset(0,1).Copy
         CheckCell.Select
         ActiveSheet.Paste  'Doing this rather than value will bring formatting
    End If
Next CheckCell

对于循环和搜索条件,您的实现都有点不合适。假设N/A值是公式错误的结果,此代码应清除该错误

Dim NARange As Range, CheckCell As Range

Set NARange = DEV.Sheets("Input File Creator (DND)").Range("H2:H100")

For Each CheckCell In NARange
    If Application.WorksheetFunction.IsNA(CheckCell) Then
         CheckCell.Offset(0,1).Copy
         CheckCell.Select
         ActiveSheet.Paste  'Doing this rather than value will bring formatting
    End If
Next CheckCell

我认为这是最短最快的方法,因为它只循环给定范围内的错误单元格。如果错误值是常量而不是公式,只需将xlCellTypeFormulas更改为xlCellTypeConstants即可


我认为这是最短最快的方法,因为它只循环给定范围内的错误单元格。如果错误值是常量而不是公式,只需将xlCellTypeFormulas更改为xlCellTypeConstants即可



像这样的NACol.Value=NACol.Offset0,1.Value?你能在公式中使用,ISNA吗,如果是x1,y1,x1之类的话。您有哪些错误/问题?能否更改导致不适用错误的初始公式?如果是这样的话,当单元格出错时,可以使用IfError公式来选择您想要的单元格。如果我遵循您的逻辑,您应该迭代返回的Find/FindNext范围。但我会用另一种方法,迭代整个NARange并检查每个单元格的NA。是N/A常数还是公式?类似于NACol.Value=NACol.Offset0,1.Value?你能在公式中使用,ISNA吗,所以ifisnax1,y1,x1类似的东西。您有哪些错误/问题?能否更改导致不适用错误的初始公式?如果是这样的话,当单元格出错时,可以使用IfError公式来选择您想要的单元格。如果我遵循您的逻辑,您应该迭代返回的Find/FindNext范围。但我会用另一种方法,迭代整个NARange并检查每个单元格的NA。是N/A常量还是公式?我会对range ActiveSheet.Cells.SpecialCellsxlFormulas,xlErrors使用下面的内容,而不是设置rng=Selection?是的,正如iDevelops回答的那样:我会对range ActiveSheet.Cells.SpecialCellsxlFormulas使用如下内容,Xlerors您会使用它而不是Set rng=Selection吗?是的,正如iDevelops回答的那样:这看起来很有希望而且简单,让我来试一试!是否有办法删除左侧的单元格和相应单元格,即使在我们运行它之后,它从右侧拉取另一个N/a@iDevlopthis看起来很有前途而且很简单,让我来试一试!是否有办法删除左侧的单元格和相应单元格,即使在我们运行它之后,它从右侧拉取另一个N/a@IdevLop感谢您查看我的流程并注意到我的失误。感谢您查看我的流程并注意到我的失误。