在列表对象中使用表作为VBA中的常量值

从前面的问题来看,我有代码根据标题行和第一列的内容更新dynamic表格中的特定单元格。 常量值是代码中的固定值,但是现在我需要能够将其引用到映射表中,以便可以一次更新多个单元格。

现有的代码和我需要使用的表格的例子如下。

sub ChangeTable() Dim wsMapping As Worksheet Dim wsData As Worksheet Dim tbl As ListObject Dim x As Long Dim i As Long Dim hdrCount As Long Const ACCT_NO = "ABCD1234" Const HEADING = "Analysis/*" Const NEW_VAL = "80321" Set wsData = Worksheets("Test Sheet") Set wsMapping = Worksheets("Mapping") Set tbl = wsData.ListObjects("Data") hdrCount = tbl.HeaderRowRange.Columns.Count For x = 1 To tbl.ListRows.Count With tbl.ListRows(x) If .Range(1, 1).Value2 = ACCT_NO Then For i = 2 To hdrCount If (tbl.HeaderRowRange(i).Value2 Like HEADING) Then If (Not IsEmpty(.Range(1, i).Value)) Then .Range(1, i).Value = NEW_VAL End If End If Next End If End With Next End Sub 

在Excel中的单独表单中,将会有一个包含帐号和新值的列表。 最多可以有10个不同的帐号进行更改,每次生成文件时这个数字可能是可变的,所以代码每次使用时都需要处理可变数目的常量。

 ABCD1234 80310 ABCD1235 80311 ABCD1236 80312 ABCD1237 80313 ABCD1238 80314 ABCD1239 80315 ABCD1240 80316 

我想我需要定义表格范围,并说一些类似于:

如果不是IsEmpty(Cells(x,1))Then(Const ACCT_NO = Cells(x,1)AND Const NEW_VAL = Cells(x,2))

并循环遍历表中的每一行。 这会工作吗?

除了你不能改变存储在一个常量中的值(它们是按照定义,是不变的,即不变的),这听起来像是你在正确的轨道上。

将当前的常量声明为正常的stringvariables(例如Dim ACCT_NO As String ),然后可以使用If not IsEmpty(Cells(x, 1)) Then ACCT_NO = Cells(x, 1): NEW_VAL = Cells(x, 2) in一个循环。

可能你的代码最终会看起来像这样:

 Sub ChangeTable() Dim wsMapping As Worksheet Dim wsData As Worksheet Dim tbl As ListObject Dim x As Long Dim i As Long Dim rowAcctNo As Long Dim lastrowAcctNo As Long Dim wsAcctNo As Worksheet Dim hdrCount As Long Dim ACCT_NO As String CONST HEADING = "Analysis/*" Dim NEW_VAL As String Set wsData = Worksheets("Test Sheet") Set wsMapping = Worksheets("Mapping") Set wsAcctNo = Worksheets("AcctNos") 'or whatever the sheet is called 'Determine how many account number rows to process With wsAcctNo lastrowAcctNo = .Cells(.Rows.Count, "A").End(xlUp).Row End With Set tbl = wsData.ListObjects("Data") hdrCount = tbl.HeaderRowRange.Columns.Count For rowAcctNo = 1 to lastRowAcctNo If Not IsEmpty(wsAcctNo.Cells(rowAcctNo, 1)) Then ACCT_NO = wsAcctNo.Cells(rowAcctNo, 1).Value NEW_VAL = wsAcctNo.Cells(rowAcctNo, 2).Value For x = 1 To tbl.ListRows.Count With tbl.ListRows(x) If .Range(1, 1).Value2 = ACCT_NO Then For i = 2 To hdrCount If (tbl.HeaderRowRange(i).Value2 Like HEADING) Then If (Not IsEmpty(.Range(1, i).Value)) Then .Range(1, i).Value = NEW_VAL End If End If Next End If End With Next End If Next End Sub