简体   繁体   English

具有下标超出范围错误的Excel VBA剪切和粘贴功能

[英]Excel VBA cut and paste function with subscript out of range error

    Sub CutandPaste()
    With ActiveSheet
        Dim i As Long
        Dim Sheet1 As Worksheet
        Dim Sheet2 As Worksheet

        Set mainsheet = ActiveWorkbook.Sheets("Sheet1")
        Set subsheet = ActiveWorkbook.Sheets("Sheet2")

        endrow = mainsheet.Range("A" & mainsheet.Rows.Count).End(xlUp).Row

            For i = 25 To endrow
                If mainsheet.Cells(i, "J") <> "" Or mainsheet.Cells(i, "L") <> "" Or mainsheet.Cells(i, "N") <> "" Then
                    mainsheet.Range(Cells(i, "B"), Cells(i, "O")).Cut Destination:=subsheet.Range(Cells(i + 25, "B"), Cells(i + 25, "O")).Paste
                    mainsheet.Range(Cells(i, "B"), Cells(i, "O")).Delete '~~> if you want to delete
                    i = i + 1
                End If
            Next
    End With
End Sub

I would like to write a program with the below function 我想用以下功能编写程序

If Cell ("J" i) or Cell("L" i) or Cell("N" i) in Sheet1 is not empty where i equals to any integer 如果Sheet1中的Cell(“ J” i)或Cell(“ L” i)或Cell(“ N” i)不为空,则i等于任何整数

Then cut Cell("B" i) to Cell("O" i) in Sheet 1 to Cell("B" i+25) to Cell("O" i+25) in Sheet2 where i equals to any integer 然后在工作表1中将Cell(“ B” i)切割为Cell(“ O” i)到Sheet2中的Cell(“ B” i + 25)切割为Cell(“ O” i + 25),其中i等于任何整数

However,my code was said to be out of range. 但是,据说我的代码超出范围。

Why is it like so and how can i fix it? 为什么会这样,我该如何解决?

Many thanks 非常感谢

    Sub CutandPaste()
    With ActiveSheet
        Dim i As Long
        Dim Sheet1  As Worksheet
        Dim Sheet2 As Worksheet

        Set mainsheet = ActiveWorkbook.Sheets("Sheet1")
        Set subsheet = ActiveWorkbook.Sheets("Sheet2")

        endrow = mainsheet.Range("A" & mainsheet.Rows.Count).End(xlUp).Row

        For i = endrow To 25 Step -1

                If mainsheet.Cells(i, "J") <> "" Or mainsheet.Cells(i, "L") <> "" Or mainsheet.Cells(i, "N") <> "" Then
                    mainsheet.Range(mainsheet.Cells(i, "B"), mainsheet.Cells(i, "O")).Cut Destination:=subsheet.Range(subsheet.Cells(i + 56, "B"), subsheet.Cells(i + 56, "O")).Paste
                    mainsheet.Range(mainsheet.Cells(i, "B"), mainsheet.Cells(i, "O")).Delete '~~> if you want to delete

                End If
            Next
    End With
End Sub

Latest Version: 最新版本:

        Sub CutandPaste()
    With ActiveSheet
        Dim i As Long
        Dim Sheet1  As Worksheet
        Dim Sheet2 As Worksheet

        Set mainsheet = ActiveWorkbook.Sheets("Sheet1")
        Set subsheet = ActiveWorkbook.Sheets("Sheet2")

        endrow = mainsheet.Range("A" & mainsheet.Rows.Count).End(xlUp).Row
        Bendrow = subsheet.Range("B" & mainsheet.Rows.Count).End(xlUp).Row + 1

        For i = endrow To 25 Step -1
                If mainsheet.Cells(i, "J") <> "" Or mainsheet.Cells(i, "L") <> "" Or mainsheet.Cells(i, "N") <> "" Then
                    mainsheet.Range(mainsheet.Cells(i, "B"), mainsheet.Cells(i, "O")).Cut Destination:=subsheet.Cells(Bendrow, "B")
                    mainsheet.Range(mainsheet.Cells(i, "B"), mainsheet.Cells(i, "O")).Delete '~~> if you want to delete
                    Bendrow = Bendrow + 1
                End If
            Next
    End With
End Sub

MainSheet Data MainSheet数据

SubSheet Data 子表数据

The problem was that the Destination parameter of Range.Copy and Range.Cut need to be a range. 问题是Range.CopyRange.CutDestination参数需要是一个范围。 You have it set to the Paste method of a range. 您已将其设置为范围的Paste方法。

Incorrect 不正确的

mainsheet.Range(mainsheet.Cells(i, "B"), mainsheet.Cells(i, "O")).Cut Destination:=subsheet.Range(subsheet.Cells(i + 56, "B"), subsheet.Cells(i + 56, "O")).Paste mainsheet.Range(mainsheet.Cells(i,“ B”),mainsheet.Cells(i,“ O”))。剪切目标:= subsheet.Range(subsheet.Cells(i + 56,“ B”),subsheet。单元格(i + 56,“ O”))。粘贴

Correct 正确

mainsheet.Range(mainsheet.Cells(i, "B"), mainsheet.Cells(i, "O")).Cut Destination:=subsheet.Cells(i + 56, "B") mainsheet.Range(mainsheet.Cells(i,“ B”),mainsheet.Cells(i,“ O”))。剪切目标:= subsheet.Cells(i + 56,“ B”)

I refactored you code using subrange. 我使用子范围重构了您的代码。 I think that it gives a much cleaner look. 我认为它看起来更干净。

Here are some different ways of defining the same range 这是定义相同范围的一些不同方法

Range(Cells(i,"A"),Cells(i,"O")) Cells(i,"A").Resize(1,15) Rows(i).Range ("A1:O1") Rows(i).Range ("A1:O1") Rows(i).Resize(1,15) Rows(2).Columns("A:O") Range(Cells(i,“ A”),Cells(i,“ O”))Cells(i,“ A”)。Resize(1,15)Rows(i).Range(“ A1:O1”)Rows( i).Range(“ A1:O1”)Rows(i).Resize(1,15)Rows(2).Columns(“ A:O”)

Sub CutandPaste()

    Dim i As Long
    Dim mainsheet As Worksheet
    Dim subsheet As Worksheet

    Set mainsheet = ActiveWorkbook.Sheets("Sheet1")
    Set subsheet = ActiveWorkbook.Sheets("Sheet2")

    With mainsheet
        endrow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = endrow To 25 Step -1
            If .Cells(i, "J") <> "" Or .Cells(i, "L") <> "" Or .Cells(i, "N") <> "" Then
                .Rows(i).Resize(1, 15).Cut Destination:=subsheet.Cells(i + 56, "B")
                .Rows(i).Resize(1, 15).Delete    '~~> if you want to delete
            End If
        Next
    End With
End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM