Excel 更改范围将断开子对象

Excel 更改范围将断开子对象,excel,vba,Excel,Vba,我需要偏移第一行,所以我将子行中的范围从 For Each rng In Sheets("360").Range("B:CJ" & Lastrow) 到 “知道大麦”号潜艇的运行时间为5秒,“知道”号潜艇的运行时间甚至为分钟 如何解决这个问题 谢谢 Sub CleanAll() Dim rng As Range Dim Lastrow As Long With Sheets("360") Lastrow = .Range("A" &

我需要偏移第一行,所以我将子行中的范围从

For Each rng In Sheets("360").Range("B:CJ" & Lastrow)

“知道大麦”号潜艇的运行时间为5秒,“知道”号潜艇的运行时间甚至为分钟

如何解决这个问题

谢谢

Sub CleanAll()

    Dim rng As Range
    Dim Lastrow As Long

    With Sheets("360")
        Lastrow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With

    For Each rng In Sheets("360").Range("B2:CJ" & Lastrow)
        rng.Value = NumberOnly(rng.Value)
    Next
End Sub
功能

Function NumberOnly(strSource As String) As String
Dim i As Integer
Dim strResult As String

For i = 1 To Len(strSource)
    Select Case Asc(Mid(strSource, i, 1))
        Case 32, 48 To 57, 65, 78:
            strResult = strResult & Mid(strSource, i, 1)
    End Select
Next
NumberOnly = strResult

End Function
按如下方式拆下以下2个CJ:

For Each rng In Sheets("360").Range("B2:CJ" & Lastrow)
Lastrow已经指定了最后一行编号,因此,如果Lastrow值为300,并且您写入了“CJ2”和Lastrow,那么您的实际范围现在是B2:CJ2300,这意味着您现在要运行2000多行

按如下方式拆下以下2个CJ:

For Each rng In Sheets("360").Range("B2:CJ" & Lastrow)

Lastrow已经指定了最后一行编号,因此如果Lastrow值为300,并且您写入了“CJ2”和Lastrow,那么您的实际范围现在是B2:CJ2300,这意味着您现在又运行了2000多行。

我发现在表中使用您的数据可以解决许多重新调整范围的问题

也就是说,您应该从您的范围创建一个变体数组,然后在变体数组中循环。完成后,将阵列复制回范围。这将使它加速百倍

像这样的

Sub CleanAll()

    Dim myArray As Variant
    Dim Lastrow As Long


    With Sheets("360")
        Lastrow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With

    myArray = Sheets("360").Range("B2:CJ" & Lastrow)

    For x = LBound(myArray) To UBound(myArray)
        For y = LBound(myArray, 2) To UBound(myArray, 2)
            myArray(x, y) = NumberOnly(myArray(x, y))
        Next y
    Next x

    Sheets("360").Range("B2:CJ" & Lastrow) = myArray
End Sub

Function NumberOnly(ByVal strSource As String) As String
    Dim i As Integer
    Dim strResult As String

    For i = 1 To Len(strSource)
        Select Case Asc(Mid(strSource, i, 1))
            Case 32, 48 To 57, 65, 78:
                strResult = strResult & Mid(strSource, i, 1)
        End Select
    Next
    NumberOnly = strResult

End Function

我发现在表中使用数据将解决许多重新调整范围的问题

也就是说,您应该从您的范围创建一个变体数组,然后在变体数组中循环。完成后,将阵列复制回范围。这将使它加速百倍

像这样的

Sub CleanAll()

    Dim myArray As Variant
    Dim Lastrow As Long


    With Sheets("360")
        Lastrow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With

    myArray = Sheets("360").Range("B2:CJ" & Lastrow)

    For x = LBound(myArray) To UBound(myArray)
        For y = LBound(myArray, 2) To UBound(myArray, 2)
            myArray(x, y) = NumberOnly(myArray(x, y))
        Next y
    Next x

    Sheets("360").Range("B2:CJ" & Lastrow) = myArray
End Sub

Function NumberOnly(ByVal strSource As String) As String
    Dim i As Integer
    Dim strResult As String

    For i = 1 To Len(strSource)
        Select Case Asc(Mid(strSource, i, 1))
            Case 32, 48 To 57, 65, 78:
                strResult = strResult & Mid(strSource, i, 1)
        End Select
    Next
    NumberOnly = strResult

End Function

我认为你是对的,但这让人困惑,因为@Tim在他的问题中是双向的+1@DougGlancy说得好,我没有意识到在CleanAll潜水艇上它是可以的。但这也解释了为什么潜水艇突然变得更长+感谢您的回复。因此,图纸(“360”)中每个rng的
。范围(“B2:CJ”和最后一行)
将第一行
从B2设置为CJ2
?i、 e第一行没有被地铁控制,我不确定我是否理解你想要的:B2:CJ50将选择2到50之间的行,因此它将跳过第一行(A1:CJ12)。谢谢你,我的意思是我认为你是对的,但这让人困惑,因为@Tim在他的问题中是双向的+1@DougGlancy说得好,我没有意识到在CleanAll潜水艇上它是可以的。但这也解释了为什么潜水艇突然变得更长+感谢您的回复。因此,图纸(“360”)中每个rng的
。范围(“B2:CJ”和最后一行)
将第一行
从B2设置为CJ2
?i、 e第一行没有被SUB操作,我不确定我是否理解您想要的:B2:CJ50将选择2到50之间的行,因此它将跳过第一行(A1:CJ12)谢谢您,我的意思是,我想使用您的代码,但是当我运行它时,
ByRef参数类型不匹配
myArray(X,y)=NumberOnly(myArray(X,y))
第二个
myArray(X,y)
以蓝色高亮显示,使NumberOnly函数的形式参数为byVal,我将编辑我的答案。jAverde,我想使用你的代码,但当我运行它时,
myArray(X,y)=NumberOnly(myArray(X,y))
第二个
myArray(X,y)
以蓝色高亮显示,将NumberOnly函数的形式参数设置为byVal,我将编辑我的答案。