Excel VBA If Cells(x,J)。值=值

时间:2019-03-05 16:59:52

标签: excel vba

我对excel vba还是很陌生,但我希望使用if语句来输入值。以下是我尝试使用的功能。它将在粗体行上引发编译错误。基本上,如果Jx = N / A,我将尝试用单元格AXx替换单元格Jx。请帮忙!

Public Function GetDivisionFromCustRef()

Sheet1.Select

Dim x As Integer

x = 1

Do Until x > 8

**If Cells(x, J).Value = "N/A"**
    **Then**
        Cells(x, J).Value = Cells(x, AX).Value
        x = x + 1        
    Else: Cells(x, J).Value = Cells(x, J)
End If
Loop
End Function 

2 个答案:

答案 0 :(得分:2)

J是有效的变量名。在VBA中,当您希望将某些内容作为字符串文字时,需要将其用双引号引起来,因此"J"-就像您在其中使用"N/A"一样。

如果您的模块在顶部使用Option Explicit,则该J可能会因为未声明的变量而导致编译错误-这是一件好事!您应始终在每个模块的顶部指定Option Explicit,这样,错别字和未声明的变量将阻止编译可能无法产生正确输出的程序。

If...Then语句必须与Then关键字在同一行上具有If令牌-编写If语句有两种方法。

内联:

If {condition} Then {statement}

或阻止:

If {condition} Then
    {statements}
{Else}
    {statements}
End If

请注意,指令分隔符令牌(:)在Else之后是多余的。

该过程为Function;函数通常返回结果-调用者可以使用的东西。给定名称“从cust ref获取划分”,我期望该函数返回类似于给定客户代码的划分代码之类的内容。您可以通过分配函数标识符来使函数返回其结果:

GetDivisionFromCustRef = {result}

函数通常没有副作用,例如选择工作表或替换单元格值。您有一个Function过程,但您却像Sub那样使用它。改为将其设为Sub过程,并按其用途命名-它不会“得到”任何东西。像这样:

Public Sub UpdateDivisionForCustomers()

Sheet1不需要选择或激活。与其处理不合格的Cells成员调用,不如使用以下Sheet1对象作为限定符:

If Sheet1.Cells(...) ... Then
    Sheet1.Cells(...) = Sheet1.Cells(...)
End If

如果反复键入“ sheet1”变得烦人,则可以使用With块:

With Sheet1
    If .Cells(...) ... Then
        .Cells(...) = .Cells(...)
    End If
End With

最后,字符串文字"N/A"不是工作表单元格错误值,而是一个包含字符N/A的字符串文字。如果要验证公式是否返回了#N/A错误,则需要使用IsError函数,因为该单元格的值将是数据类型Variant/Error,并尝试比较该数据使用Error以外的任何其他类型进行输入都会引发运行时错误13 /“类型不匹配”。


结合了以上所有内容:

Option Explicit

Public Sub UpdateDivisionForCustomers()

    Dim x As Integer        
    x = 1

    Do Until x > 8       
        If IsError(Sheet1.Cells(x, "J").Value) Then
            Sheet1.Cells(x, "J").Value = Sheet1.Cells(x, "AX").Value
            x = x + 1
        Else
            Sheet1.Cells(x, "J").Value = Sheet1.Cells(x, "J").Value
        End If
    Loop

End Sub

答案 1 :(得分:1)

只是想提供一种更快,也许更有效的方法来做到这一点。我当然假设您的单元格中有公式。

On Error Resume Next 'needed here in case there are no formula cells with errors
Dim errors As Range
Set errors = Range("J1:J8").SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0 'be sure turn error catching back on 

If Not errors Is Nothing Then

    With errors
        .FormulaR1C1 = "=RC[40]"
        .Value = .Value
    End With

End If

如果还需要平整公式以获取正确的值,则可以在其他代码执行之后添加以下行:

With Range("J1:J8").SpecialCells(xlCellTypeFormulas)
   .Value = .Value
End With