Одним из способов решения проблемы длины строки является разбиение формулы на «чанки» и замена этих чанков после установки формулы.
Допустим, у вас есть некоторый диапазон с именем 'r
', и у вас есть условие if, каждый из параметров которого имеет длину 120 байтов:
r.Formula = "=IF(P_01, P_02, P_03)"
r.Replace "P_01", "Parameter 1"
r.Replace "P_02", "Parameter 2"
r.Replace "P_03", "Parameter 3"
Ситуация становится немного сложнее, когда у вас очень длинные формулы, вы должны разбивать их на последовательные шаги, каждый со своими подвыражениями.
Предостережение: вы не можете ввести синтаксическую ошибку в любой момент, иначе она не будет выполнена. Я столкнулся с этим достаточно, чтобы иметь такой код:
m_rng_CurrentListItem.Replace "C_2_", m_str_FormulaReplacement1
m_rng_CurrentListItem.Replace "C_3_", m_str_FormulaReplacement2
m_rng_CurrentListItem.Replace "C_4_", m_str_FormulaReplacement3
m_rng_CurrentListItem.Replace "C_5_", m_str_FormulaReplacement4
m_rng_CurrentListItem.Replace "R_2_", m_str_FormulaReplacement5
m_rng_CurrentListItem.Replace "C_6_", m_str_FormulaReplacement6
Microsoft действительно должна исправить это ограничение, потому что это головная боль автоматизации отчетов.
Редактировать
Я решил сделать небольшой пример с этим и расширил его до нескольких классов, которые можно использовать для представления более широкого решения.
Вы можете скачать его здесь . Чтобы лучше всего это проиллюстрировать, откройте редактор Visual Basic (Alt + F11), поместите его справа от экрана, выделитесь слева от экрана. В таблице выберите ячейку A1, в VBA перейдите к строке 291 модуля «Формула генерации». Поместите точку останова там. В строке 317 находится метод с именем «test», запустите этот метод и наблюдайте, как формула постепенно прогрессирует. Ниже приведены шаги, которые должны следовать, цифры могут измениться.
1
{=F_C_35}
2
{=SUM(F_C_34)}
3
{=SUM(IF(B_O_29, L_C_33, B_O_32))}
4
{=SUM(IF(P_E_27 = P_E_28, L_C_33, B_O_32))}
. , , Усеченный
34
{=SUM(IF(((TestTable3[Right Column] > 5)&(TestTable3[Right Column] < 50)&(TestTable3[Left Column] <> "Exclude Marker")&(TestTable3[Left Column] <> "Exclude Marker 19")) = (TRUE&TRUE&TRUE&TRUE), TestTable3[Right Column], L_C_30 + I_V_31))}
35
{=SUM(IF(((TestTable3[Right Column] > 5)&(TestTable3[Right Column] < 50)&(TestTable3[Left Column] <> "Exclude Marker")&(TestTable3[Left Column] <> "Exclude Marker 19")) = (TRUE&TRUE&TRUE&TRUE), TestTable3[Right Column], TestTable3[Right Column] + I_V_31))}
36
{=SUM(IF(((TestTable3[Right Column] > 5)&(TestTable3[Right Column] < 50)&(TestTable3[Left Column] <> "Exclude Marker")&(TestTable3[Left Column] <> "Exclude Marker 19")) = (TRUE&TRUE&TRUE&TRUE), TestTable3[Right Column], TestTable3[Right Column] + 100))}
После расширения его для моих нужд (не отраженного в примере и удаления префикса 'xl' в пользу 'fg') я использовал его для создания более 700 выражений символов; fgRangedIndex выглядит так: INDEX (vArray, vRow1, [vColumn1]): Index (vArray, vRow2, [vColumn2]).
Set m_exp_CurrentExpression = _
fgIfCall( _
fgAndCall(fgBinaryOperation(m_nam_PreviousSelection, fgBinOpInequality, "None", True), _
fgBinaryOperation(m_nam_PreviousSelection, fgBinOpInequality, vbNullString, True)), _
fgIndexCall( _
fgRangedIndex(m_nam_PreviousList, 2, fgCountACall(m_nam_PreviousList), 1, 1), _
fgMatchCall(0, _
fgIfCall( _
fgComplexAndCondition( _
fgBinaryOperation( _
fgRangedIndex(m_nam_PreviousList, 2, fgCountACall(m_nam_PreviousList), 1, 1), fgBinOpInequality, m_nam_PreviousSelection), _
fgBinaryOperation(fgRowCall(fgRangedIndex(m_nam_PreviousList, 2, fgCountACall(m_nam_PreviousList), 1, 1)), fgBinOpGreaterThanOrEqualTo, fgRowCall()), _
fgIsNaCall(fgMatchCall(fgRangedIndex(m_nam_PreviousList, 2, fgCountACall(m_nam_PreviousList), 1, 1), _
fgRangedIndex(m_nam_CurrentName, 1, fgBinaryOperation(fgRowCall(), fgBinOpSubtraction, fgRowCall(fgIndexCall(m_nam_PreviousList, 1, 1)), True), 1, 1), 0))), 0, 1), 0), 1), vbNullString)
Какие выходы:
{=IF(AND((AMBIGUATED_NAME_CRITERION_SELECTION_1 <> "None"), (AMBIGUATED_NAME_CRITERION_SELECTION_1 <> "")), INDEX((INDEX(AMBIGUATED_NAME_CRITERION_1, 2, 1):INDEX(AMBIGUATED_NAME_CRITERION_1, COUNTA(AMBIGUATED_NAME_CRITERION_1), 1)), MATCH(0, IF(((((INDEX(AMBIGUATED_NAME_CRITERION_1, 2, 1):INDEX(AMBIGUATED_NAME_CRITERION_1, COUNTA(AMBIGUATED_NAME_CRITERION_1), 1)) <> AMBIGUATED_NAME_CRITERION_SELECTION_1))&((ROW((INDEX(AMBIGUATED_NAME_CRITERION_1, 2, 1):INDEX(AMBIGUATED_NAME_CRITERION_1, COUNTA(AMBIGUATED_NAME_CRITERION_1), 1))) >= ROW()))&(ISNA(MATCH((INDEX(AMBIGUATED_NAME_CRITERION_1, 2, 1):INDEX(AMBIGUATED_NAME_CRITERION_1, COUNTA(AMBIGUATED_NAME_CRITERION_1), 1)), (INDEX(AMBIGUATED_NAME_CRITERION_2, 1, 1):INDEX(AMBIGUATED_NAME_CRITERION_2, (ROW() - ROW(INDEX(AMBIGUATED_NAME_CRITERION_1, 1, 1))), 1)), 0)))) = (TRUE&TRUE&TRUE), 0, 1), 0), 1), "")}