2

我有一个工作簿怪物,我试图让那些在我之后使用它的人更容易管理它。我有大量代码在按下按钮时运行,以使其对那些对 Excel 知之甚少的人更加用户友好。所以这里是我需要帮助的地方。

我有几张带有类似表格的表格。我的第一张表包含客户信息的主列表并按下按钮,将此信息复制到其他表并对其进行排序以在各自的表上对这些客户进行分类。这允许我只在第一张表上输入新信息,并让它正确地自动填充表,以最大限度地减少人为错误。

为了减少很多错误,我在表格中使用了结构化引用。我最初并没有这种方式,但随着时间的推移,我一直在努力改进这本工作簿。无论如何,所以我在每个表中都有一个“费用类型”列,并且总列将其引用为

    [@[Charge Type]]

这很好,考虑到客户将定期添加和删除,这减少了错误。

但是,当此公式被复制到其他工作表之一时,它会转换为

    All_List[@[Charge Type]]

这会在 sheet1 上添加表的名称,即“All_List”。现在我希望它专门在新工作表上的新表中引用“收费类型”列,而我终生无法弄清楚如何。

4

1 回答 1

0

此解决方案使用一个变量来保存ListObject "Field"公式,然后循环遍历ListObjects同一工作簿中具有相同"Field"的所有其他公式,并将公式应用于该"Field"

之前的列表对象

Sub ListObjects_Formula_Copy()
Dim wsh As Worksheet
Dim lob As ListObject
Dim rTrg As Range
Dim sFld As String
Dim sFmlR1C1 As String

    Rem Get Formula from Primary ListObject
    sFld = "Price"                                                      'Change as required
    Set lob = ThisWorkbook.Sheets("Sht(0)").ListObjects(1)              'Change as required
    sFmlR1C1 = lob.ListColumns(sFld).DataBodyRange.Cells(1).FormulaR1C1

    Rem Apply Formula to Other ListObjects
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "Sht(0)" Then
            For Each lob In wsh.ListObjects
                Rem Validate Field
                Set rTrg = Nothing
                On Error Resume Next
                Set rTrg = lob.ListColumns(sFld).DataBodyRange
                On Error GoTo 0
                Rem Applies Formula
                If Not (rTrg Is Nothing) Then rTrg.FormulaR1C1 = sFmlR1C1
    Next: End If: Next

End Sub

ListObjects 之后 在此处输入图像描述

于 2016-11-26T15:00:05.200 回答