Страницы: 1 2 След.
RSS
Regex.replace, Помощь с макросом замены
 
Подскажите пожалуйста, мне нужен модуль для замены символов в выбранном диапазоне, я сделал функцию и макрос, но не могу их сохранить в одном модуле и оно почему-то не работаеть((((
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Function RgxDate(astring As Range) As String
 Dim re As RegExp
 Dim tempString
 Set re = New RegExp
 re.Global = True
 re.IgnoreCase = True
 re.Pattern = "(\d{2}).(\d{2}).(\d{4})"
 RgxDate = re.Replace(astring, "$1-$2-$3")
End Function
 
Public Sub CheckDate()
Dim MyRange As Range
On Error Resume Next
Set MyRange = Application.InputBox(Prompt:="Выберите диапазон", Type:=8)
    If MyRange Is Nothing Then
        MsgBox "Диапазон не выбран"
    End If
For Each C In MyRange
      C.Value = RgxDate(C.Value)
Next C
End Sub
 
Цитата
VadimP написал: но не могу их сохранить в одном модуле
Сохранил без проблем
Цитата
VadimP написал: и оно почему-то не работаеть
передавайте аргумент по ссылке
Public Function RgxDate(ByRef astring As Range) As String
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал: передавайте аргумент по ссылке
Они и так по ссылке передаются.
There is no knowledge that is not power
 
Цитата
VadimP написал: но не могу их сохранить в одном модуле и оно почему-то не работаеть((((
Что значит - не можете сохранить?
There is no knowledge that is not power
 
Цитата
VadimP написал: я сделал функцию и макрос
Точно сами сделали? Скорее всего вам не хватает ссылки на библиотеку Microsoft VBScript Regular Expressions 5.5 ;)
KL
 
Сохранил в разных модулях
Я выбираю диапазон и даты не преобразуются с 09.12.1987 на 09-12-1987 ((((
Изменено: VadimP - 08.01.2016 20:13:00
 
Библиотека включена, если я использую функцию как функцию =RegexDate(ячейка) - все работает, а вот в макросе даты не преобразуются
 
Код
1
C.Value = RgxDate(C)
у Вас в функции аргумент объявлен как Range - его и передавайте в процедуре, а не значение ячейки.
Или измените в функции тип аргумента:
Код
1
Public Function RgxDate(astring As String) As String
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
А можете показать?
 
И такой вариант, чтобы не устанавливать ссылку:
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Function RgxDate(astring As Range) As String
    Dim tempString
    Dim RegExp As Object
    Set RegExp = CreateObject("vbscript.regexp")
    With RegExp
        .Global = True
        .IgnoreCase = True
        .Pattern = "(\d{2}).(\d{2}).(\d{4})"
        RgxDate = .Replace(astring, "$1-$2-$3")
    End With
End Function
 
Public Sub CheckDate()
    Dim MyRange As Range
    On Error Resume Next
    Set MyRange = Application.InputBox(Prompt:="Выберите диапазон", Type:=8)
    If MyRange Is Nothing Then
        MsgBox "Диапазон не выбран"
    End If
    For Each C In MyRange
        C.Value = RgxDate(C)
    Next C
End Sub
KL
 
Цитата
KL написал:
И такой вариант, чтобы не устанавливать ссылку:
Код?1234567891011121314151617181920212223Public Function RgxDate(astring As Range) As String    Dim tempString    Dim RegExp As Object    Set RegExp = CreateObject("vbscript.regexp")    With RegExp        .Global = True        .IgnoreCase = True        .Pattern = "(\d{2}).(\d{2}).(\d{4})"        RgxDate = .Replace(astring, "$1-$2-$3")    End WithEnd Function Public Sub CheckDate()    Dim MyRange As Range    On Error Resume Next    Set MyRange = Application.InputBox(Prompt:="Выберите диапазон", Type:=8)    If MyRange Is Nothing Then        MsgBox "Диапазон не выбран"    End If    For Each C In MyRange        C.Value = RgxDate©    Next CEnd Sub
При таком варианте ругается на ByRef

При таком варианте "цитирования" - ругаются модераторы! (См правила форума)
 
Цитата
VadimP написал:
ругается на ByRef
добавьте в начало процедуры объявление:
Dim C as Range
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Все выполняется, но не делает того, что нужно(((((
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Function RgxDate(astring As Range) As String
    Dim tempString
    Dim RegExp As Object
    Set RegExp = CreateObject("vbscript.regexp")
    With RegExp
        .Global = True
        .IgnoreCase = True
        .Pattern = "(\d{2}).(\d{2}).(\d{4})"
        RgxDate = .Replace(astring, "$1-$2-$3")
    End With
End Function
  
Public Sub CheckDate()
    Dim MyRange As Range
    Dim C As Range
    On Error Resume Next
    Set MyRange = Application.InputBox(Prompt:="Âûáåðèòå äèàïàçîí", Type:=8)
    If MyRange Is Nothing Then
        MsgBox "Äèàïàçîí íå âûáðàí"
    End If
    For Each C In MyRange
        C.Value = RgxDate(C)
    Next C
End Sub
 
Цитата
VadimP написал: но не делает того, что нужно
Есть подозрение, что в ячейках даты. А для Excel они числа(вида 42075). поэтому Вам возвращаются именно они. Угадал? Если нет, тогда потрудитесь пояснить что функция делает и что должна делать. Ведь предложенный код не отличается в результате от той, что выложена Вами в первом сообщении.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Боюсь, файл заколдованный. Скопировал мой код в новый файл - и нет проблем. Там правда кириллица в сообщениях потерялась :)
KL
 
Вот файл, у меня есть в ячейках даты типа dd.mm.yyyy, мне нужно их через regex поменять на dd-mm-yy
KL - функция работает, да. Но фишка в том что я хочу макросом прям в тех же полях изменить даты
Изменено: VadimP - 08.01.2016 20:48:02
 
Именно в оригинальном файле-примере не работает присвоение значения ячейкам c. Функция возвращает правильный результат. :)
KL
 
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Function RgxDate(astring As Range) As String
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.IgnoreCase = True
re.Pattern = "(\d{2}).(\d{2}).(\d{4})"
RgxDate = re.Replace(astring, "$1-$2-$3")
End Function
 
Public Sub CheckDate()
Dim C As Range
Dim temp As String
Dim MyRange As Range
On Error Resume Next
Set MyRange = Application.InputBox(Prompt:="Выберите диапазон", Type:=8)
If MyRange Is Nothing Then
MsgBox "Диапазон не выбран"
End If
For Each C In MyRange
temp = RgxDate(C)
Cells(C.Row, 2).NumberFormat = "@"
Cells(C.Row, 2) = temp
Next C
End Sub
 
Народ, независимо от формата данных, если функция возвращает правильный стринг, а она таки его возвращает даже в оригинале, то не может быть, чтобы строка c.Value="мойстринг" не срабатывала. По-моему, дело в испорченном файле, а не в коде, хотя код и можно полировать :)
Изменено: KL - 08.01.2016 21:02:28
KL
 
Круто, вот это работает, только мне нужно в тех же полях все заменять((((
 
Цитата
VadimP написал: фишка в том что я хочу макросом прям в тех же полях изменить даты
Вадим, в моем файле макрос запускали на столбце A?
KL
 
Да, работает но не во всех ячейках, ток в последних
С 1 по 10 строку не сработало, с 11 по 16 сработало
Изменено: VadimP - 09.01.2016 01:12:45
 
Если в тех же полях, то замените в коде на
Код
1
2
C.NumberFormat = "@"
C = temp
 
А вот это пробовал, не работает
 
Замените формат ячейки до передачи аргумента в функцию и сработает.
KL
 
Ага, сработало, получились просто 5 значные цифры вместо дат((((
 
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
  re.Global = True
  re.IgnoreCase = True
  re.Pattern = "(\d{1,2}).(\d{1,2}).(\d{4})"
RgxDate = re.Replace(astring, "$1-$2-$3")
End Function
 
Public Sub CheckDate()
Dim C As Range
Dim temp As String
Dim MyRange As Range
On Error Resume Next
Set MyRange = Application.InputBox(Prompt:="Выберите диапазон", Type:=8)
If MyRange Is Nothing Then
   MsgBox "Диапазон не выбран"
End If
For Each C In MyRange
  temp = RgxDate(C)
  C.NumberFormat = "@"
  C = temp
Next C
End Sub
 
Kuzmich
Спасибо, все работает
 
Как вариант: выделяете диапазон, Меню - Формат ячеек - Все Форматы и вводите формат ДД-ММ-ГГГГ
 
Код
1
RgxDate = re.Replace(astring, "$1_$2_$3")

И не будет Excel умничать.
Страницы: 1 2 След.
Читают тему
Loading...