Excel Formararray - PullRequest
       13

Excel Formararray

0 голосов
/ 30 июня 2009

привет, почему я получаю ошибку времени выполнения 13: ошибка несоответствия типов во время выполнения следующего кода

 Application.Goto Reference:="R1C1:R232C221"
 Selection.FormulaArray = "=ROUND(a(),0)"
 Selection.Replace What:="a()", Replacement:="IF(IF(Sheet4!A1:HM232+Sheet5!A1:HM232=2,0," & _
"Sheet4!A1:HM232+Sheet5!A1:HM232)+IF(Sheet4!A1:HM232+Sheet5!A1:HM232=2,0," & _
"Sheet4!A1:HM232+Sheet5!A1:HM232)=2,0,IF(Sheet4!A1:HM232+Sheet5!A1:HM232=2,0," & _
"Sheet4!A1:HM232+Sheet5!A1:HM232)+IF(Sheet4!A1:HM232+Sheet5!A1:HM232=2,0,Sheet4!A1:HM232+Sheet5!A1:HM232))", LookAt _
    :=xlPart, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
    ReplaceFormat:=False
Range("I9").Select

1) я знаю, что формула должна быть в стиле R1C1 ... но стиль A1 не требуется, он также работает без проблем в стиле A1

  http://msdn.microsoft.com/en-us/library/bb208529.aspx

2) Я нашел этот способ записи из

  http://www.dailydoseofexcel.com/archives/2005/01/10/entering-long-array-formulas-in-vba/

Ответы [ 2 ]

4 голосов
/ 01 июля 2009

Давайте проанализируем вашу замену:

Replacement:="IF(IF(Sheet4!A1:HM232+Sheet5!A1:HM232=2,0," & _
"Sheet4!A1:HM232+Sheet5!A1:HM232)+IF(Sheet4!A1:HM232+Sheet5!A1:HM232=2,0," & _
"Sheet4!A1:HM232+Sheet5!A1:HM232)=2,0,IF(Sheet4!A1:HM232+Sheet5!A1:HM232=2,0," & _
"Sheet4!A1:HM232+Sheet5!A1:HM232)+IF(Sheet4!A1:HM232+Sheet5!A1:HM232=2,0,Sheet4!A1:HM232+Sheet5!A1:HM232))"

(1) изменить Sheet4!A1:HM232+Sheet5!A1:HM232 на X:

Replacement:="IF(IF(X=2,0," & _
"X)+IF(X=2,0," & _
"X)=2,0,IF(X=2,0," & _
"X)+IF(X=2,0,X))"

(2) склейте обломки вместе:

Replacement:="IF(IF(X=2,0,X)+IF(X=2,0,X)=2,0,IF(X=2,0,X)+IF(X=2,0,X))"

(3) изменить IF(X=2,0,X) на Y:

Replacement:="IF(Y+Y=2,0,Y+Y)"

(4) некоторая оценка:

  • Если X равен 2, Y равен 0, а результат равен 0.
  • Если X равен 1, Y равен 1, и результат 0.
  • Если X - это что-то еще, Y - это X, и результат 2 * X.

(5), поэтому формула эквивалентна:

Replacement:="IF(OR(X=2,X=1),0,2*X)"

(6), поэтому следующим шагом будет замена X (шаг 1 в обратном порядке) ...

Я просто оставлю вам вопрос или два: как это стало таким грязным? Вы слышали о «СУХОЙ» (не повторяйте себя)?

0 голосов
/ 30 июня 2009

Я считаю, что аргумент "замены" слишком длинный. Вы должны держать эту строку под 255 символов. Поместите больше формулы в строку Selection.FormulaArray, чтобы замена составляла менее 255 символов.

...