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