首页 > 解决方案 > Excel VBA 如果单元格(x,J)。价值=价值

问题描述

我对 excel vba 很陌生,但我希望使用 if then 语句来输入值。以下是我尝试使用的功能。它在粗体行上引发编译错误。基本上,如果 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 

标签: excelvba

解决方案


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函数,因为该单元格的值将是 data type Variant/Error,并且尝试将该数据类型与除 an 之外的任何内容进行比较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

推荐阅读