未应用页脚的格式代码和页面方向数据不匹配

时间:2016-02-10 19:45:48

标签: excel vba excel-vba

我有一个工作表(adHoc),其中单元格b28包含

  

“& 9 2014年YTD PP财务数据”& Chr(10)& “& D& T”& Chr(10)& “版本1.0”& Chr(10)& “& F”

当我使用上面的内容更新另一个工作簿中的另一个工作表的页脚时。我没有得到嵌入格式 - 它显示了单元格b28中包含的内容。例如,excel应该看到& 9并使字体为9点。

我也遇到了页面方向的数据类型不匹配错误。单元格b36的内容为 xlLandscape

我上周在另一个董事会上发布了这个问题的副本,但没有得到任何答案。我希望有人能回答。

http://www.mrexcel.com/forum/excel-questions/919033-updating-pagesetup-using-cells-master-worksheet-orientation-formatting-footer-excel-visual-basic-applications.html

这是我正在使用的代码。

Sub page_setup()

  Dim reportWB As Excel.Workbook

  Dim sheet As Excel.Worksheet

  'open report workbook - name of workbook is in cell b4
  Set reportWB = Workbooks.Open(Workbooks("macros.xlsm").Sheets("adHoc").Range("b4").Value)

  Dim leftFooter

  leftFooter = Workbooks("macros.xlsm").Sheets("adHoc").Range("b28").Value

  For Each sheet In reportWB.Sheets

  With sheet

     .PageSetup.leftFooter = leftFooter

     .PageSetup.Orientation = Workbooks("macros.xlsm").Sheets("adHoc").Range("b36").Value

  End With     

Next

End Sub

2 个答案:

答案 0 :(得分:1)

读取您的页脚定义,就像它们被视为文字字符串,而不是代码。您需要以某种方式将代码解析为有效的页脚字符串。

对于LeftFooter字符串,您可以使用Evaluate来解决它,但需要将其编写为Excel公式,而不是VBA,因此请使用

  

“& 9 2014年YTD PP财务数据”& Char(10)& “& D& T”& Char(10)& “版本1.0”& Char(10)& “& F”

请注意,我使用Char而不是Chr,Excel公式等效。

对于Orientation,您使用的是命名常量,它不起作用。将值放在Excel工作表上(在这种情况下为2)或编写自己的代码以将名称解析为其值

工作版本(如上所述在工作表上更正了源数据)

Sub page_setup()
    Dim reportWB As Excel.Workbook
    Dim sheet As Excel.Worksheet
    Dim wsSource As Worksheet

    'open report workbook - name of workbook is in cell b4
    Set wsSource = Workbooks("macros.xlsm").Sheets("adHoc")
    Set reportWB = Workbooks.Open(wsSource.Range("b4").Value)

    Dim leftFooter
    leftFooter = wsSource.Range("b28").Value

    For Each sheet In reportWB.Sheets
        With sheet
            .PageSetup.leftFooter = Evaluate(leftFooter)
            .PageSetup.Orientation = wsSource.Range("b36").Value
        End With
    Next
End Sub

要处理常量,您可以添加一个UDF,将字符串名称解析为值,并从设置表中调用

例如

Function GetConst(s As String) As Variant
    Select Case s
        Case "xlLandscape"
            GetConst = xlLandscape
        Case "xlPortrait"
            GetConst = xlPortrait
        ' etc
    End Select

End Function

放入单元格B36 GetConst("xlLandscape")(作为字符串,而不是公式),并将您的Orientation代码行更改为

.PageSetup.Orientation = Evaluate(wsSource.Range("b36").Value)

将您想要的任何其他命名常量添加到Select Case语句。

答案 1 :(得分:0)

AFAIK,没有(直截了当的)方式来做你想要做的事情。当您将代码放入单元格,然后调用该单元格的值代替实际代码时,VBA尝试运行的不是:

.PageSetup.Orientation = xlLandscape

而是:

.PageSetup.Orientation = "xlLandscape"

会产生您所看到的错误和行为。

根据经验,如果你的VBA代码需要一个字符串(即“”中的某个东西)或一个数字,你可以在工作表上进行计算并让代码拉入值。

其他一切(万事达卡)将其放入代码中。例如:

leftfooter = cell1.value & Chr(10) & cell2.value & Chr(10) & cell3.value

(作为旁注,我不熟悉你在该字符串中尝试做的格式化......这些通常是通过像

这样的东西设置的
With sheet.PageSetup.leftFooter.
    .Font.Size = 9
    'etc...