Я изменил существующий макрос на листе, чтобы автоматически обрезать и автоматически подбирать столбцы при изменении ячейки в диапазоне. Это работает, но у меня было два вопроса, на которые я надеялся найти ответы здесь: есть ли способ установить целевой диапазон для того диапазона, который был только что отредактирован (только одна ячейка, если в одну ячейку были введены данные вручную, и диапазон того, что было вставляется, когда диапазон размещается внутри указанного диапазона c); и есть ли способ сделать код у меня уже более эффективным?
Это форма запроса, которая часто имеет несколько имен / идентификаторов, которые используются и мной, и другими, и чаще всего пользователь копирует и вставляет диапазон из 4 столбцов с 30-я sh строками за раз, а не по одному. Там есть несколько IF, чтобы проверить, это ли я, и это только потому, что я получаю форму от других, а затем оборачиваюсь и отправляю ее клиенту, поэтому я не хотел нажимать «незащищать» каждый раз, когда получил один, если что-то было неправильно.
Вот код, как есть:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Dim KeyCells2 As Range
Set KeyCells = Range("B13:c14")
Set KeyCells2 = Range("B13:E113")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Worksheets("Request Sheet").Unprotect
Range("b4").Value = "=Now()"
If Right(Environ("userprofile"), 7) <> [my pc userprofile name here] Then
Worksheets("Request Sheet").Protect
End If
End If
If Not Application.Intersect(KeyCells2, Range(Target.Address)) Is Nothing Then
ActiveSheet.Unprotect
For Each cell In Range("B13:" & Cells(WorksheetFunction.CountA(Range("B13:B113")) + 12, WorksheetFunction.CountA(Range("B13:E13")) + 1).Address)
cv = cell.Value
If Right(cell, 1) = " " Or Left(cell, 1) = " " Then
cell.Value = WorksheetFunction.Trim(cv)
End If
ActiveSheet.Rows(cell.Row).EntireRow.AutoFit
If Rows(cell.Row).RowHeight <> 15.75 Then
With ActiveSheet
.Rows(cell.Row).RowHeight = 15.75
.Columns(cell.Column).EntireColumn.AutoFit
End With
End If
If Columns(2).ColumnWidth < 18.75 Then
ActiveSheet.Columns(2).ColumnWidth = 18.75
Else: ActiveSheet.Columns(2).EntireColumn.AutoFit
End If
ActiveSheet.Columns(3).EntireColumn.AutoFit
If Columns(3).ColumnWidth < 15.14 Then
ActiveSheet.Columns(3).ColumnWidth = 15.14
End If
If Columns(4).ColumnWidth < 17.43 Then
ActiveSheet.Columns(4).ColumnWidth = 17.43
End If
If Columns(5).ColumnWidth < 13.86 Then
ActiveSheet.Columns(5).ColumnWidth = 13.86
End If
Next
ActiveSheet.Rows(9).RowHeight = 24
ActiveSheet.Rows(10).RowHeight = 19.5
ActiveSheet.Rows(11).RowHeight = 26.25
ActiveSheet.Rows(12).RowHeight = 42.75
If Right(Environ("userprofile"), 7) <> [my pc userprofile name here] Then
ActiveSheet.Protect
End If
End If
End Sub