как вариант, макрофункция для работы нужно создать именованные диапазоны нужно выделить листы с пунктами, выделил ячейку A1, нажать Ctrl+Shift+F3 (Формулы->Определенные имена->Создать из выделенного), нажать ОК (галочка должна быть на "в столбце слева") сам код макрофункции находится на скрытом листе Макрос1
как вариант, макрофункция для работы нужно создать именованные диапазоны нужно выделить листы с пунктами, выделил ячейку A1, нажать Ctrl+Shift+F3 (Формулы->Определенные имена->Создать из выделенного), нажать ОК (галочка должна быть на "в столбце слева") сам код макрофункции находится на скрытом листе Макрос1krosav4ig
Function Phone(str$) With CreateObject("VBScript.RegExp") .Pattern = "(((\+7|8)(|-| )?)?((\(|-| )?\d{3}(\)|-| )?){2})?((-| )?\d{2}){2,3}" Phone = IIf(.Test(str), Trim(.Execute(str)(0)), "") End With End Function
[/vba]
еще вариант с UDF [vba]
Код
Function Phone(str$) With CreateObject("VBScript.RegExp") .Pattern = "(((\+7|8)(|-| )?)?((\(|-| )?\d{3}(\)|-| )?){2})?((-| )?\d{2}){2,3}" Phone = IIf(.Test(str), Trim(.Execute(str)(0)), "") End With End Function
Sub F() With Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row) .NumberFormat = "general" .Replace " ", Empty, xlPart .Replace "*-", Empty, xlPart .Formula = .Value End With End Sub
[/vba] [p.s.]просто предположил, писал с телефона, проверить работу возможности нет. Если что, сильно не ругайте ^_^[/p.s.]
upd. дополз до компа, проверил, исправил
upd. для файла из 13 поста [vba]
Код
Sub upd() Dim arr() As Variant With Range("C3:C" & Cells(Rows.Count, "C").End(xlUp).Row) arr = .Value With Intersect(.EntireRow, [I:I]) .NumberFormat = "general" .Formula = arr .Replace " ", Empty, xlPart .Replace "*-", Empty, xlPart End With End With End Sub
[/vba]
А может так можно?[vba]
Код
Sub F() With Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row) .NumberFormat = "general" .Replace " ", Empty, xlPart .Replace "*-", Empty, xlPart .Formula = .Value End With End Sub
[/vba] [p.s.]просто предположил, писал с телефона, проверить работу возможности нет. Если что, сильно не ругайте ^_^[/p.s.]
upd. дополз до компа, проверил, исправил
upd. для файла из 13 поста [vba]
Код
Sub upd() Dim arr() As Variant With Range("C3:C" & Cells(Rows.Count, "C").End(xlUp).Row) arr = .Value With Intersect(.EntireRow, [I:I]) .NumberFormat = "general" .Formula = arr .Replace " ", Empty, xlPart .Replace "*-", Empty, xlPart End With End With End Sub
как вариант Выделяем строки 2:20 Жмем комбинации (буквы руские, раскладка должна быть русской, 0 - цифра) F5>ALT+ВК>Enter>Ctrl+0>Ctrl+Shift+пробел>F5>Alt+ВЫ>Ctrl+->Enter>Shift+пробел>Ctrl+Sift+0>Home
как вариант Выделяем строки 2:20 Жмем комбинации (буквы руские, раскладка должна быть русской, 0 - цифра) F5>ALT+ВК>Enter>Ctrl+0>Ctrl+Shift+пробел>F5>Alt+ВЫ>Ctrl+->Enter>Shift+пробел>Ctrl+Sift+0>Homekrosav4ig
это все потому, что я страшный лентяй и не люблю объявлять константы, если они используются в коде один раз И все, что я могу добавить к исчерпывающему ответу AndreTM, это то, что если бы все-таки можно было 100% ориентироваться на младший бит, то можно было бы избавиться от вложенного цикла если отслеживать "псевдо-отжатие" [vba]
Код
Private Type POINTAPI x As Long y As Long End Type Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Const KEY_PRESSED = &H8000 Private Const KEY_RELEASED = &H1 Private Const VK_LButton = &H1
Sub clickpos() Dim i%, curpos As POINTAPI GetAsyncKeyState VK_LButton Do If (GetAsyncKeyState(VK_LButton) And KEY_RELEASED) Then GetCursorPos curpos [A1].Offset(i) = curpos.x [A1].Offset(i, 1) = curpos.y i = i + 1 End If Sleep 30 DoEvents Loop Until i = 3 End Sub
это все потому, что я страшный лентяй и не люблю объявлять константы, если они используются в коде один раз И все, что я могу добавить к исчерпывающему ответу AndreTM, это то, что если бы все-таки можно было 100% ориентироваться на младший бит, то можно было бы избавиться от вложенного цикла если отслеживать "псевдо-отжатие" [vba]
Код
Private Type POINTAPI x As Long y As Long End Type Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Const KEY_PRESSED = &H8000 Private Const KEY_RELEASED = &H1 Private Const VK_LButton = &H1
Sub clickpos() Dim i%, curpos As POINTAPI GetAsyncKeyState VK_LButton Do If (GetAsyncKeyState(VK_LButton) And KEY_RELEASED) Then GetCursorPos curpos [A1].Offset(i) = curpos.x [A1].Offset(i, 1) = curpos.y i = i + 1 End If Sleep 30 DoEvents Loop Until i = 3 End Sub
Rioran, привет. По поводу отсутствия sleep я, конечно, погорячился, ибо даже задержка в 1 мс в этом коде сводит загрузку цп (процессом excel) чуть ли не к 0, и sleep не помешает в обоих циклах. А тут
я имел в виду вложенный цикл с ожиданием отжатия кнопки.
Rioran, привет. По поводу отсутствия sleep я, конечно, погорячился, ибо даже задержка в 1 мс в этом коде сводит загрузку цп (процессом excel) чуть ли не к 0, и sleep не помешает в обоих циклах. А тут
вариант с расширенным фильтром, таблица на листе1 фильтруется по всем значениям введенным на листе2 [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) With [criteria[#All]] If Not Intersect(Target, .Resize(.Rows.Count + 1)) Is Nothing Then _ [Таблица2[#All]].AdvancedFilter 1, .Rows(1).Resize(Application.CountA(.Columns(1))), 0 End With End Sub
[/vba]
вариант с расширенным фильтром, таблица на листе1 фильтруется по всем значениям введенным на листе2 [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) With [criteria[#All]] If Not Intersect(Target, .Resize(.Rows.Count + 1)) Is Nothing Then _ [Таблица2[#All]].AdvancedFilter 1, .Rows(1).Resize(Application.CountA(.Columns(1))), 0 End With End Sub
Sub Insert_Rows2() Dim lLastRow As Long, li As Long, i As Range ' переменные Application.ScreenUpdating = 0 'заморозим экран от изменений lLastRow = Cells(Rows.Count, 1).End(xlUp).Row 'переменной присваивается последняя строка For li = lLastRow To 3 Step -1 'ПЕРЕБИРАЕМ С последней до первой строки с шагом -1 With ActiveSheet.UsedRange.Rows(li).Resize(2) .Insert 'добавляем 2 строки до нужной нам With .Offset(-2) .Value = .Offset(2).Resize(1).Value .Columns(6) = 0: Intersect(.Cells, [H:H,J:L]) = Empty .Cells(1, 1) = .Cells(1, 1) - 10: .Cells(2, 1) = .Cells(1, 1) + 5 .Columns(2) = Application.Substitute(.Columns(2), "св", Application.Transpose(Array("мз", "об"))) End With End With ' если заменить Resize(2) на Resize(1) то будет вставляться только одна строка Next li Application.ScreenUpdating = 1 'разморозили экран и он обновился End Sub
[/vba]
blackeangel, так нужно? [vba]
Код
Sub Insert_Rows2() Dim lLastRow As Long, li As Long, i As Range ' переменные Application.ScreenUpdating = 0 'заморозим экран от изменений lLastRow = Cells(Rows.Count, 1).End(xlUp).Row 'переменной присваивается последняя строка For li = lLastRow To 3 Step -1 'ПЕРЕБИРАЕМ С последней до первой строки с шагом -1 With ActiveSheet.UsedRange.Rows(li).Resize(2) .Insert 'добавляем 2 строки до нужной нам With .Offset(-2) .Value = .Offset(2).Resize(1).Value .Columns(6) = 0: Intersect(.Cells, [H:H,J:L]) = Empty .Cells(1, 1) = .Cells(1, 1) - 10: .Cells(2, 1) = .Cells(1, 1) + 5 .Columns(2) = Application.Substitute(.Columns(2), "св", Application.Transpose(Array("мз", "об"))) End With End With ' если заменить Resize(2) на Resize(1) то будет вставляться только одна строка Next li Application.ScreenUpdating = 1 'разморозили экран и он обновился End Sub