Всем добра! Уверен что даже для начинающих такой код будет простейшим но мои познания в VBA еще меньше (((
Имеется "журнал регистрации", постоянно растущий вниз мере заполнения новых строк (событий). Задача следующая: при изменении значения в диапазоне столбцов А:P все атрибуты форматов ячейки в которой были введены любые значения - были бы назначены аналогично из ячейки строкой выше. Пример - вводим какое угодно значение в ячейку F654 и после ЕNТЕR или ctrl+V в эту ячейку - она должна получить тот же формат что и в F653 Исключением должны быть первая и вторая строки листа а так же это правило должно работать если "протягивать" вниз.
Всем добра! Уверен что даже для начинающих такой код будет простейшим но мои познания в VBA еще меньше (((
Имеется "журнал регистрации", постоянно растущий вниз мере заполнения новых строк (событий). Задача следующая: при изменении значения в диапазоне столбцов А:P все атрибуты форматов ячейки в которой были введены любые значения - были бы назначены аналогично из ячейки строкой выше. Пример - вводим какое угодно значение в ячейку F654 и после ЕNТЕR или ctrl+V в эту ячейку - она должна получить тот же формат что и в F653 Исключением должны быть первая и вторая строки листа а так же это правило должно работать если "протягивать" вниз.Литр
Сообщение отредактировал Литр - Пятница, 08.05.2026, 13:43
при изменении значения в диапазоне столбцов А:P все атрибуты форматов ячейки в которой были введены любые значения - были бы назначены аналогично из ячейки строкой выше.
Пробуйте и дайте знать. Удачи.
Литр, Вечер добрый (а может быть и день или утро). Возможно я вас не правильно понял, но всё же пробуйте следуйщий код: [vba]
Код
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range) Dim a As Range Dim r As Long
On Error GoTo ExitHandler
Dim rng As Range Set rng = Intersect(Target, Me.Range("A:P")) If rng Is Nothing Then Exit Sub
Application.EnableEvents = False
For Each a In rng.Areas
For r = Application.Max(3, a.Row) To a.Row + a.Rows.Count - 1 Me.Range( _ Me.Cells(r - 1, a.Column), _ Me.Cells(r - 1, a.Column + a.Columns.Count - 1) _ ).Copy
Me.Cells(r, a.Column).PasteSpecial xlPasteFormats Next r
Next a
ExitHandler:
Application.CutCopyMode = False Application.EnableEvents = True End Sub
[/vba]Данный код поместите в модуль листа где вы хотите
при изменении значения в диапазоне столбцов А:P все атрибуты форматов ячейки в которой были введены любые значения - были бы назначены аналогично из ячейки строкой выше.
Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ExitHandler Application.EnableEvents = False Dim rng As Range Set rng = Me.Range("F:P") If Target.CountLarge = 1 Then If Not Intersect(Target, rng) Is Nothing Then AutoFitRow Target End If End If ExitHandler: Application.EnableEvents = True Dim i As Long If Target.Column = 4 Then i = Application.Match(Target.Value, Sheets("СПИСОК").Range("A1:A100"), 0) If i > 0 Then Range("E" & Target.Row).Value = Sheets("СПИСОК").Range("B" & i).Value End If If Not Intersect(Target, Columns("F:G")) Is Nothing Then If Range("F" & Target.Row) <> "" And Range("G" & Target.Row) <> "" Then Range("H" & Target.Row) = Range("F" & Target.Row).Value & " - " & Range("G" & Target.Row).Value End If End Sub
[/vba]
MikeVol, хороший код.
Помоги соединить его с этим:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ExitHandler Application.EnableEvents = False Dim rng As Range Set rng = Me.Range("F:P") If Target.CountLarge = 1 Then If Not Intersect(Target, rng) Is Nothing Then AutoFitRow Target End If End If ExitHandler: Application.EnableEvents = True Dim i As Long If Target.Column = 4 Then i = Application.Match(Target.Value, Sheets("СПИСОК").Range("A1:A100"), 0) If i > 0 Then Range("E" & Target.Row).Value = Sheets("СПИСОК").Range("B" & i).Value End If If Not Intersect(Target, Columns("F:G")) Is Nothing Then If Range("F" & Target.Row) <> "" And Range("G" & Target.Row) <> "" Then Range("H" & Target.Row) = Range("F" & Target.Row).Value & " - " & Range("G" & Target.Row).Value End If End Sub
MikeVol, проверил, работает. Но непривычно когда после ввода значений в ячейку, выделенной остается та которую меняли. Как бы исправить что бы по привычке после Enter выделялась ячейка рядом ниже. В остальном Ок.
Только у меня какая то дичь с форматами. Возможно что это из-за того что я на вкладке "Стили" удалил все форматы? пытаюсь их вернуть командой "объединить стили"
MikeVol, проверил, работает. Но непривычно когда после ввода значений в ячейку, выделенной остается та которую меняли. Как бы исправить что бы по привычке после Enter выделялась ячейка рядом ниже. В остальном Ок.
Только у меня какая то дичь с форматами. Возможно что это из-за того что я на вкладке "Стили" удалил все форматы? пытаюсь их вернуть командой "объединить стили"Литр
Попытаюсь объяснить: кроме enter или ctrl+V некоторые мои юзеры, ввод значения в ячейку заканчивают используя стрелки или даже переводят мышью на другую ячейку. Естественно они в недоумении почему выделяется не та ячейка которую они хотели. Есть возможность подправить макрос так что бы если enter то вниз; стрелка - то в зависимсти от стрелки (вверх, лево, право, низ); ctrl+V то остается в ней; ну и если мышью то соответстенно.... То есть не зависимо от того как заканчивается ввод данных в ячейку, она принимает формат из вышестоящей. И вот еще что: не работает это правило когда отрабатывают функции в колонках 5 и 8.
Спасибо заранее
MikeVol, Да, как бы норм но не совсем.
Попытаюсь объяснить: кроме enter или ctrl+V некоторые мои юзеры, ввод значения в ячейку заканчивают используя стрелки или даже переводят мышью на другую ячейку. Естественно они в недоумении почему выделяется не та ячейка которую они хотели. Есть возможность подправить макрос так что бы если enter то вниз; стрелка - то в зависимсти от стрелки (вверх, лево, право, низ); ctrl+V то остается в ней; ну и если мышью то соответстенно.... То есть не зависимо от того как заканчивается ввод данных в ячейку, она принимает формат из вышестоящей. И вот еще что: не работает это правило когда отрабатывают функции в колонках 5 и 8.
MikeVol, проверил вариант из Сообщение № 8 не корректно работает, снова после присвоения формата выделяется эта же ячейка, а нужно: если enter то вниз; стрелка - то в зависимсти от стрелки (вверх, лево, право, низ); ctrl+V то остается в ней; если мышью то соответственно ячейка по клику мышью
MikeVol, проверил вариант из Сообщение № 8 не корректно работает, снова после присвоения формата выделяется эта же ячейка, а нужно: если enter то вниз; стрелка - то в зависимсти от стрелки (вверх, лево, право, низ); ctrl+V то остается в ней; если мышью то соответственно ячейка по клику мышьюЛитр
cmivadwot, да, работает На листе есть еще несколько макросов, нужно их объединить. У меня не получается
[vba]
Код
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo SafeExit If Target Is Nothing Then Exit Sub If Target.CountLarge > 1 Then GoTo SafeExit Application.EnableEvents = False
Dim rng As Range Set rng = Me.Range("B2:P5000")
If Not Intersect(Target, rng) Is Nothing Then
If Not IsDate(Target.Value) Then
If VarType(Target.Value) = vbString Then Target.Value = UCase$(CStr(Target.Value)) End If
End If
AutoFitRow Target End If
If Target.Column = 4 Then
Dim i As Variant i = Application.Match(Target.Value, _ Sheets("СПИСОК").Range("A1:A100"), 0)
If Not IsError(i) Then Me.Cells(Target.Row, "E").Value = _ Sheets("СПИСОК").Cells(i, "B").Value End If
End If
If Not Intersect(Target, Me.Columns("F:G")) Is Nothing Then
If Len(Me.Cells(Target.Row, "F").Value) > 0 And _ Len(Me.Cells(Target.Row, "G").Value) > 0 Then Me.Cells(Target.Row, "H").Value = _ Me.Cells(Target.Row, "F").Value & " - " & _ Me.Cells(Target.Row, "G").Value End If
End If
SafeExit: Application.EnableEvents = True End Sub
Private Sub AutoFitRow(ByVal cell As Range) Dim r As Long r = cell.Row
With Me.Rows(r) .AutoFit
If .RowHeight < 30 Then .RowHeight = 30 If .RowHeight > 120 Then .RowHeight = 120 End With
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 13 Then Application.CutCopyMode = False End If
End Sub
[/vba]
cmivadwot, да, работает На листе есть еще несколько макросов, нужно их объединить. У меня не получается
[vba]
Код
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo SafeExit If Target Is Nothing Then Exit Sub If Target.CountLarge > 1 Then GoTo SafeExit Application.EnableEvents = False
Dim rng As Range Set rng = Me.Range("B2:P5000")
If Not Intersect(Target, rng) Is Nothing Then
If Not IsDate(Target.Value) Then
If VarType(Target.Value) = vbString Then Target.Value = UCase$(CStr(Target.Value)) End If
End If
AutoFitRow Target End If
If Target.Column = 4 Then
Dim i As Variant i = Application.Match(Target.Value, _ Sheets("СПИСОК").Range("A1:A100"), 0)
If Not IsError(i) Then Me.Cells(Target.Row, "E").Value = _ Sheets("СПИСОК").Cells(i, "B").Value End If
End If
If Not Intersect(Target, Me.Columns("F:G")) Is Nothing Then
If Len(Me.Cells(Target.Row, "F").Value) > 0 And _ Len(Me.Cells(Target.Row, "G").Value) > 0 Then Me.Cells(Target.Row, "H").Value = _ Me.Cells(Target.Row, "F").Value & " - " & _ Me.Cells(Target.Row, "G").Value End If
End If
SafeExit: Application.EnableEvents = True End Sub
Private Sub AutoFitRow(ByVal cell As Range) Dim r As Long r = cell.Row
With Me.Rows(r) .AutoFit
If .RowHeight < 30 Then .RowHeight = 30 If .RowHeight > 120 Then .RowHeight = 120 End With
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 13 Then Application.CutCopyMode = False End If