Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2009, 00:44   #1
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию Замена всех запятых, находящихся не в скобках

Как заменить в строке все запятые на точку с запятой, если запятая находится не внутри скобок () или []?
motorway вне форума Ответить с цитированием
Старый 14.07.2009, 06:55   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Можно, например, с помощью макроса. Выделить диапазон и выполнить макрос:
Код:
Sub Замена()
    Dim Cell As Range, a: Application.ScreenUpdating = False
    For Each Cell In Selection
        If Cell Like "*(*)*" Then
            a = Split(Replace(Replace(Cell, "(", "!!!"), ")", "!!!"), "!!!")
            Cell = Replace(a(0), ",", ";") & "(" & a(1) & ")" & Replace(a(2), ",", ";")
        End If
        If InStr(1, Cell, "[") < InStr(1, Cell, "]") Then
            a = Split(Replace(Replace(Cell, "[", "!!!"), "]", "!!!"), "!!!")
            Cell = Replace(a(0), ",", ";") & "[" & a(1) & "]" & Replace(a(2), ",", ";")
        End If
    Next
End Sub
P.S. Макрос будет корректно работать только в случае, если в ячейке либо отсутствуют скобки, либо парные скобки встречаются 1 раз. Для проверки, парные скобки или нет, а также для замены символов в случае многократного вхождения парных скобок, макрос будет сложнее. Это нужно?
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 14.07.2009 в 07:36.
SAS888 вне форума Ответить с цитированием
Старый 14.07.2009, 15:31   #3
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Мне нужно, чтобы запятые вне скобок заменялись на ; при любом количестве скобок
motorway вне форума Ответить с цитированием
Старый 14.07.2009, 15:47   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

К примеру, возьмём строку (((((((;);)););););(;(;;())))
Что должно получиться в итоге?

PS: Опять Вы ерунду какую-то придумываете
Проще преобразовать формулу к англоязычному виду - и замена будет произведена автоматически...

Код:
  Ячейка: A1      Формула  (стиль A1):   =СУММ(B5;E2;F3;F6:F8;H3:H5)+СУММ(C3*D8;I3:I5)
                  Формула  (стиль R1C1): =СУММ(R[4]C[1];R[1]C[4];R[2]C[5];R[5]C[5]:R[7]C[5];R[2]C[7]:R[4]C[7])
+СУММ(R[2]C[2]*R[7]C[3];R[2]C[8]:R[4]C[8])

    Cell: A1      Formula  (style A1):   =SUM(B5,E2,F3,F6:F8,H3:H5)+SUM(C3*D8,I3:I5)
                  Formula  (style R1C1): =SUM(R[4]C[1],R[1]C[4],R[2]C[5],R[5]C[5]:R[7]C[5],R[2]C[7]:R[4]C[7])
+SUM(R[2]C[2]*R[7]C[3],R[2]C[8]:R[4]C[8])
EducatedFool вне форума Ответить с цитированием
Старый 14.07.2009, 16:01   #5
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Если последовательно удалять скобки с их содержимым из Вашего примера (что означает, то что заменять не надо), останется ( ; ). Далее, если эти последние скобки относятся к скобкам функции, то все остается так же. А если сначала их не рассматривать, то осталась бы просто точка с запятой. Но я говорил про замену запятых, а не точки с запятой, так что если точки с запятой есть с самого начала, заменять ничего не надо.
Причина этой "ерунды" в том, что мне в переменную нужно записать значение формулы в ячейке, напр. Ф(1; 2; 3+5*max(2,3*A1)).
А в переменной точки с запятой пропадают, и оказываются только запятые Ф(1, 2, 3+5*max(2,3*A1)).. Так вот, чтобы понять, какая запятая раньше была точкой с запятой, я анализирую, не находится ли она в скобках, как напр. у функции максимума. Если нет, значит это разделитель, и мы его восстанавливаем до точки с запятой.


Всего этого можно не делать, если Вы подскажете, как избежать пропадания точки с запятой при получении в строку значения Cell.Formula

Последний раз редактировалось motorway; 14.07.2009 в 16:05.
motorway вне форума Ответить с цитированием
Старый 14.07.2009, 16:18   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Используйте FormulaLocal вместо Formula
Код:
Sub test()
    [a1].Formula = "=SUM(B5,E2,F3,F6:F8,H3:H5)+SUM(C3*D8,I3:I5)"
    переменная = Range("a1").FormulaLocal
    ' или так: переменная = Range("a1").FormulaR1C1Local
    MsgBox переменная
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 14.07.2009, 16:23   #7
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Спасибо. Теперь нормально, но десятичные разделители у чисел (напр. 3.5) стали теперь запятыми (3,5), чего не хотелось бы. Должно оставаться точкой, но вводить ее Эксел не позволяет. То есть когда мы вводили 3,5, получали в Formula 3.5, что и было нужно. А теперь остается 3,5
motorway вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
процедура вывода и нахождения массивов, находящихся в типизированном файле квак Помощь студентам 1 28.04.2009 15:08
ЗАМЕНА ing60 Microsoft Office Excel 3 22.04.2009 12:41
Замена кода программы с Delhi5 на Delhi7 либо замена базы данных с Acessa на MySQL DorianLeroy Фриланс 8 18.02.2009 18:52
Замена Патрон Общие вопросы Delphi 6 05.11.2008 15:45
Замена Dr.Badnezz Общие вопросы Delphi 11 23.09.2008 17:17