参考用于配方的片材和单元格

时间:2018-05-28 01:13:01

标签: excel excel-vba excel-formula vba

我有一个工作簿,我想在第一张工作表(B1)中引用一个范围,用于在第二张工作表(B3)的单元格中输入公式。我的问题是第一个Sheet的名字将永远改变,所以我想绕过这个我会根据公式可以使用的单元格引用创建一个变量。这就是我到目前为止所做的:

Sub GetCellAddress()

Dim Cell As Range
Dim CellAddress As String
Set Cell = ActiveWorkbook.Worksheets(1).Cells(1, 2)
CellAddress = Cell.Parent.Name & "!" & Cell.Address(External:=False)

With ActiveSheet
    Range("B3").Select
    ActiveCell.Formula = _
    "=CONCATENATE(""Balance Sheet"","" - "",MID(CellAddress,FIND("" "",CellAddress,FIND("","",CellAddress)+2)+1,256))"
End With

'MsgBox CellAddress

End Sub

虽然MsgBox会确认我有的CellAddress是Sheet1!$ B1 $ 1我似乎无法通过使用CellAddress在公式中传递此引用,因为我得到#NAME?我使用它时出错。 如果我使用Sheet1!R [-2] C作为ActiveCell.FormulaR1C1语法,它工作正常,但正如我之前解释的,我希望代码解析工作表名称。要么我的语法错误,要么我的方法可能是在另一个工作表中引用范围的错误方法。任何人都可以告诉我我哪里出错了。

3 个答案:

答案 0 :(得分:2)

在尝试上述解决方案后,我使用了以下语法:

 Sheets(2).Range("B3").Formula = "=CONCATENATE(""Balance Sheet"","" - "",
 MID(" & Sheets(1).Name & "!B1,FIND("" "", " & Sheets(1).Name & "!B1,
 FIND("","", " & Sheets(1).Name & "!B1)+2)+1,256))"

似乎解决了我参考表格时遇到的问题。因此,在使用@asleedawg的Index方法时,只需将引号放在正确的位置即可。

如果表格中有空格,则必须小心。如果是,则在引用工作表名称的双引号周围添加单引号。

答案 1 :(得分:0)

我怀疑问题可能是由于单元格地址的语法。如果您从表格空间'中取消单元格A1在' Sheet1'中,你应该得到:

str()

请注意,工作表名称包含在" ' "当工作表名称中有空格时。当工作表名称是单个单词时," ' "自动格式化,但仍然是有效的参考(即='sheet space'!A1有效)

尝试:

='Sheet1'!A1

答案 2 :(得分:0)

使用工作表索引号而不是名称:

据我了解,至少部分问题是您需要能够引用工作表,即使工作表的名称有时会发生变化。

您可以参考工作表的索引编号而不是其名称。

此临时子将在立即窗口中列出现有工作表的名称和索引号: Ctrl + G

Sub CheckIdx()
   Dim ws as Worksheet
   For Each ws In Sheets
     Debug.Print ".Index=" & ws.Index,".Name=" & ws.Name,".CodeName=" & ws.CodeName
   Next ws
End Sub

名称不会改变索引号。

如果您有一个名为“data”且索引编号为3的工作表,您可以按名称引用它:

Sheets("data")

......或者,按号码:

Sheets(3)

编辑:

正如@Chris指出的那样,工作表Index数字执行更改,例如,如果更改了工作表标签的顺序。

这可以通过protecting the workbook(有或没有密码)来阻止,点击:

  • 审核 保护工作簿 (仅检查“结构” ) 确定

  • 密码不是必需的,但是可选的。 Protecting the workbook structure阻止用户添加,移动,删除或隐藏/取消隐藏工作表, protecting the worksheet相同,因此仍可以编辑单元格等。

另一种方法是使用worksheet CodeName property代替Index。从技术上讲,这个可以也可以改变,但不太可能。

我已将CheckIdx函数(上图)更新为包含CodeName,因此如果您想要使用此路线。