Vba 设置范围时发生未知运行时错误
这是一个较大程序的子程序(如果需要,我可以复制并粘贴整个程序)。我得到了一个未知的运行时错误,我一辈子都不知道为什么。我花了几个小时感到沮丧,决定向你们寻求帮助 快速编辑:我试图找到一个特定的列标题,然后选择整个列(减去标题)作为范围Vba 设置范围时发生未知运行时错误,vba,excel,vbscript,Vba,Excel,Vbscript,这是一个较大程序的子程序(如果需要,我可以复制并粘贴整个程序)。我得到了一个未知的运行时错误,我一辈子都不知道为什么。我花了几个小时感到沮丧,决定向你们寻求帮助 快速编辑:我试图找到一个特定的列标题,然后选择整个列(减去标题)作为范围 Sub YearSmash(MyString) With objSheetSrc Set FoundCell = .Range("A1:BZ1").Find(MyString, , , 1) If FoundCell Is
Sub YearSmash(MyString)
With objSheetSrc
Set FoundCell = .Range("A1:BZ1").Find(MyString, , , 1)
If FoundCell Is Nothing Then
Exit Sub
End If
MsgBox(FoundCell)
Set rng1 = .Range(FoundCell.Offset(1), FoundCell.Offset(1).End(xlDown))
MsgBox(rng1)
End With
End Sub
以下行出现错误:
Set rng1 = .Range(FoundCell.Offset(1), FoundCell.Offset(1).End(xlDown))
有什么想法吗?此外,我试图提取的数据中没有无效值、错误或空值
谢谢
安德鲁
编辑以显示完整的代码:
Const xlFilterCopy = 2
strPathSrc = "C:\test" ' Source files folder
strMaskSrc = "*.xlsx" ' Source files filter mask
dtmDate = Date
strMonth = Month(Date)
strDay = Day(Date)
strYear = Right(Year(Date), 2)
strFileName = "C:\test\Results\" & strMonth & "-" & StrDay & "-" & strYear & " Results.xlsx"
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
Set objWorkbook = objExcel.Workbooks.Add()
objWorkbook.SaveAs(strFileName)
objExcel.Quit
'strPathDst = "C:\test\Results\Results.xlsx" ' Destination file
strPathDst = strFileName
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
Set objWorkBookDst = objExcel.Workbooks.Open(strPathDst)
Set objShellApp = CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace(strPathSrc)
Set objItems = objFolder.Items()
objItems.Filter 64 + 128, strMaskSrc
objExcel.DisplayAlerts = False
x = 1
y = 1
MsgBox("Working")
For Each objItem In objItems
Set objWorkBookSrc = objExcel.Workbooks.Open(objItem.Path)
Set objSheetSrc = objWorkBookSrc.Sheets(1)
Set objSheetDst = objWorkBookDst.Sheets(1)
For Each Cell In objSheetSrc.Range("A1:Z15")
If Cell.MergeCells = True Then
Set objRange = Cell.EntireRow
objRange.Delete
End If
Next
'Set FoundCell = objSheetSrc.Range("A1:BZ1").Find("Device", , , 1)
'For Each Cell In objSheetSrc.Range(FoundCell.Offset(1,0), objSheetSrc.Cells(objSheetSrc.Rows.Count, FoundCell.Column).End(-4162)).Cells
'If Cell.Value <> "*MSP430*" Then
' Cell.EntireRow.Delete
'End If
'Next
Set objSheetDst = objWorkBookDst.Sheets(1)
Call FindCell("Sales Region")
Call FindCell("Sales Area")
Call FindCell("TSR Role")
Call FindCell("My Account")
Call FindCell("Account Class")
Call FindCell("Project Name")
Call FindCell("Device")
Call FindCell("AUP")
Call FindCell("Qty Per Board")
Call FindCell("Device Status")
Call FindCell("Project Status")
Call FindCell("Project Kickoff")
Call FindCell("Market")
Call FindCell("SBE")
Call FindCell("SBE-1")
Call FindCell("SBE-2")
Call FindCell("2013 Q1")
Call FindCell("2013 Q2")
Call FindCell("2013 Q3")
Call FindCell("2013 Q4")
Call FindCell("2014 Q1")
Call FindCell("2014 Q2")
Call FindCell("2014 Q3")
Call FindCell("2014 Q4")
Call FindCell("2015 Q1")
Call FindCell("2015 Q2")
Call FindCell("2015 Q3")
Call FindCell("2015 Q4")
Call FindCell("2016")
Call YearSmash("2016 Q1")
Call FindCell("2016 Q1")
Call FindCell("2017")
Call FindCell("2018")
objWorkBookSrc.Close
Next
objExcel.Visible = True
Sub FindCell(MyString)
Do While objSheetDst.Cells(x, y).Value <> ""
y = y + 1
Loop
If MyString = "Sales Region" And y > 2 Then
y = 1
Do While objSheetDst.Cells(x, y).Value <> ""
x = x + 1
Loop
End If
Set FoundCell = objSheetSrc.Range("A1:BZ1").Find(MyString, , , 1)
If FoundCell Is Nothing Then
Exit Sub
End If
Set objRangeSrc = FoundCell.EntireColumn
objRangeSrc.AdvancedFilter xlFilterCopy, , objSheetDst.Cells(x, y), False
End Sub
Sub YearSmash(MyString)
With objSheetSrc
Set FoundCell = .Range("A1:BZ1").Find(MyString, , , 1)
If FoundCell Is Nothing Then Exit Sub
Set lRow = .Cells(.Rows.Count, FoundCell.Column).End(xlUp).Row
Set rng1 = .Range(.Cells(FoundCell.Row + 1, FoundCell.Column), .Cells(lRow, FoundCell.Column))
MsgBox rng1.Address
End With
End Sub
Const xlFilterCopy=2
strPathSrc=“C:\test”'源文件文件夹
strMaskSrc=“*.xlsx””源文件筛选器掩码
dtmDate=日期
strMonth=月(日)
标准日=天(日期)
strYear=右侧(年份(日期),2)
strFileName=“C:\test\Results\”&strMonth&“-”&StrDay&“-”&strYear&“Results.xlsx”
设置objExcel=CreateObject(“Excel.Application”)
objExcel.Visible=False
设置objWorkbook=objExcel.Workbooks.Add()
objWorkbook.SaveAs(strFileName)
退出
'strPathDst=“C:\test\Results\Results.xlsx”'目标文件
strPathDst=strFileName
设置objExcel=CreateObject(“Excel.Application”)
objExcel.Visible=False
设置objWorkBookDst=objExcel.Workbooks.Open(strPathDst)
设置objShellApp=CreateObject(“Shell.Application”)
设置objFolder=objShellApp.NameSpace(strPathSrc)
设置objItems=objFolder.Items()
objItems.Filter 64+128,strMaskSrc
objExcel.DisplayAlerts=False
x=1
y=1
MsgBox(“工作”)
对于objItems中的每个objItem
设置objWorkBookSrc=objExcel.Workbooks.Open(objItem.Path)
设置objSheetSrc=objWorkBookSrc.Sheets(1)
设置objSheetDst=objWorkBookDst.Sheets(1)
对于objSheetSrc.范围(“A1:Z15”)中的每个单元格
如果Cell.MergeCells=True,则
设置objRange=Cell.EntireRow
objRange.Delete
如果结束
下一个
'Set FoundCell=objSheetSrc.Range(“A1:BZ1”).Find(“设备”,.1)
'对于objSheetSrc.Range(FoundCell.Offset(1,0)、objSheetSrc.Cells(objSheetSrc.Rows.Count、FoundCell.Column.End(-4162)).Cells中的每个单元格
'如果Cell.Value“*MSP430*”则
'Cell.EntireRow.Delete
"完"
”“接着呢
设置objSheetDst=objWorkBookDst.Sheets(1)
致电FindCell(“销售区域”)
致电FindCell(“销售区域”)
呼叫FindCell(“TSR角色”)
致电FindCell(“我的账户”)
调用FindCell(“帐户类”)
调用FindCell(“项目名称”)
呼叫FindCell(“设备”)
呼叫FindCell(“AUP”)
调用FindCell(“每个板的数量”)
呼叫FindCell(“设备状态”)
呼叫FindCell(“项目状态”)
呼叫FindCell(“项目启动”)
呼叫FindCell(“市场”)
呼叫FindCell(“SBE”)
呼叫FindCell(“SBE-1”)
呼叫FindCell(“SBE-2”)
呼叫FindCell(“2013年第一季度”)
致电FindCell(“2013年第二季度”)
致电FindCell(“2013年第三季度”)
呼叫FindCell(“2013年第4季度”)
致电FindCell(“2014年第一季度”)
致电FindCell(“2014年第二季度”)
致电FindCell(“2014年第三季度”)
致电FindCell(“2014年第四季度”)
呼叫FindCell(“2015年第一季度”)
致电FindCell(“2015年第二季度”)
致电FindCell(“2015年第三季度”)
致电FindCell(“2015年第四季度”)
呼叫FindCell(“2016”)
电话年审(“2016年第一季度”)
致电FindCell(“2016年第一季度”)
呼叫FindCell(“2017”)
呼叫FindCell(“2018”)
objWorkBookSrc.关闭
下一个
objExcel.Visible=True
子FindCell(MyString)
Do While objSheetDst.Cells(x,y).Value“”
y=y+1
环
如果MyString=“Sales Region”和y>2,则
y=1
Do While objSheetDst.Cells(x,y).Value“”
x=x+1
环
如果结束
Set FoundCell=objSheetSrc.Range(“A1:BZ1”).Find(MyString,,1)
如果FoundCell什么都不是
出口接头
如果结束
设置objRangeSrc=FoundCell.EntireColumn
objRangeSrc.AdvancedFilter xlFilterCopy,objSheetDst.Cells(x,y),False
端接头
次年扣杀(MyString)
使用objSheetSrc
Set FoundCell=.Range(“A1:BZ1”).Find(MyString,,1)
如果FoundCell为Nothing,则退出Sub
设置lRow=.Cells(.Rows.Count,FoundCell.Column).End(xlUp).Row
设置rng1=.Range(.Cells(FoundCell.Row+1,FoundCell.Column),.Cells(lRow,FoundCell.Column))
MsgBox rng1.地址
以
端接头
这就是您要尝试的吗
Sub YearSmash(MyString)
Dim objSheetSrc As Worksheet
Dim lRow As Long
Dim FoundCell As Range, rng1 As Range
Dim MyString As String
'~~> Change as applicable
Set objSheetSrc = ThisWorkbook.Sheets("Sheet1")
With objSheetSrc
Set FoundCell = .Range("A1:BZ1").Find(MyString, , , 1)
If FoundCell Is Nothing Then Exit Sub
'~~> Find the last row in that column
lRow = .Cells(.Rows.Count, FoundCell.Column).End(xlUp).Row
'~~> Construct your range from one cell offset
Set rng1 = .Range(.Cells(FoundCell.Row + 1, FoundCell.Column), _
.Cells(lRow, FoundCell.Column))
MsgBox rng1.Address
End With
End Sub
评论的后续行动
我在vbscript中测试了它,它工作得非常好
Dim oXLApp, olXLWb, objSheetSrc
Dim MyString, lRow, FoundCell, rng1
Set oXLApp = CreateObject("Excel.Application")
oXLApp.Visible = True
'~~> Sample File
Set olXLWb = oXLApp.Workbooks.Open("C:\Sample.xlsx")
'~~> Change as applicable
Set objSheetSrc = olXLWb.Sheets("Sheet1")
'~~> Sample String
MyString = "Sid"
With objSheetSrc
Set FoundCell = .Range("A1:BZ1").Find(MyString, , , 1)
If Not FoundCell Is Nothing Then
'~~> Find the last row in that column
lRow = .Cells(.Rows.Count, FoundCell.Column).End(-4162).Row
'~~> Construct your range from one cell offset
Set rng1 = .Range(.Cells(FoundCell.Row + 1, FoundCell.Column), _
.Cells(lRow, FoundCell.Column))
MsgBox rng1.Address
End If
End With
悉达思,感谢你的迅速回复。从你的代码来看,这看起来就像我要做的。。。不幸的是,它仍然向我抛出一个未知的运行时错误。lRow=.Cells(.Rows.Count,FoundCell.Column)。End(xlUp)。Row给出了错误。就像我说的,这个子程序是作为一个更大的子程序的一部分调用的,如果你需要我发布完整的代码,请告诉我!是的,这会有帮助,因为该行不应给出错误,因为对象是完全合格的。您是在VBSCRIPT中执行此操作的吗?如果是,则将行
lRow=.Cells(.Rows.Count,FoundCell.Column).End(xlUp).Row
更改为lRow=.Cells(.Rows.Count,FoundCell.Column).End(-4162)。Row
是Excel常量。这修复了未知错误问题。现在我遇到了另一个我以前遇到过的类似问题。同一行现在给出了错误“objectrequired”。我记得早些时候,当我试图使用.Row或.Column时,我收到了这些错误。