Страницы: 1 2 След.
RSS
Regex.replace, Помощь с макросом замены
 
Подскажите пожалуйста, мне нужен модуль для замены символов в выбранном диапазоне, я сделал функцию и макрос, но не могу их сохранить в одном модуле и оно почему-то не работаеть((((
Код
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(ячейка) - все работает, а вот в макросе даты не преобразуются
 
Код
C.Value = RgxDate(C)
у Вас в функции аргумент объявлен как Range - его и передавайте в процедуре, а не значение ячейки.
Или измените в функции тип аргумента:
Код
Public Function RgxDate(astring As String) As String
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
А можете показать?
 
И такой вариант, чтобы не устанавливать ссылку:
Код
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
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Все выполняется, но не делает того, что нужно(((((
Код
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
 
Код
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
 
Если в тех же полях, то замените в коде на
Код
C.NumberFormat = "@"
C = temp
 
А вот это пробовал, не работает
 
Замените формат ячейки до передачи аргумента в функцию и сработает.
KL
 
Ага, сработало, получились просто 5 значные цифры вместо дат((((
 
Код
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
Спасибо, все работает
 
Как вариант: выделяете диапазон, Меню - Формат ячеек - Все Форматы и вводите формат ДД-ММ-ГГГГ
 
Код
RgxDate = re.Replace(astring, "$1_$2_$3")

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