我有代码填充主表的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;
答案 0 :(得分:2)
您的说明和提供的代码彼此不匹配会引发一些问题,但以下是我根据您提供的代码做出的假设:
遵循该逻辑,此代码应该适合您:
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