使用Range.Replace的Excel 2010 Range.FormulaArray


3

我正在尝试自动化一些日常工作,我使用INDEX()+ MATCH()数组公式将一些数据从不同的工作簿中获取到一个“主”工作簿中。手动按预期工作,但现在我想自动执行此过程。

我已经触及Range.FormulaArray属性的255个字符限制,并试图通过使用此处提供的技巧来规避它,但没有运气。

运行此代码时,公式的p1部分将插入范围,但不会执行2 .Replace。

我尝试了.Replace函数的“What”部分的不同变体,“X_X_X()”和“{0}”以及其他很多没有运气的部分。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim p1, p2, p3 As String
p1 = "=IF(G2<>"""",INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P,MATCH(1,({0})*({1}),0)),"""")"
p2 = "B2='C:\path\to\[document.xlsx]Sheet1'!$B:$B"
p3 = "C2='C:\path\to\[document.xlsx]Sheet1'!$C:$C"

With ws.Range("R2")
    .FormulaArray = "=IF(G2<>"""",INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P,MATCH(1,({0})*({1}),0)),"""")"
    .Replace "{0}", p2
    .Replace "{1}", p3
End With

我手动粘贴的公式是:

=IF(G2<>"";INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P;MATCH(1;(B2='C:\path\to\[document.xlsx]Sheet1'!$B:$B)*(C2='C:\path\to\[document.xlsx]Sheet1'!$C:$C);0));"")

你可以将一个截断名称的快捷方式放在直接下的文件中C:\ 吗?因此C:\path\to\[The_Document_Here.xls]转向C:\thedoc.xls
JaredT 2016年

你需要公式还是结果?
Raystafarian 2016年

@Raystafarian我不确定你的意思,但我需要在范围内有正确的公式(提供的代码只是整个脚本的一部分)。我用它来将某些文本的翻译合并到一个文档中。所有这些都需要重复100个工作簿:D
bwedel 2016年

1
我的意思是你可以在幕后使用公式并将结果放在单元格中吗?
Raystafarian 2016年

究竟是什么问题?你收到任何错误信息吗?
MátéJuhász2016年

Answers:


2

我确实设法通过首先在“主”工作簿中为外部工作簿中的范围定义名称来解决它。通过这样做,我将公式保持在.FormulaArray的255个字符限制之下。这是一个很好的夜晚睡眠和问题的新眼睛:-)


1

考虑首先正常输入公式,然后将其转换为数组公式,就像在工作表中一样:

Sub qwerty()
    ActiveCell.Formula = "=MAX(IF(A2>B1:B12,B1:B12))"
    With Application
        .SendKeys "{F2}" ' get into edit mode
        .SendKeys "^+~" '  use CNTRL + Shift = Enter
    End With
End Sub

编辑#1:

该宏应该从Excel窗口而不是VBE窗口运行。


1
如果我尝试,我得到一个“必须指定搜索字符串”错误:(
bwedel 2016年

1
@bwedel SORRY ..............你必须从Excel窗口而不是VBE窗口运行它!
Gary的学生

这是我使用数组公式的唯一方法。我不得不强制重新计算一个数组公式,没有其他我尝试过的工作:全书重计,工作表重计,范围重计,(这些没有效果)设置range.FormulaArray(这产生“无法获得的FormulaArray属性范围类“)。
TA先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.