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

时间:2017-07-11 13:46:26

标签: excel vba excel-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,我想这样做。我试图写一个子来做这个,但它没有工作。我想我已经将一些变量设置为不正确的数据类型,但我并不完全确定。任何帮助/建议将不胜感激。

WITH t2
AS (
    SELECT [QUOTATIONID]
        ,[QUOTATIONDATE]
        ,[SALESID]
        ,[RESPITEDATE]
        ,[ORDERACCOUNT]
        ,[INVOICEACCOUNT]
        ,[CUSTGROUP]
        ,[PURCHASEORDER]
        ,[DELIVERYNAME]
        ,[CUSTOMERREF]
        ,[DLVTERM]
        ,[DLVMODE]
        ,[PAYMENT]
        ,[CASHDISCCODE]
        ,[CASHDISCPERCENT]
        ,[QTY]
        ,row_number() OVER (
            PARTITION BY QUOTATIONDOCNUM ORDER BY recid DESC
            ) AS t1
    FROM [CUSTQUOTATIONJOUR_vw_revised]
    )
SELECT [QUOTATIONID]
    ,[QUOTATIONDATE]
    ,[SALESID]
    ,[RESPITEDATE]
    ,[ORDERACCOUNT]
    ,[INVOICEACCOUNT]
    ,[CUSTGROUP]
    ,[PURCHASEORDER]
    ,[DELIVERYNAME]
    ,[CUSTOMERREF]
    ,[DLVTERM]
    ,[DLVMODE]
    ,[PAYMENT]
    ,[CASHDISCCODE]
    ,[CASHDISCPERCENT]
    ,[QTY]
FROM t2
WHERE t1 = 1;

3 个答案:

答案 0 :(得分:2)

您的说明和提供的代码彼此不匹配会引发一些问题,但以下是我根据您提供的代码做出的假设:

  • 您的“主要”表格是Sheet2
  • 您的“验证”表格是Sheet3
  • 正在验证的帐户代码位于主页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

答案 1 :(得分:1)

由于以下变量声明为字符串,因此它们不需要“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

答案 2 :(得分:1)

试试这个:

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