думается мне, что без открывания каждого файла в Excel'е будет как-то побыстрее. для работы кода нужна библиотека DSOFile
[vba]
Код
Sub sdf() Dim strFolder$ r: With Application.FileDialog(msoFileDialogFolderPicker) If .Show Then strFolder$ = .SelectedItems(1) ElseIf MsgBox("Ничего не выбрано. Повторить?", 36, "Ну так как?") = 6 Then GoTo r Else: Exit Sub End If End With Dim strFile$ With CreateObject("DSOFile.OleDocumentProperties") strFile = Dir$(strFolder & "\*.xls*") Do While Len(strFile) .Open strFolder & "\" & strFile, , 2 With .SummaryProperties .Author = "Новый автор" .lastsavedby = "Новый автор" End With .Save: .Close strFile = Dir$ Loop End With End Sub
[/vba]
[p.s.]дата изменения фалов при работе макроса будет заменяться на текущую системную, если она должна оставаться без изменений, то нужно будет потанцевать с бубном (WINAPI)
думается мне, что без открывания каждого файла в Excel'е будет как-то побыстрее. для работы кода нужна библиотека DSOFile
[vba]
Код
Sub sdf() Dim strFolder$ r: With Application.FileDialog(msoFileDialogFolderPicker) If .Show Then strFolder$ = .SelectedItems(1) ElseIf MsgBox("Ничего не выбрано. Повторить?", 36, "Ну так как?") = 6 Then GoTo r Else: Exit Sub End If End With Dim strFile$ With CreateObject("DSOFile.OleDocumentProperties") strFile = Dir$(strFolder & "\*.xls*") Do While Len(strFile) .Open strFolder & "\" & strFile, , 2 With .SummaryProperties .Author = "Новый автор" .lastsavedby = "Новый автор" End With .Save: .Close strFile = Dir$ Loop End With End Sub
[/vba]
[p.s.]дата изменения фалов при работе макроса будет заменяться на текущую системную, если она должна оставаться без изменений, то нужно будет потанцевать с бубном (WINAPI)krosav4ig
Private Sub cmbFunc_AfterUpdate() g_Func = Trim(cmbFunc) End Sub Private Sub cmbFunc_Change() g_Func = Trim(cmbFunc) End Sub
Private Sub cmbGRNDate1_AfterUpdate() cmbGRNDate1.Value = form_date(cmbGRNDate1.Value) g_GRNDate1 = Trim(cmbGRNDate1.Value) End Sub
Private Sub cmbGRNDate2_AfterUpdate() cmbGRNDate2.Value = form_date(cmbGRNDate2.Value) g_GRNDate2 = Trim(cmbGRNDate2.Value) End Sub
Private Sub cmbManfac_AfterUpdate() g_Manfac = Trim(cmbManfac) End Sub
Private Sub txtDateFrom_AfterUpdate() txtDateFrom.Value = form_date(txtDateFrom.Value) g_DateFrom = form_date(txtDateFrom.Value) End Sub
Private Sub txtDateTo_AfterUpdate() txtDateTo.Value = form_date(txtDateTo.Value) g_DateTo = form_date(txtDateTo.Value) End Sub
Private Sub cmbCancel_Click() g_Cancel = True Unload Me End Sub
Private Sub cmbOk_Click() Save_params Unload Me End Sub
Private Sub cmbTabN_AfterUpdate() g_TabN = cmbTabN.Value End Sub
Public Sub UserForm_Activate() If cmbManfac.ListCount <= 0 Then If Not rs Is Nothing Then If rs.State Then rs.Close cmbManfac.AddItem "*" StrSql = " SELECT DISTINCT usotr.usotr_manfac " & _ " FROM zeie:maxmast.usotr usotr" Set rs = dbdll.rec(client, Forward, StrSql) With cmbManfac .List = Application.Transpose(rs.GetRows) .AddItem "*", 0 .Value = g_Manfac End With End If '------------- cmbFunc.List = Array("*", "pu10", "pu10", "pu10", "pu12", "nv00", "oe", "nv17", "nv13", _ "nv17", "pv12", "nv15", "oe", "nv00", "nv10", "pv12", "nv12", 0) '------------ g_Func = cmbFunc.Value End Sub Private Sub cmbTabN_Change() FilterFio Array(array("usotr_manfac", g_Manfac)) Application.SendKeys "{right}" End Sub Private Sub cmbTabN_Change() Application.SendKeys "{right}" End Sub Private Sub FilterFio(criteria As Variant) StrSql = " SELECT distinct usotr.usotr_manfac,usotr.usotr_tabnum, " & _ "trim(" & IIf(criteria(1) = "*", "usotr.usotr_manfac&' - '&", "") & _ "usotr.usotr_tabnum&' - '&usotr.usotr_fio) as F1" & _ " FROM zeie:maxmast.usotr usotr order by usotr.usotr_manfac,usotr.usotr_tabnum" Set rs = dbdll.rec(client, Forward, StrSql) rs.Filter = IIf(criteria(1) = "*", 0, criteria(0) & " like '" & criteria(1) & "'") With cmbTabN .List = Application.Transpose(rs.GetRows(-1, 0, 2)) .AddItem "*", 0 .Listindex = 0 End With rs.Close End Sub
[/vba][sub] upd. Исправил небольшую ошибку
ds102061, пробуйте так
[vba]
Код
Dim StrSql As String Dim rs As ADODB.Recordset
Private Sub cmbFunc_AfterUpdate() g_Func = Trim(cmbFunc) End Sub Private Sub cmbFunc_Change() g_Func = Trim(cmbFunc) End Sub
Private Sub cmbGRNDate1_AfterUpdate() cmbGRNDate1.Value = form_date(cmbGRNDate1.Value) g_GRNDate1 = Trim(cmbGRNDate1.Value) End Sub
Private Sub cmbGRNDate2_AfterUpdate() cmbGRNDate2.Value = form_date(cmbGRNDate2.Value) g_GRNDate2 = Trim(cmbGRNDate2.Value) End Sub
Private Sub cmbManfac_AfterUpdate() g_Manfac = Trim(cmbManfac) End Sub
Private Sub txtDateFrom_AfterUpdate() txtDateFrom.Value = form_date(txtDateFrom.Value) g_DateFrom = form_date(txtDateFrom.Value) End Sub
Private Sub txtDateTo_AfterUpdate() txtDateTo.Value = form_date(txtDateTo.Value) g_DateTo = form_date(txtDateTo.Value) End Sub
Private Sub cmbCancel_Click() g_Cancel = True Unload Me End Sub
Private Sub cmbOk_Click() Save_params Unload Me End Sub
Private Sub cmbTabN_AfterUpdate() g_TabN = cmbTabN.Value End Sub
Public Sub UserForm_Activate() If cmbManfac.ListCount <= 0 Then If Not rs Is Nothing Then If rs.State Then rs.Close cmbManfac.AddItem "*" StrSql = " SELECT DISTINCT usotr.usotr_manfac " & _ " FROM zeie:maxmast.usotr usotr" Set rs = dbdll.rec(client, Forward, StrSql) With cmbManfac .List = Application.Transpose(rs.GetRows) .AddItem "*", 0 .Value = g_Manfac End With End If '------------- cmbFunc.List = Array("*", "pu10", "pu10", "pu10", "pu12", "nv00", "oe", "nv17", "nv13", _ "nv17", "pv12", "nv15", "oe", "nv00", "nv10", "pv12", "nv12", 0) '------------ g_Func = cmbFunc.Value End Sub Private Sub cmbTabN_Change() FilterFio Array(array("usotr_manfac", g_Manfac)) Application.SendKeys "{right}" End Sub Private Sub cmbTabN_Change() Application.SendKeys "{right}" End Sub Private Sub FilterFio(criteria As Variant) StrSql = " SELECT distinct usotr.usotr_manfac,usotr.usotr_tabnum, " & _ "trim(" & IIf(criteria(1) = "*", "usotr.usotr_manfac&' - '&", "") & _ "usotr.usotr_tabnum&' - '&usotr.usotr_fio) as F1" & _ " FROM zeie:maxmast.usotr usotr order by usotr.usotr_manfac,usotr.usotr_tabnum" Set rs = dbdll.rec(client, Forward, StrSql) rs.Filter = IIf(criteria(1) = "*", 0, criteria(0) & " like '" & criteria(1) & "'") With cmbTabN .List = Application.Transpose(rs.GetRows(-1, 0, 2)) .AddItem "*", 0 .Listindex = 0 End With rs.Close 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
вариант с расширенным фильтром, таблица на листе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
Rioran, привет. По поводу отсутствия sleep я, конечно, погорячился, ибо даже задержка в 1 мс в этом коде сводит загрузку цп (процессом excel) чуть ли не к 0, и sleep не помешает в обоих циклах. А тут
я имел в виду вложенный цикл с ожиданием отжатия кнопки.
Rioran, привет. По поводу отсутствия sleep я, конечно, погорячился, ибо даже задержка в 1 мс в этом коде сводит загрузку цп (процессом excel) чуть ли не к 0, и sleep не помешает в обоих циклах. А тут
это все потому, что я страшный лентяй и не люблю объявлять константы, если они используются в коде один раз И все, что я могу добавить к исчерпывающему ответу 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
как вариант Выделяем строки 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
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