首页 > 解决方案 > 当我在列中提取具有相同名称的数据并将它们放入不同的工作表时,如何解决“程序无响应错误”?

问题描述

根据我之前发布的主题,我如何提取合并数据并将它们放入不同的工作表中?一切似乎都很好,直到我的程序遇到

“程序没有响应错误”

我认为这是由于使用

Sheets(sheetname).UsedRange.Rows.count

(因为删除和清除行)导致这种情况发生。基于其他线程讨论,我尝试改用它

Cells(Sheets("SheetName").Rows.Count, 1).End(xlup).Row 

(其他人建议的更好的选择)但它没有给我想要的结果,如下所示。那么在这种情况下如何修改我的下面的代码来解决程序没有响应的错误,并且仍然得到如下所示的理想场景呢?

在此处输入图像描述

将提取的数据放入 3 个不同的工作表中,即索引 1、索引 2 和索引 3,如下所示

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

   Sub UpdateVal()
    Static count As Long
    Dim iRow As Long
    Dim aRow As Long
    Dim a As Long
    Dim b As Long
    Dim selectRange As Range
    dim lastline as integer
    dim sheetname as string
    dim indexrowcount as integer
    dim wb as workbook
    dim ws as worksheet
    set wb= activeworkbook
    set ws=wb.sheets(Index)
    j = 2
    iRow = 1
    LastLine = ActiveSheet.UsedRange.Rows.count
    While iRow < LastLine + 1
        a = iRow + 1
        b = iRow + 17 ' Max Group Size with Same name in F to H column
        count = 1
        If ws.Cells(iRow, "F").Value = "Martin1" Then
            sheetname = "Index1"
        ElseIf ws.Cells(iRow, "F").Value = "John1" Then
            sheetname = "Index2"
        Else
            sheetname = "Index3"
        End If
        For aRow = a To b
            If ws.Cells(iRow, "F") = ws.Cells(aRow, "F") And ws.Cells(iRow, "G") = ws.Cells(aRow, "G") And ws.Cells(iRow, "H") = ws.Cells(aRow, "H") Then
                count = count + 1
            Else
                Set selectRange = Range("A" & iRow & ":J" & aRow - 1)
                selectRange.Copy
                indexrowcount = Sheets(sheetname).UsedRange.Rows.count
                Sheets(sheetname).Range("A" & indexrowcount).PasteSpecial xlPasteAll
                iRow = iRow + count
                Exit For
           End If
        Next aRow
    Wend

标签: excelvba

解决方案


我的猜测是您的Implicit工作表引用可能是罪魁祸首。正如我在评论中提到的,Implicit引用将引用当前活动的工作表,或ActiveSheet.

看看这篇文章如何避免这种情况。当你研究那个帖子时,你应该有一个Worksheet变量,例如ws参考。

现在,例如,If Cells(iRow, "F") = Cells(aRow, "F") And Cells(iRow, "G") = Cells(aRow, "G") And Cells(iRow, "H") = Cells(aRow, "H") Then可以TRUEActiveSheet所有空单元格的任何单元格上。这样你就永远不会击中FALSE并且iRow 永远不会增加 >无限循环>你的错误


推荐阅读