【发布时间】:2017-10-25 20:50:44
【问题描述】:
我的任务是:
- 必须将来自不同工作簿的几张工作表复制到新工作簿中
- 这些工作表中的每一个都包含一个 Excel 表格(一个 ListObject),其名称类似于带有后缀 T 的工作表(表格 Foo,表格:FooT)
- 新工作簿必须包含一个汇总表,其中列出了每个表的名称,并通过使用合适的公式引用它们来呈现各个表的各种值
这必须经常针对不同的工作簿完成,因此我们的想法是在 VBA 中执行此操作。
复制工作表很容易,在新工作表中列出表名很容易,但引用值会遇到问题。
大体思路是做以下事情
ActiveSheet.Range("A1").Value = "FooT"
ActiveSheet.Range("B1").Formula = "=FooT[[#Totals],[Quantity]]"
ActiveSheet.Range("C1").Formula = "=FooT[[#Totals],[Total List Price]]"
并遍历所有工作表。
设置 A 的值和 B 的公式按预期工作并得到预期的结果。
C 的问题在于,列标题实际上不是“总标价”,而是格式化为
“总计
列表
价格”
我无法改变这一点,这是一个设计决定。
如果我手动将公式添加到单元格中,这也是列名在公式中的显示方式。
所以这里发生了某种换行,我已经尝试在 VBA 中使用
ActiveSheet.Range("C1").Formula = "=FooT[[#Totals],[Total" & vbCrLf & _
"List" & vbCrLf & _
"Price]]"
和 vb_Cr 和 vb_Lf 和 vb_Newline 代替 vbCrLf。尝试将 C 的公式设置为任何这些变体都会产生臭名昭著的错误 1004。
从其中一张工作表中获取列标题的值并在公式中使用它是可行的。这可能是一种潜在的解决方法,但我真的很想知道我缺少什么或如何弄清楚如何正确构建此公式字符串。
【问题讨论】:
-
不能 100% 说 excel,但在 SQL 中,返回和换行对于列来说根本不是有效字符。这也适用于 .NET 中的数据网格和相关对象。我可以假设它也适用于excel。设计决定似乎把你逼到了一个角落。也许您可以存储索引并通过该值引用它?
-
您的公式没问题,但通常情况下,如果标题是从键盘设置的,则换行符将为 vbLf。我怀疑“总计”和/或“列表”之后有一个尾随空格。 (选择您的标题,然后在即时窗口中输入
Debug.Print Selection.Value,然后检查每行打印的结束位置。 -
@Excelosaurus 你能把这个变成答案吗? vbLf 有效,并且没有空格。似乎是您第二天打开 Excel 并且未更改的代码突然开始工作的错误之一。
标签: excel excel-formula excel-2010 vba