我在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
我不知道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
上面的代码中有一些令人困惑的项目,所以我想把它们放在这里。让我们开始吧:
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
您还可以检查的另一件事是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
在我的情况下,错误来自工作表被隐藏。所以我检查一下我是不是在使用隐藏的工作表。或者,在尝试选择或激活工作表之前,您需要取消隐藏工作表。
For Each sh In ThisWorkbook.Sheets
If Left(sh.Name, 8) <> "Template" Then
sh.Select
sh.Range("A1").Select
End If
Next