Вычтите два диапазона и очистите содержимое из результата

#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 месяцев, я не могу просто вырезать, потому что связанные ячейки останутся прежними. Поэтому мне приходится копировать, вставлять и стирать скопированные ячейки, чтобы избежать значений в неправильном месяце.