#vba #excel
#vba #excel
Вопрос:
Я пытаюсь вычесть RangeA — RangeA offset, чтобы получить новый диапазон. После этого мне нужно очистить все значения внутри него. Моя проблема в том, что переменная columnrange пуста, и я не могу понять, что я делаю неправильно.
Dim rng1 As String
Dim rangeA As Range
Dim columnrange As Range
Dim clearrange As Range
rng1 = TextBoxA.Value
If Not IsNull(RangeboxA.Value) Then
On Error Resume Next
Set rangeA = Sheets("Plan1").Range(RangeboxA.Value)
rangeA.Select
Selection.Copy
rangeA.Offset(0, rng1).Select
ActiveSheet.Paste
columnrange = rangeA.Resize(rangeA.Rows.Count, rangeA.Columns.Count rng1).Value
columnrange.Select
On Error Resume Next
If rangeA Is Nothing Then MsgBox "Verificar informação A"
End If
Комментарии:
1. Когда вы говорите вычесть RangeA-(RangeA смещение), вы имеете в виду «значения в RangeA» — «значения в (RangeA смещение)»? Очистить значения внутри «it», нового диапазона?
2. Вычтите RangeA — (RangeA offset), и эта разница даст мне новый диапазон, и я хочу стереть все значения в этом новом диапазоне.
3. Например: E2:H2 — B2:E2 = B2:D2 (Новый диапазон) Я хочу стереть значения из B2: D2.
4. Каков ожидаемый формат строки в rng1, которая поступает из текстового поля? В соответствии с вашим примером выше, получаем ли мы ввод строки «B2: E2»?
5. rng1 — это число. Диапазон похож на B2: E2
Ответ №1:
Этот код перемещает пользовательский диапазон на определенную пользователем величину.
Sub RemoveRangeOverlap()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Plan1")
Dim rngOffset As Integer
Dim rangeA As Range, rangeB As Range
Dim cellRange() As String
On Error GoTo ErrHandle
rngOffset = CInt(TextBoxA.Value)
If RangeBoxA.Value <> "" Then
Set rangeA = ws.Range(RangeBoxA.Value) 'Set old range
cellRange = Split(CStr(RangeBoxA.Value), ":") 'Set start/ending cells
ReDim Preserve cellRange(LBound(cellRange) To UBound(cellRange))
Set rangeB = ws.Range(ws.Range(cellRange(0)).Offset(0, rngOffset), _
ws.Range(cellRange(1)).Offset(0, rngOffset)) 'set new range
rangeA.Copy rangeB 'copy new range
Application.CutCopyMode = xlCopy 'remove marching ants
If rangeA.Columns.Count <= rngOffset Then 'remove old values
rangeA.Clear
Else: ws.Range(ws.Range(cellRange(0)), _
ws.Range(cellRange(1)).Offset(0, rngOffset - rangeA.Columns.Count)).Clear
End If
Else: MsgBox "Missing target range input.", vbCritical, "Insufficient Data"
End If
ErrHandle:
If Err.Number = 438 Then
MsgBox "Invalid range format in range input box." amp; vbNewLine amp; _
"Proper range format example: A1:A1", vbCritical, "Error 438"
ElseIf Err.Number = 13 Then
MsgBox "Only numbers may be input as the range offset amount", _
vbCritical, "Error 13: Type Mis-match"
ElseIf Err.Number = 5 Then Exit Sub
Else: Err.Raise Err.Number
End If
End Sub
Как работает код:
Первое, что мы настроили, это управление информацией из пользовательских значений. Для достижения этой цели (что также можно сделать с If Then
помощью инструкций, чтобы предотвратить возникновение ошибок в первую очередь) Я включил строку обработки ошибок в конце. Мы знаем, какие 3 ошибки мы ожидаем получить в зависимости от того, что нам предоставляет пользователь.
- Ошибка 438 возникнет, если пользователь попытается установить значение RangeBoxA как значение, отличное от диапазона.
- Ошибка 13 возникнет, если пользователь попытается ввести что-либо, что не является числом, в качестве значения смещения.
- Ошибка 5 возникнет, потому что я плохо разбираюсь в обработке ошибок и не уверен, почему это происходит.. Он повторяет мое утверждение об ошибке в конце после того, какая ошибка была выдана (будучи ошибкой, отличной от vba).
Затем мы разделяем диапазон, предоставленный пользователем, на две «ячейки». Используя это, мы можем применить некоторые простые математические вычисления, чтобы показать, где будет место назначения копирования, а также удалить нужное количество старых значений диапазона.
- Если количество столбцов больше, чем заданное пользователем смещение, то новые и старые диапазоны будут перекрываться. Некоторые простые математические вычисления удалят старые ячейки, сохранив новые
- Если количество столбцов меньше заданного пользователем смещения, удалите все старые ячейки, поскольку они не будут перекрываться.
Дайте мне знать, если это сработает для вас.
Комментарии:
1. Я думаю, что ваш код сокращает диапазон и копирует после смещения. Если я сделаю это, все формулы, связанные с этим диапазоном, останутся связанными даже после применения смещения. Я пытаюсь избежать этого, поэтому я пытаюсь скопировать и стереть ячейки.
2. Итак, вы просто хотите, чтобы значения перемещались, а не формулы? Я изменил код, чтобы отражать только вставляемые значения, а не формулы.
3. Исправлено. Я хочу переместить некоторые значения во времени, например, отложить на 6 месяцев, поэтому я хочу, чтобы это было связано.
4. Посмотрите, работает ли для вас изменение, которое я внес в код… Я действительно в замешательстве.
5. Позвольте мне объяснить мой рабочий лист. У меня есть доходы, разделенные на месяцы, и связанные с ними ячейки, вычисляющие общую сумму. Если я хочу отложить определенный доход, например, на 6 месяцев, я не могу просто вырезать, потому что связанные ячейки останутся прежними. Поэтому мне приходится копировать, вставлять и стирать скопированные ячейки, чтобы избежать значений в неправильном месяце.