如何从工作表公式编写excel页眉?

如何从工作表公式编写excel页眉?,excel,excel-2010,vba,Excel,Excel 2010,Vba,试图更改工作表.PageSetup.CenterHeader的值时遇到问题。现在,可以通过使用=运算符传递值来写入/读取该值,并且以下操作将很好地工作: Sub Test() Call writeHeaderValue(ThisWorkbook.Sheets("Sheet1"), "What what") End Sub Sub writeHeaderValue(ByRef mysheet As Worksheet, ByVal writeValue As String) Set my

试图更改
工作表.PageSetup.CenterHeader
的值时遇到问题。现在,可以通过使用
=
运算符传递值来写入/读取该值,并且以下操作将很好地工作:

Sub Test()
    Call writeHeaderValue(ThisWorkbook.Sheets("Sheet1"), "What what")
End Sub

Sub writeHeaderValue(ByRef mysheet As Worksheet, ByVal writeValue As String)
Set mysheet = ActiveSheet
    Debug.Print mysheet.Parent.Name
    Debug.Print mysheet.Name
    Debug.Print mysheet.PageSetup.CenterHeader

    Application.PrintCommunication = False
    mysheet.PageSetup.CenterHeader = writeValue
    Application.PrintCommunication = True
End Sub
但让我头疼的是,如果我从工作表中的公式调用的函数中调用同一个writeHeaderValue,它确实会显示值和对工作表的引用似乎是正确的,但它无法更改值。编译器没有错误或任何意外错误,但值不会更改。奇怪的是,debug.print部分清楚地显示了我有正确的引用,它还显示了该属性的当前值,但它没有更改,因此以下部分中一定有错误:

Function writeValue(ByVal myValue As String)
Application.Volatile
Dim mysheet As Worksheet
Dim r As Range
Set r = Application.Caller
Set mysheet = r.Parent

    Call writeHeaderValue(mysheet, myValue)
writeValue = myValue
End Function
若要尝试这项工作,您可以使用公式进行ex

=writeValue("TEST")
这会将文档标题中心值改为“TEST”,但您应该发现它并没有所以我的问题很简单-怎样才能使writeValue函数工作?

我直觉上觉得这与使用Application.Caller有关,但这是我想做的事情,以便根据公式所在的单元格传递对工作表的引用。第二种猜测是,在计算过程中发生了一些事情,在计算过程中禁用了写入功能,但是您告诉我


谢谢你的帮助

我认为问题在于,您从UDF(用户定义函数)
writeValue()
调用
.PageSetup.CenterHeader
。众所周知,Excel有时在UDF中表现异常。例如,您无法更改UDF中的单元格:
mysheet.Range(“A1”)。
writeValue()中的Value=“aa”
不会更改A1,也不会在VBA中引发错误。因此,我假设不可能在UDF中编写
.PageSetup.CenterHeader
。谢谢@Peh,我相信这可能是非常不幸的事实。但如果有一些解决办法,我肯定会很高兴。只是不要在UDF中这样做。使用
工作表\u Change
事件或其他方法读取工作表中任何更改的特定单元格的值,并将其写入标题或使用按钮事件或其他方法。我不知道你的目标是什么,所以这些只是建议。无论如何,UDF对于这个特定的任务来说是一个糟糕的方法:想象一下,如果有多个单元格包含
=writeValue()
函数,那么这会搞砸。谢谢@Peh,这实际上是一个非常好的建议。我想我会这样做。我想问题是,您从UDF(用户定义函数)
writeValue()
调用
.PageSetup.CenterHeader
。众所周知,Excel有时在UDF中表现异常。例如,您无法更改UDF中的单元格:
mysheet.Range(“A1”)。
writeValue()中的Value=“aa”
不会更改A1,也不会在VBA中引发错误。因此,我假设不可能在UDF中编写
.PageSetup.CenterHeader
。谢谢@Peh,我相信这可能是非常不幸的事实。但如果有一些解决办法,我肯定会很高兴。只是不要在UDF中这样做。使用
工作表\u Change
事件或其他方法读取工作表中任何更改的特定单元格的值,并将其写入标题或使用按钮事件或其他方法。我不知道你的目标是什么,所以这些只是建议。无论如何,UDF对于这个特定的任务来说是一个糟糕的方法:想象一下,如果有多个单元格包含
=writeValue()
函数,那么这会搞砸。谢谢@Peh,这实际上是一个非常好的建议。我想我会做那样的事。