VBA检查范围内单元格值的长度



我有填充主工作表 A 列 (A7:A446( 中的单元格的代码。这些值列在不同的工作表 (Sheet3( 中,用户双击他们想要在主工作表上填充活动单元格的代码。这些代码具有随之而来的说明(E列,E7:E446(,代码本身的长度应该是21个字符。目前,描述列(列E(有一个IF(ISNA(VLOOKUP...((公式,用于提取与在Sheet3中双击的帐户代码关联的帐户描述。我想用 VBA 编写,一个检查 A 列中的代码长度是否为 21 个字符的子。如果帐户代码的长度不是 21 个字符,我希望描述(并且只有描述(为"N/A"以指示代码无效。此外,如果 A 列中的代码不等于 Sheet3 中列出的任何帐户代码,我希望执行相同的操作,E 列中的描述为"N/A",并且是唯一的描述。

我知道我可能可以使用描述列本身内的公式或函数来做到这一点,但为了更好地熟悉 VBA,我想这样做。我试图写一个子来做到这一点,但它没有工作。我想我已经将一些变量设置为不正确的数据类型,但我不完全确定。任何帮助/建议将不胜感激。

Sub acctCodeVarification()
acctCode = Sheet2.Range("C7:C446").Value
acctDesc = Sheet2.Range("E7:E446").Text
For Each c In Range("C7:C446").Cells
If Len(c) <> 21 Then
c.acctDesc = "N/A"
If c <> Sheet3.Range("A1:A20681").Value Then
c.acctDesc = "N/A"
End If
End If
Next c
End Sub

您的描述和您提供的代码不匹配,这引发了一些问题,但这是我根据您提供的代码所做的假设:

  • 您的"主"表是表2
  • 您的"验证"表是表3
  • 正在验证的帐户代码位于主工作表的 C 列中,从单元格 C7 开始
  • 描述(根本不经过检查或验证(位于主工作表的 E 列中,从单元格 E7 开始
  • 要验证的实际帐户代码列表位于"验证"表的 A 列中
  • 如果正在检查的帐户代码不是正好 21 个字符,请将该单元格(主表中的 C 列(及其描述设置为"N/A">
  • 如果帐户代码为 21 个字符,但在验证列表中找不到,请仅将说明设置为"N/A">

按照该逻辑,此代码应该适合您:

Sub tgr()
Dim wb As Workbook
Dim wsMain As Worksheet
Dim wsVerify As Worksheet
Dim rAcctCodes As Range
Dim rAcctCell As Range
Set wb = ActiveWorkbook
Set wsMain = wb.Sheets("Sheet2")    'Change to actual name of worksheet
Set wsVerify = wb.Sheets("Sheet3")  'Change to actual name of worksheet
Set rAcctCodes = wsMain.Range("C7", wsMain.Cells(wsMain.Rows.Count, "C").End(xlUp))
For Each rAcctCell In rAcctCodes.Cells
If Len(rAcctCell.Value) <> 21 Then rAcctCell.Value = "N/A"
If WorksheetFunction.CountIf(wsVerify.Columns("A"), rAcctCell.Value) = 0 Then wsMain.Cells(rAcctCell.Row, "E").Value = "N/A"
Next rAcctCell
End Sub

由于以下变量声明为字符串,因此它们不需要"Set"语句。 所以代替:

Set acctCode = Sheet2.Range("C7:C446").Value
Set acctDesc = Sheet2.Range("E7:E446").Text

这样做:

acctCode = Sheet2.Range("C7:C446").Value
acctDesc = Sheet2.Range("E7:E446").Text

试试这个:

Dim acctCode As Range
Set acctCode = Worksheets("Sheet2").Range("C7:C446")
For Each c In Range("C7:C446").Cells
If Len(c.Value) <> 21 Then
Worksheets("Sheet2").Range("E" & c.Row) = "N/A"
Else
If Worksheets("Sheet3").Range("A1:A20681").Find(c.Value,LookIn:=xlValues).Value Is Nothing Then
Worksheets("Sheet2").Range("E" & c.Row) = "N/A"
Else
Worksheets("Sheet2").Range("E" & c.Row) = c.Value
End If
End If
Next c

最新更新