选择工作表类的方法失败

问题描述 投票:1回答:4

我在Excel 2010中有这个子,它应该过滤一个工作表中的所有单元格,直到找到与Proj No的匹配,然后将该行中的一个字段粘贴到另一个字段中。

当我尝试运行sub时,它给出了一个错误1004:选择工作表类失败的方法。我已经标出了发生这种情况的界限。任何帮助将不胜感激。

Option Explicit
Private Sub btnNext_Click()

Dim ProjNo As String
Dim Col As String
Dim Row As String
Dim cell As Range

Unload Dialog
formWait.Show

Sheets("Sheet7").Activate

ProjNo = Worksheets("Sheet1").Range("D6").Value

Col = Cells(Rows.Count, "A").End(xlUp).Row

For Each cell In Range("A2:A" & Col)  
    If cell.Value = ProjNo Then
    Row = Row & cell.Row
    End If

Next cell
Workbooks("Form.xlsm").Sheets("Sheet7").Range("Row, 6").Copy Destination:=Sheets("Sheet1").Range("19, 5") ‘Error

Unload formWait

End Sub
excel vba excel-vba
4个回答
1
投票

我不知道GWP是什么,但我想你想在那里使用ProjNo。 Range属性不接受这样的参数。除非你有一个“Row,6”的命名范围,因为它不是合法的名称,你必须为Range提供有效的范围引用,例如A6或D2:D12。

此外,您不能连接行并在Range引用中使用它们以获得更大的范围。您必须复制循环中的每一行,随意合并范围,或者更好的是,过滤所需的值并复制可见行。

试试这个:

Private Sub btnNext_Click()

    With ThisWorkbook.Worksheets("Sheet7")
        'filter for the project id
        .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 6).AutoFilter 1, "=" & .Range("D6").Value

        'copy the visible rows
        .Range("F2", .Cells(.Rows.Count, 6).End(xlUp)).SpecialCells(xlCellTypeVisible).Copy _
            ThisWorkbook.Worksheets("Sheet1").Cells(19, 5)

        'get rid of the filter
        .AutoFilterMode = False

    End With

End Sub

1
投票

上面的代码中有一些令人困惑的项目,所以我想把它们放在这里。让我们开始吧:

Dim Col As String
Dim Row As String

看起来你的设计希望这些类型为Long而不是String类型。即使这些变量是字符串,我也建议调整它们的名字 - 当你的开发人员试图审查你的设计时,他或她可能会看到像“Col”或“Row”这样的名字并认为“这些是数字” ”。轻松修复:

Dim Col As Long, Row As Long

下一个问题出现在这里:

Col = Cells(Rows.Count, "A").End(xlUp).Row

上面的结构是识别最后一个ROW而不是列的常用方法。 (似乎你已经切换了“A”和数字,这是另一个简单的修复)。虽然在语法上完全可以将变量命名为最后一行“Col”,但人类用户很可能会发现这一点令人困惑。识别最后一行(以及你在For Each循环中使用的最后一个col),如奇妙的细节here中所解释的,将更好地处理如下:

Dim SheetSeven As Worksheet, SheetOne As Worksheet
Dim LastRow As Long, LastCol As Long

Set SheetSeven = ThisWorkbook.Worksheets("Sheet7")
Set SheetOne = ThisWorkbook.Worksheets("Sheet1")

With SheetSeven
    LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
    LastCol = .Range("A" & .Columns.Count).End(xlToLeft).Column               
End With

这应该使你的For Each循环看起来像这样:

With SheetSeven
    For Each cell in .Range("A2:A" & LastCol)
    '... do you comparison and row incrementing here
    Next cell
End With

一旦您将工作表识别为变量,Range.Copy操作也应该更容易:

With SheetSeven
    .Range(.Cells(Row, 6)).Copy _
    Destination:=SheetOne.Range(SheetOne.Cells(19, 5))
End With

1
投票

您还可以检查的另一件事是Application.ScreenUpdating的状态。随着Office 2013及更高版本的发布,引入了SDI(单文档界面)。如果Application.ScreenUpdating为False且工作簿未处于活动状态,则对Workbook.Activate的隐含调用将失败。检查ScreenUpdating的状态,如果需要,将其设置为True。在对该工作簿进行第一次Activate调用后,可以将其设置回False。看到这篇文章:https://support.microsoft.com/en-us/help/3083825/excel-workbook-is-not-activated-when-you-run-a-macro-that-calls-the-wo


0
投票

在我的情况下,错误来自工作表被隐藏。所以我检查一下我是不是在使用隐藏的工作表。或者,在尝试选择或激活工作表之前,您需要取消隐藏工作表。

For Each sh In ThisWorkbook.Sheets
    If Left(sh.Name, 8) <> "Template" Then
        sh.Select
        sh.Range("A1").Select
    End If
Next
© www.soinside.com 2019 - 2024. All rights reserved.