ИМХО, вопрос по части vba. worksheet_change вам в помощь. вот примерный код если ячейка для ввода A1 и диапазон для накапливания значений и времени B:C
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim n As Integer n = Application.CountA([B:B]) + 1 If Not Intersect(Target, [A1]) Is Nothing And Not (IsEmpty(Target)) Then Target.Copy [B:C].Cells(n, 1) [B:C].Cells(n, 2) = Now() End If End Sub
[/vba]
ИМХО, вопрос по части vba. worksheet_change вам в помощь. вот примерный код если ячейка для ввода A1 и диапазон для накапливания значений и времени B:C
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim n As Integer n = Application.CountA([B:B]) + 1 If Not Intersect(Target, [A1]) Is Nothing And Not (IsEmpty(Target)) Then Target.Copy [B:C].Cells(n, 1) [B:C].Cells(n, 2) = Now() End If End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim n As Integer n = Application.CountA([C:C]) + 1 If Not Intersect(Target, [A1]) Is Nothing And _ Not (IsEmpty(Target)) And Target = [B1] Then Target.Copy [C:C].Cells(n, 1) End If End Sub
[/vba]
попробуйте перед строкой [vba]
Код
Target.Copy [B:C].Cells(n, 1)
[/vba] добавить строку [vba]
Код
Application.ScreenUpdating = 0
[/vba] если сравнивать с B1 то код вот такой
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim n As Integer n = Application.CountA([C:C]) + 1 If Not Intersect(Target, [A1]) Is Nothing And _ Not (IsEmpty(Target)) And Target = [B1] Then Target.Copy [C:C].Cells(n, 1) End If End Sub
это все потому, что проверка стоит снаружи цикла. Перенесите ее вовнутрь и будет все ок [vba]
Код
With Worksheets("Лист4").Range("H6:H" & j, "S6:S" & j) 'ищем в этих диапозонах Set result = .Find(What:=Worksheets("Лист3").Range("d2").Offset(r, 0).Value, LookIn:=xlValues) 'это хочу найти If Not result Is Nothing Then firstAddress = result.Address 'запоминаем адрес первой найденной ячейки Do If Worksheets("Лист3").Range("c2").Offset(r, 0).Value = result.Offset(0, 22).Value Then 'сравнение 'Обрабатываем найденную ячейку Worksheets("Лист3").Range("g2").Offset(r, 0).Value = result.Offset(0, -6).Value 'client End If Set result = .FindNext(result) 'ищем следующую Loop While Not result Is Nothing And result.Address <> firstAddress 'выход из цикла при переходе снова на первую End If End With
[/vba]
это все потому, что проверка стоит снаружи цикла. Перенесите ее вовнутрь и будет все ок [vba]
Код
With Worksheets("Лист4").Range("H6:H" & j, "S6:S" & j) 'ищем в этих диапозонах Set result = .Find(What:=Worksheets("Лист3").Range("d2").Offset(r, 0).Value, LookIn:=xlValues) 'это хочу найти If Not result Is Nothing Then firstAddress = result.Address 'запоминаем адрес первой найденной ячейки Do If Worksheets("Лист3").Range("c2").Offset(r, 0).Value = result.Offset(0, 22).Value Then 'сравнение 'Обрабатываем найденную ячейку Worksheets("Лист3").Range("g2").Offset(r, 0).Value = result.Offset(0, -6).Value 'client End If Set result = .FindNext(result) 'ищем следующую Loop While Not result Is Nothing And result.Address <> firstAddress 'выход из цикла при переходе снова на первую End If End With
Public Function VerSnils(snilstxt As String, v As Boolean) Dim i%, j%, ms$ Dim kt$, s$ Dim t t = Trim(snilstxt): kt = Right(t, 2) Do While InStr(1, t, "-") > 0 t = Replace(t, "-", "") Loop t = (Mid(t, 1, 9)) Do While InStr(1, t, " ") > 0 t = Replace(t, " ", "") Loop t = Val(t) For i = 1 To 9 j = j + (10 - i) * (t \ (10 ^ (9 - i)) Mod 10) Next i Select Case j Case 100, 101: s = "00" Case Is > 101: s = CStr(j Mod 101) Case Else: s = CStr(j) End Select If v Then VerSnils = CBool(IIf(kt = s, 1, 0)) Else VerSnils = s End If End Function
[/vba]
[vba]
Код
Public Function VerSnils(snilstxt As String, v As Boolean) Dim i%, j%, ms$ Dim kt$, s$ Dim t t = Trim(snilstxt): kt = Right(t, 2) Do While InStr(1, t, "-") > 0 t = Replace(t, "-", "") Loop t = (Mid(t, 1, 9)) Do While InStr(1, t, " ") > 0 t = Replace(t, " ", "") Loop t = Val(t) For i = 1 To 9 j = j + (10 - i) * (t \ (10 ^ (9 - i)) Mod 10) Next i Select Case j Case 100, 101: s = "00" Case Is > 101: s = CStr(j Mod 101) Case Else: s = CStr(j) End Select If v Then VerSnils = CBool(IIf(kt = s, 1, 0)) Else VerSnils = s End If End Function
Private Sub CommandButton1_Click() Application.ScreenUpdating = 0: Application.EnableEvents = 0 Dim Rng, ResRng As Range If CommandButton1.Caption = "Скрыть пустые столбцы" Then Set Rng = Range("F5:J5").Find(Empty, LookIn:=xlValues) If Not Rng Is Nothing Then Set ResRng = Rng firstAddress = Rng.Address Do Set Rng = Range("F5:J5").FindNext(Rng) Set ResRng = Union(ResRng, Rng) Loop While Not Rng Is Nothing And Rng.Address <> firstAddress ResRng.EntireColumn.Hidden = 1 End If Set Rng = Range("L6:L19").Find(Empty, LookIn:=xlValues) If Not Rng Is Nothing Then Set ResRng = Rng firstAddress = Rng.Address Do Set Rng = Range("L6:L19").FindNext(Rng) Set ResRng = Union(ResRng, Rng) Loop While Not Rng Is Nothing And Rng.Address <> firstAddress ResRng.EntireRow.Hidden = 1 End If CommandButton1.Caption = "Отразить все столбцы" Else Range("F5:J5").Columns.Hidden = False Range("L6:L19").Rows.Hidden = False CommandButton1.Caption = "Скрыть пустые столбцы" End If Application.ScreenUpdating = 1: Application.EnableEvents = 1 End Sub
[/vba]
как-то так [vba]
Код
Private Sub CommandButton1_Click() Application.ScreenUpdating = 0: Application.EnableEvents = 0 Dim Rng, ResRng As Range If CommandButton1.Caption = "Скрыть пустые столбцы" Then Set Rng = Range("F5:J5").Find(Empty, LookIn:=xlValues) If Not Rng Is Nothing Then Set ResRng = Rng firstAddress = Rng.Address Do Set Rng = Range("F5:J5").FindNext(Rng) Set ResRng = Union(ResRng, Rng) Loop While Not Rng Is Nothing And Rng.Address <> firstAddress ResRng.EntireColumn.Hidden = 1 End If Set Rng = Range("L6:L19").Find(Empty, LookIn:=xlValues) If Not Rng Is Nothing Then Set ResRng = Rng firstAddress = Rng.Address Do Set Rng = Range("L6:L19").FindNext(Rng) Set ResRng = Union(ResRng, Rng) Loop While Not Rng Is Nothing And Rng.Address <> firstAddress ResRng.EntireRow.Hidden = 1 End If CommandButton1.Caption = "Отразить все столбцы" Else Range("F5:J5").Columns.Hidden = False Range("L6:L19").Rows.Hidden = False CommandButton1.Caption = "Скрыть пустые столбцы" End If Application.ScreenUpdating = 1: Application.EnableEvents = 1 End Sub
в предыдущем файле использовалсь объединение двух диапазонов (шапка и список) в один UDF функцией. В принципе если диапазон дат один (неперерывный), то можно обойтись и без нее. В этом файле шапка фиксированно находится на 1й строке, а со 2 строки формула массива
Диапазон этой сформулой автоматически изменяется при активации листа взависимости от количества заполненных строк на 1 листе. В качестве источника сводной таблицы используется динамический именованный диапазон табл. Сводная таблица автоматически обновляется макросом при любом изменении в диапазоне E1:E2 и при активации этого листа. именованный диапазон Список возвращает диазон из таблицы на 1 листе от первого вхождения даты из ячейки E1 до последнего вхождения даты из ячейки E2
Код
СМЕЩ(Лист1!C3;;;СЧЁТЗ(Лист1!C:C)-1)
- это динамический диапазон, содержащий все данные из столбца Дат на 1 листе именованный диапазон Табл возвращает диапазон, содержащий все непустые строки из столбцов H:J
таблица на 1 листе должна быть отсортирована по дате в порядке возрастания ну вроде все.
при условии, что значения в диапазоне отсортированы в порядке возрастания
в предыдущем файле использовалсь объединение двух диапазонов (шапка и список) в один UDF функцией. В принципе если диапазон дат один (неперерывный), то можно обойтись и без нее. В этом файле шапка фиксированно находится на 1й строке, а со 2 строки формула массива
Диапазон этой сформулой автоматически изменяется при активации листа взависимости от количества заполненных строк на 1 листе. В качестве источника сводной таблицы используется динамический именованный диапазон табл. Сводная таблица автоматически обновляется макросом при любом изменении в диапазоне E1:E2 и при активации этого листа. именованный диапазон Список возвращает диазон из таблицы на 1 листе от первого вхождения даты из ячейки E1 до последнего вхождения даты из ячейки E2
Код
СМЕЩ(Лист1!C3;;;СЧЁТЗ(Лист1!C:C)-1)
- это динамический диапазон, содержащий все данные из столбца Дат на 1 листе именованный диапазон Табл возвращает диапазон, содержащий все непустые строки из столбцов H:J
таблица на 1 листе должна быть отсортирована по дате в порядке возрастания ну вроде все.
Sub PageBreak() Application.ScreenUpdating = 0: Application.EnableEvents = 0 Dim F&, L&, I&, J&, K&, S$
With ActiveSheet.UsedRange F = .Column L = .Column + .Columns.Count - 1 End With
Do While I < ActiveSheet.HPageBreaks.Count I = I + 1 J = ActiveSheet.HPageBreaks(I).Location.Row For K = F To L If Cells(J, K).MergeCells And Cells(J - 1, K).MergeCells Then If Cells(J, K).MergeArea.Address = Cells(J - 1, K).MergeArea.Address _ And S <> Cells(J, K).MergeArea.Address Then S = Cells(J, K).MergeArea.Address Set ActiveSheet.HPageBreaks(I).Location = Cells(J, K).MergeArea.Offset(1) End If End If Next Loop Application.ScreenUpdating = 1: Application.EnableEvents = 1 End Sub
[/vba]
имхо вопрос по части VBA [vba]
Код
Sub PageBreak() Application.ScreenUpdating = 0: Application.EnableEvents = 0 Dim F&, L&, I&, J&, K&, S$
With ActiveSheet.UsedRange F = .Column L = .Column + .Columns.Count - 1 End With
Do While I < ActiveSheet.HPageBreaks.Count I = I + 1 J = ActiveSheet.HPageBreaks(I).Location.Row For K = F To L If Cells(J, K).MergeCells And Cells(J - 1, K).MergeCells Then If Cells(J, K).MergeArea.Address = Cells(J - 1, K).MergeArea.Address _ And S <> Cells(J, K).MergeArea.Address Then S = Cells(J, K).MergeArea.Address Set ActiveSheet.HPageBreaks(I).Location = Cells(J, K).MergeArea.Offset(1) End If End If Next Loop Application.ScreenUpdating = 1: Application.EnableEvents = 1 End Sub