#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
vRegexRepalce
, посторонний период в"Run the Program".
, «@» вRange ("Q2:@" amp; lastRow)
, точка вместо запятой в"(d{2})/(d{2})/(d{4})". "$3-$1=$2"
(и должно ли «=» быть «-«?)
Ответ №1:
Да, это хороший сложный способ сделать это. или вы могли бы просто
Диапазон (Range(«A1»), ActiveCell.SpecialCells(XLASTCELL)).адрес