我对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
答案 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