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

我有代码填充主表单元A列(A7:A446)中的单元格。 这些值在不同的工作表(工作表3)中列出,用户双击他们想要在主工作表上填充活动单元的代码。 这些代码的描述(列E,E7:E446)与他们和代码本身应该是21个字符长。 目前,描述列(E栏)具有IF(ISNA(VLOOKUP …))公式来拉取与在Sheet3中双击的账户代码相关联的账户描述。 我想写在VBA中,检查列A中的代码长度是21个字符的子。 如果账户代码长度不是21个字符,我想要描述,只有描述是“N / A”,表示代码无效。 此外,如果A列中的代码与Sheet3中列出的任何账户代码都不相同,我希望采取同样的行动,E列中的描述是“N / A”,并且是唯一的描述。

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

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 

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

  • 您的“主”表是Sheet2
  • 您的“validation”工作表是Sheet3
  • 正在validation的科目代码位于主单C列中,从单元格C7开始
  • 说明(根本没有检查或validation)在主工作表E列中从E7单元开始
  • 要validation的实际帐户代码列表位于validation工作表A列中
  • 如果被检查的账户代码不是完全的21个字符,将该单元格(主表中的C列)及其描述设置为“N / A”
  • 如果账户代码为21个字符,但在validation列表中未find,则只将描述设置为“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 

由于以下variables被声明为string,所以它们不需要“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