Замена Excel VBA не работает с формулами

#excel #vba #replace #excel-formula

#excel #vba #заменить #excel-формула

Вопрос:

Я попытался заменить значение строковой формы, чтобы создать формулу:

Ячейка:

 "XY=(TRIM(CONCATENATE(AH11, AH12)))"
  

Теперь я использую классическую функцию replace в VBA:

 Cells.Replace What:="XY", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
  

При записи этого с помощью macro recorder это работает, и появляется формула, но при повторном запуске с помощью макроса это не работает.

Кто-нибудь знает почему?

Вся причина этого в том, что я создал «Создатель формул», который должен создать формулу на основе выпадающего списка, и это результат конкатенации выпадающего списка.

Спасибо!

Комментарии:

1. Что происходит или не происходит? Вы неявно отрабатываете ActiveSheet — было бы неплохо указать рабочую книгу / worksheet перед Cells .

2. Таким образом, вы можете воспроизвести его, имея только один лист и формулу со строкой перед «=». Теперь запишите Marco, чтобы заменить его. Это работает, но при попытке применить макрос снова это не работает.

3. Интересно то, что я могу заменить его любым другим значением. Таким образом, замена XY на YX работает, но не XY даром.

Ответ №1:

На первый взгляд выглядит нормально, проблема не сразу очевидна.

Несколько вещей, которые нужно попробовать:

  1. MatchByte — проверьте этот параметр — маловероятно, что причиной является сохраненный параметр.
  2. Попробуйте удалить последний аргумент FormulaVersion:=xlReplaceFormula2 и посмотрите, что произойдет
  3. Убедитесь, что «ячейки» ссылаются на объект range в вашем варианте использования (т. е. вы или ваш код переходите к ожидаемому листу, содержащему вашу ячейку, когда достигается эта строка вашего кода VBA).
  4. Подтвердите, что подстрока «XY» действительно является частью отображаемого значения вашей ячейки, а не ее формата. Вы можете сделать это в VBA, получив, например, Range($A$1).value2 (где «$ A $ 1» — это ссылка на вашу ячейку). Или вы можете сделать это в Excel, установив в другой ячейке формулу «= $ A $ 1», а затем отформатировав ее в general.

Исходя из вашего вопроса, я бы не ожидал, что что-либо из этого будет проблемой, но публикую здесь на случай, если это поможет устранить неполадки.

Ответ №2:

У меня возникла следующая проблема: я записал поиск / замену на свой компьютер, он выдал команду с «FormulaVersion:=xlReplaceFormula2». Я встроил это в свой макрос, и он отлично работал. Я установил свой макрос на другой компьютер, и команда find / replace каждый раз приводила к прерыванию макроса на этом компьютере, хотя на моем он работал нормально.
На втором компьютере я записал команду поиска / замены и обнаружил, что она записана без элемента «FormulaVersion:=xlReplaceFormula2». Итак, я удалил ее из своего макроса. Теперь оба компьютера работают нормально.