【问题标题】:dynamic table references with Excel VBA使用 Excel VBA 的动态表引用
【发布时间】:2015-08-20 18:17:15
【问题描述】:

我有一个名为“组”的 Excel 表格,其中标题是组名。在组名下方的列中是该特定组的成员。

在另一个表中,第一列中包含所有成员名称,第一行中包含组名称。我想检查每个成员的名字是否在上面的组中。

要检查 Tim 是否在“家伙”组中,我可以使用以下公式:

=if( countif( groups[guys];"Tim")>0;"yes";"no")

但是我有一个命令按钮“添加组”,它打开一个用户表单,我可以在其中输入一个新组+成员。新组的名称输入到 textbox1。组和成员将添加到组表中。

我希望第二张表也能更新。我想做的是这样的:

With Worksheets("Overview").ListObjects("PersonIsInGroupTab")
    .ListColumns.Add Position:=3
    .HeaderRowRange(3).Value = TextBox1.Value
    .DataBodyRange(1, 3).formula= "=if( countif( groups[textbox1.value];""Tim"")>0;""yes"",""no"")" 
End With

很遗憾,这不起作用。

textbox1.value 是新组的名称(也添加到组选项卡中)。

我有什么办法可以完成这项工作吗?

编辑: 我尝试了另一种也不起作用但可能有助于回答问题的方法。 在检查某个人是否是某个组的成员的表格中,我默认从一个组开始。并手动输入公式

=if(countif(groups[guys],"Tim")>0,"yes","no")

进入单元格(在我的情况下为 J4)。当我使用用户窗体添加一个组“gals”时,我在表中得到第二列“gals”。当我手动将公式从 [guys] 单元格拖动到 [gals] 单元格 (K4) 时,它就像我想要的那样工作。我得到了公式

=if(countif(groups[gals],"Tim)>0,"yes","no")

在 gals 细胞 (K4) 中 所以我想我可以在 VBA 中做这个自动填充作为“添加组”例程的一部分。这是我使用的代码:

Range("groups[guys]").Select
Selection.AutoFill Destination:=Range("J4:K4"), Type:=xlFillDefault

我通过将自动填充记录为宏获得了此代码。但是当我运行它时,K4 中的公式与 J4 中的一样,使用 groups[guys] 而不是 groups[gals]。 我不能做 Destination:=Range("groups[[guys]:[gals]]") 因为我希望它可以与任何组名一起工作,而不仅仅是 gals。

【问题讨论】:

  • 您是否遇到任何具体错误?
  • 运行时错误 1004 在 .DataBodyRange(1, 3).formula= "=if( countif( groups[textbox1.value];"Tim")>0;"yes";"no") ”。我想我不能以这种方式引用。 textbox1.value 从用户表单中的文本框接收。如果 textbox1.value= group1 那么 groups[group1] 会起作用。不幸的是,我事先不知道 textbox1.value。
  • 公式不正确,需要修改。 (1)在公式中用双“”替换单“”,如"=if( countif( groups[textbox1.value];""Tim"")>0;""yes"";""no"")" 。(2)您使用的是非英文Excel版本。不过,在VBA中,所有公式都必须以英文格式传递。所以,你需要将 ; 替换为 ,如下所示:"=if( countif( groups[textbox1.value],""Tim"")>0,""yes"",""no"")"。这样会更好。
  • 谢谢!我纠正了这些错误。但是问题仍然存在;(我还注意到:当我将鼠标光标悬停在相关行中的 TextBox1.value 上时,它不会显示其值。它在其他行中会显示。这是否意味着 VBA 无法识别表中的 textbox1.value参考?

标签: vba excel


【解决方案1】:

我能够通过编写 VBA 函数而不是使用 countif 来解决问题。 功能是:

Function IsInGroup(group, member As String) As Boolean
For Each Item In group
    If Item = member Then
        IsInGroup = True
        Exit Function
    End If
Next Item
IsInGroup = False
End Function

我是这样使用它的:

temparray = ActiveSheet.ListObjects("groups").ListColumns(2).Range
With Worksheets("Overview").ListObjects("PersonIsInGroupTab")
    tempmember = .DataBodyRange(1, 1).Value
    .ListColumns.Add Position:=3
    .HeaderRowRange(3).Value = TextBox1.Value
    .DataBodyRange(1, 3).Value = IsInGroup(temparray, tempmember)
End With

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 2013-04-17
    • 1970-01-01
    • 2019-02-20
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多