表中由代码管理的唯一公式

时间:2016-02-03 22:45:14

标签: excel vba excel-vba

我有一个带有“索引”工作表/工作表的工作簿,该工作簿维护工作簿中跟踪的所有项目的列表。每个项目都有自己的选项卡。我正在尝试使用以下代码以编程方式管理此操作:

Dim template As Worksheet
Dim newSheet As Worksheet
Dim newName As String


newName = Application.InputBox("Enter Project Name")        'get name
Worksheets("P0").Visible = True                             'Unhide template
Set template = ActiveWorkbook.Sheets("P0")                  'identify template
template.Copy After:=Sheets(Sheets.Count)                   'create copy
Set newSheet = ActiveSheet                                  'identify new sheet
newSheet.Name = newName                                     'rename sheet
'deleteNames (newSheet.Name)                                'delete copied named ranges with worksheet scope
newSheet.Range("C5").Value = newName                        'Change header on new sheet
Worksheets("P0").Visible = False                            'Hide template
Worksheets("Dashboard").Activate                            'switch back to dashboard

Dim Tbl As ListObject
Dim StrFormula1, StrFormula2 As String
Dim NewRow As ListRow
StrFormula1 = "=HYPERLINK(""#'" & newName & "'!A1"",'" & newName & "'!C5)"
StrFormula2 = "='" & newName & "'!C18"

Set Tbl = Range("tblProjects").ListObject
Set NewRow = Tbl.ListRows.Add(AlwaysInsert:=True)
NewRow.Range = Array(StrFormula1, StrFormula2)

问题是最后一行。它第一次很棒。它使用如下公式创建一个新行:

=HYPERLINK("#'Test Project'!A1",'Test Project'!C5)

enter image description here

但是当我添加第二行时,它会改变前一行:

=HYPERLINK("#'Another Project'!A1",'Another Project'!C4)

enter image description here

它应该我希望它仍然引用单元格C5。有人说我可以“将一个常量输入到列的一个单元格中。现在更改列中另一个单元格中的公式。将第一个单元格更改回原始公式。”但我希望有一个更清洁的解决方案。是否有设置或某些东西来禁用此行为?

我需要(希望)它成为一个表,这样我就可以轻松地排序和过滤并最终添加删除项目或以其他方式操作表的功能。

1 个答案:

答案 0 :(得分:0)

为什么不在输入工作表名称的位置添加另一列。

然后创建一个引用超链接函数中的列的公式。添加新行时,只需在工作表名称列中添加工作表名称。 Excel表的默认行为是将公式应用于新行。

=HYPERLINK(INDIRECT("'"&A2&"'!A1"),INDIRECT("'"&A2&"'!C5"))

![enter image description here

VBA代码现在只需要在新行中添加一个值,并使用工作表名称填充“工作表”列,您根本不需要编辑公式。

编辑:另一方面:如果Excel表的行为导致问题,为什么要使用表?如果您不使用表格,则不会出现错误。如果您使用VBA为每一行设置公式,那么只需使用常规范围,而不是表格。