选择工作表类的方法失败

时间:2014-07-21 19:12:01

标签: excel vba excel-vba

我在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

4 个答案:

答案 0 :(得分:1)

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

Dim Col As String
Dim Row As String

您的设计似乎希望这些类型为Long,而不是类型String。即使这些变量是字符串,我也建议调整它们的名字 - 当你的开发人员试图审查你的设计时,他或她可能会看到像#34; 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 :(得分: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

答案 2 :(得分:1)

您可能还要检查的另一件事是Application.ScreenUpdating的状态。 随着Office 2013及更高版本的发布,引入了SDI(单个文档接口)。如果Application.ScreenUpdating为False并且工作簿未处于活动状态,则对Workbook.Activate的隐式调用将失败。检查ScreenUpdating的状态,并根据需要将其设置为True。您可以在对该工作簿进行第一次“激活”调用后将其设置回False。 看到这篇文章: docs

答案 3 :(得分:0)

在我的情况下,错误发生的原因是工作表已隐藏。 所以我检查我是否不使用隐藏的工作表。或者,您需要先取消隐藏工作表,然后才能尝试选择或激活工作表。

For Each sh In ThisWorkbook.Sheets
    If Left(sh.Name, 8) <> "Template" Then
        sh.Select
        sh.Range("A1").Select
    End If
Next