减去两个范围并清除结果中的内容

时间:2016-10-14 14:17:20

标签: excel vba excel-vba

我正在尝试减去RangeA - RangeA +偏移以获得新范围。在此之后,我需要清除其中的所有值。我的问题是变量列范围是空的,我无法意识到我做错了什么。

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 个答案:

答案 0 :(得分:0)

此代码将用户定义的范围移动用户定义的数量。

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." & vbNewLine & _
            "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个错误取决于用户提供给我们的内容。

  • 如果用户尝试将RangeBoxA的值设置为非范围值,则会出现错误438。
  • 如果用户尝试输入任何非数字作为偏移值,则会出现错误13。
  • 错误5将会发生,因为我在错误处理方面表现不佳而且我不确定它为什么会发生..它会在抛出任何错误(非vba错误)后在最后循环我的错误语句。

接下来,我们将用户提供的范围分成两个“单元格”。使用此方法,我们可以应用一些简单的数学运算来显示复制目的地的位置以及删除适当数量的旧范围值。

  • 如果列数大于用户提供的偏移量,则新旧范围将重叠。一些简单的数学运算将删除旧单元格,同时保留新单元格

  • 如果列数少于用户提供的偏移量,请删除所有旧单元格,因为它们不会重叠。

请告诉我这是否适合您。