Расширьте текущий диапазон, чтобы включить несколько не соприкасающихся столбцов

#arrays #regex #excel #vba #loops

#массивы #регулярное выражение #excel #vba #циклы

Вопрос:

Как мне динамически расширять текущий диапазон, чтобы включить несколько не соприкасающихся столбцов?

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

 Sub Convert Dates()

Dim Answer As String
Dim Cell As Range
Dim Last Row As Long

Answer = MsgBox("Are you sure you want to run the macro",vbYesno,"Run the Program".)

If Answer = vbYes Then

    lastRow = Range ("Q" amp; Rows.Count).End(xlUp).Row

    For Each cell In Range ("Q2:@" amp; lastRow)

        If Instr(cell.value, ".") <> 0 Then
            Cell.value = RegexReplace(cell.Value, _
              "(d{2}).(d{2}).(d{4})", "$3-$2-$1")
        End  if 

        If Instr (cell.value, "/") <> 0 Then
            cell.Value = RegexRepalce(Cell.Value,_
              "(d{2})/(d{2})/(d{4})". "$3-$1=$2")
        End if  

        cell.NumberFormat = "yyyy-mm-d;@"

    Next
End if
End Sub

Function RegexReplace(ByVal text As String, _ 
                ByVal replace_what As String, _ 
                ByVal replace_with As String) As String
    Dim RE As Object 
    Set RE = CreateObject("vbscript.regexp") 
    RE.Pattern = replace_what 
    RE.Global = True 
    RegexReplace = RE.Replace(text, replace_with)  
End Function 
  

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

1. Функция RegexReplace(ввод текста в виде строки, _ ByVal replace_what в виде строки, _ ByVal replace_with в виде строки) Как строка Dim RE Как набор объектов RE = CreateObject(«vbscript.regexp») RE.Pattern = replace_what RE.Global = True RegexReplace = RE.Replace(текст, replace_with) Конечная функция

2. Пожалуйста, не добавляйте код в комментарии. Отредактируйте свой исходный пост, чтобы включить его.

3. Если ваши ячейки являются датами, зачем вам использовать код для их переформатирования? Просто измените формат ячеек, чтобы отобразить их так, как вы хотели бы, чтобы они отображались.

4. Что касается повторного использования вашего вопроса Union , просто замените ваш Range (я предполагаю, что вы говорите о бите, в котором говорится Range ("Q2:@" amp; lastRow) , хотя я надеюсь, что @ это опечатка) на ваш union, т. Е. Union(first range, second range) (так что, возможно Union(Range("Q2:Q" amp; lastRow), Range("X2:X" amp; lastRow)) ). Но я не знаю, какое отношение имеет использование объединения, например, двух фиксированных столбцов, к «динамическому расширению диапазона текущего диапазона для включения нескольких (не соприкасающихся столбцов)». Вам нужно предоставить больше информации в вашем вопросе, прежде чем мы сможем помочь вам с этой «динамической» частью.

5. Просто взгляните на ваш код — действительно ли он выполняется для одного диапазона? На самом деле, это вообще компилируется ? например, пробел в середине имени переменной в Dim Last Row As Long , RegexReplace v RegexRepalce , посторонний период в "Run the Program". , «@» в Range ("Q2:@" amp; lastRow) , точка вместо запятой в "(d{2})/(d{2})/(d{4})". "$3-$1=$2" (и должно ли «=» быть «-«?)

Ответ №1:

Да, это хороший сложный способ сделать это. или вы могли бы просто

Диапазон (Range(«A1»), ActiveCell.SpecialCells(XLASTCELL)).адрес