Vba 我第一次运行Subscip时它超出了范围,但没有';不要在下次运行时给出错误
我在第行中遇到“下标超出范围”错误:Vba 我第一次运行Subscip时它超出了范围,但没有';不要在下次运行时给出错误,vba,excel,Vba,Excel,我在第行中遇到“下标超出范围”错误: Set DataSheet = Worksheets(DataSheetName) 这只在我第一次运行它时发生。如果我在出错后重新运行代码,宏可以正常工作 完整代码: Sub iGetData() Dim ValidatorWB As Workbook Dim PopDetail As Worksheet Dim DataSheetName As String Dim DataWB As Workbook Dim DataSheet As Workshe
Set DataSheet = Worksheets(DataSheetName)
这只在我第一次运行它时发生。如果我在出错后重新运行代码,宏可以正常工作
完整代码:
Sub iGetData()
Dim ValidatorWB As Workbook
Dim PopDetail As Worksheet
Dim DataSheetName As String
Dim DataWB As Workbook
Dim DataSheet As Worksheet
Dim Ret
Dim DWBName As String
Dim FNOrder As String
Dim FNOrdCol As String
Set PopDetail = Worksheets("PopulateWireframe")
Set ValidatorWB = Workbooks(ActiveWorkbook.Name)
DataSheetName = Range("F18").Value
FNOrder = Range("F33").Value
Application.ScreenUpdating = False
'Open data file
Ret = IsWorkBookOpen(PopDetail.Range("C18").Value)
If Ret = False Then
Workbooks.Open PopDetail.Range("C18").Value
DataFileName = ActiveWorkbook.Name
Set DataWB = Workbooks(DataFileName)
Set DataSheet = Worksheets(DataSheetName)
Dim FilterColumn As String
Dim FilterCriteria As String
Dim ColumnNumber As Integer
'Set filter
With DataSheet
If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
ActiveSheet.ShowAllData
End If
End With
ValidatorWB.Activate
PopDetail.Activate
For x = 21 To 30
If Range("E" & x).Value <> "" And Range("F" & x).Value <> "" Then
FilterColumn = PopDetail.Range("E" & x).Value
FilterCriteria = PopDetail.Range("F" & x).Value
DataWB.Activate
DataSheet.Activate
DataSheet.Range("A1").Select
Selection.End(xlToLeft).Select
ActiveCell.Rows("1:1").EntireRow.Select
Selection.Find(What:=FilterColumn, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
ColumnNumber = ActiveCell.Column
DataSheet.AutoFilterMode = False
DataSheet.Range("A1").AutoFilter Field:=ColumnNumber, Criteria1:=FilterCriteria
End If
ValidatorWB.Activate
PopDetail.Activate
'x = x + 1
Next x
DataWB.Activate
DataSheet.Activate
'Alpahebtical order
DataSheet.Range("A1").Select
ActiveCell.Rows("1:1").EntireRow.Select
Selection.Find(What:=FNOrder, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
FNOrdCol = ActiveCell.Address
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add Key:=Range(FNOrdCol), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveSheet.Sort
.SetRange DataSheet.Cells
.header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Copy data
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
'Paste data to validator
ValidatorWB.Activate
ValidatorWB.Sheets.Add().Name = "ValidatorData"
ActiveCell.Offset(3, 0).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
ActiveCell.Columns("A:A").EntireColumn.ColumnWidth = 15
Application.CutCopyMode = False
'DataWB.Close savechanges:=False
If DataWB.Windows(1).Visible = True Then
DataWB.Windows(1).Visible = False
End If
Application.ScreenUpdating = True
PopDetail.Activate
Else
DWBName = GetFilenameFromPath(PopDetail.Range("C18").Value)
Set DataWB = Workbooks(DWBName)
DataWB.Activate
Set DataSheet = Worksheets(DataSheetName)
DataSheet.Activate
With DataSheet
If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
ActiveSheet.ShowAllData
End If
End With
ValidatorWB.Activate
PopDetail.Activate
For x = 21 To 30
If Range("E" & x).Value <> "" And Range("F" & x).Value <> "" Then
FilterColumn = PopDetail.Range("E" & x).Value
FilterCriteria = PopDetail.Range("F" & x).Value
DataWB.Activate
DataSheet.Activate
DataSheet.Range("A1").Select
Selection.End(xlToLeft).Select
ActiveCell.Rows("1:1").EntireRow.Select
Selection.Find(What:=FilterColumn, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
ColumnNumber = ActiveCell.Column
DataSheet.AutoFilterMode = False
DataSheet.Range("A1").AutoFilter Field:=ColumnNumber, Criteria1:=FilterCriteria
End If
ValidatorWB.Activate
PopDetail.Activate
'x = x + 1
Next x
DataWB.Activate
DataSheet.Activate
'Alpahebtical order
DataSheet.Range("A1").Select
ActiveCell.Rows("1:1").EntireRow.Select
Selection.Find(What:=FNOrder, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
FNOrdCol = ActiveCell.Address
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add Key:=Range(FNOrdCol), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveSheet.Sort
.SetRange DataSheet.Cells
.header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Copy data
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
'Paste data to validator
ValidatorWB.Activate
ValidatorWB.Sheets.Add().Name = "ValidatorData"
ActiveCell.Offset(3, 0).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
ActiveCell.Columns("A:A").EntireColumn.ColumnWidth = 15
Application.CutCopyMode = False
'DataWB.Close savechanges:=False
If DataWB.Windows(1).Visible = True Then
DataWB.Windows(1).Visible = False
End If
Application.ScreenUpdating = True
PopDetail.Activate
End If
End Sub
子iGetData()
将WB作为工作簿
将详细信息设置为工作表
Dim数据表名称为字符串
Dim DataWB作为工作簿
将数据表设置为工作表
暗网
作为字符串的Dim DWBName
按字符串的顺序排列
作为字符串的Dim FNOrdCol
设置PopDetail=工作表(“PopulateWireframe”)
Set ValidatorWB=工作簿(ActiveWorkbook.Name)
数据表名称=范围(“F18”).值
FNOrder=范围(“F33”)。值
Application.ScreenUpdating=False
'打开数据文件
Ret=IsWorkBookOpen(PopDetail.Range(“C18”).Value)
如果Ret=False,则
工作簿.打开PopDetail.Range(“C18”).值
DataFileName=ActiveWorkbook.Name
Set DataWB=工作簿(DataFileName)
设置数据表=工作表(数据表名称)
Dim FilterColumn作为字符串
作为字符串的Dim FilterCriteria
将列数设置为整数
'设置过滤器
带数据表
如果是(ActiveSheet.AutoFilterMode和ActiveSheet.FilterMode)或ActiveSheet.FilterMode,则
ActiveSheet.ShowAllData
如果结束
以
激活
PopDetail,激活
对于x=21到30
如果范围(“E”&x).Value”和范围(“F”&x).Value”则
FilterColumn=PopDetail.Range(“E”&x).值
FilterCriteria=PopDetail.Range(“F”&x).Value
DataWB.Activate
数据表。激活
数据表。范围(“A1”)。选择
选择。结束(xlToLeft)。选择
ActiveCell.Rows(“1:1”).EntireRow.Select
Selection.Find(What:=FilterColumn,After:=ActiveCell,LookIn:=xlValues_
LookAt:=xlother,SearchOrder:=xlByColumns,SearchDirection:=xlNext_
匹配案例:=False,搜索格式:=False)。激活
ColumnNumber=ActiveCell.Column
DataSheet.AutoFilterMode=False
数据表。范围(“A1”)。自动筛选字段:=列号,准则1:=筛选准则
如果结束
激活
PopDetail,激活
'x=x+1
下一个x
DataWB.Activate
数据表。激活
“阿尔帕赫伯秩序
数据表。范围(“A1”)。选择
ActiveCell.Rows(“1:1”).EntireRow.Select
Selection.Find(What:=FNOrder,After:=ActiveCell,LookIn:=xlValues_
LookAt:=xlother,SearchOrder:=xlByColumns,SearchDirection:=xlNext_
匹配案例:=False,搜索格式:=False)。激活
FNOrdCol=ActiveCell.Address
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add键:=范围(FNOrdCol)_
SortOn:=xlSortOnValues,顺序:=XLASSENDING,数据选项:=xlSortNormal
使用ActiveSheet.Sort
.SetRange数据表.单元格
.header=xlYes
.MatchCase=False
.方向=xlTopToBottom
.SortMethod=xl拼音
.申请
以
'复制数据
范围(“A1”)。选择
范围(选择,选择。结束(xlToRight))。选择
范围(选择,选择。结束(xlDown))。选择
选择,复制
'将数据粘贴到验证程序
激活
validator wb.Sheets.Add().Name=“validator数据”
ActiveCell.Offset(3,0)。范围(“A1”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=真
ActiveCell.Columns(“A:A”).EntireClumn.ColumnWidth=15
Application.CutCopyMode=False
'DataWB.Close savechanges:=False
如果DataWB.Windows(1).Visible=True,则
DataWB.Windows(1).Visible=False
如果结束
Application.ScreenUpdating=True
PopDetail,激活
其他的
DWBName=GetFilenameFromPath(PopDetail.Range(“C18”).Value)
Set DataWB=工作簿(DWBName)
DataWB.Activate
设置数据表=工作表(数据表名称)
数据表。激活
带数据表
如果是(ActiveSheet.AutoFilterMode和ActiveSheet.FilterMode)或ActiveSheet.FilterMode,则
ActiveSheet.ShowAllData
如果结束
以
激活
PopDetail,激活
对于x=21到30
如果范围(“E”&x).Value”和范围(“F”&x).Value”则
FilterColumn=PopDetail.Range(“E”&x).值
FilterCriteria=PopDetail.Range(“F”&x).Value
DataWB.Activate
数据表。激活
数据表。范围(“A1”)。选择
选择。结束(xlToLeft)。选择
ActiveCell.Rows(“1:1”).EntireRow.Select
Selection.Find(What:=FilterColumn,After:=ActiveCell,LookIn:=xlValues_
LookAt:=xlother,SearchOrder:=xlByColumns,SearchDirection:=xlNext_
匹配案例:=False,搜索格式:=False)。激活
ColumnNumber=ActiveCell.Column
DataSheet.AutoFilterMode=False
数据表。范围(“A1”)。自动筛选字段:=列号,准则1:=筛选准则
如果结束
激活
PopDetail,激活
'x=x+1
下一个x
DataWB.Activate
数据表。激活
“阿尔帕赫伯秩序
数据表。范围(“A1”)。选择
ActiveCell.Rows(“1:1”).EntireRow.Select
Selection.Find(What:=FNOrder,After:=ActiveCell,LookIn:=xlValues_
LookAt:=xlother,SearchOrder:=xlByColumns,SearchDirection:=xlNext_
匹配案例:=False,搜索格式:=False)。激活
FNOrdCol=ActiveCell.Address
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add键:=范围(FNOrdCol)_
SortOn:=xlSortOnValues,顺序:=XLASSENDING,数据选项:=xlSortNormal
使用ActiveSheet.Sort
.SetRange数据表.单元格
.header=xlYes
.MatchCase=False
.方向=xlTopToBottom
.SortMethod=xl拼音
.申请
以
'复制数据
范围(“A1”)。选择
范围(选择,选择。结束(xlToRight))。选择
范围(选择,选择。结束(xlDown))。选择
选择,复制
'将数据粘贴到验证程序
激活
validator wb.Sheets.Add().Name=“validator数据”
ActiveCell.Offset(3,0)。范围(“A1”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=真
ActiveCell.Columns(“A:A”).EntireClumn.ColumnWidth=15
Application.CutCopyMode=False
'DataWB.Close savechanges:=False
如果DataWB.Windows(1).Visible=True,则
DataWB.Windows(1).Visible=False
如果结束
应用程序.Scre
Workbooks.Open PopDetail.Range("C18").Value
DataFileName = GetFilenameFromPath(PopDetail.Range("C18").Value)
Set DataWB = Workbooks(DataFileName)
DataWB.Activate
Set DataSheet = Worksheets(DataSheetName)
Workbooks.Open PopDetail.Range("C18").Value
DataFileName = ActiveWorkbook.Name
Set DataWB = Workbooks(DataFileName)
Set DataSheet = Worksheets(DataSheetName)
Function GetFilenameFromPath(ByVal strPath As String) As String
' Returns the rightmost characters of a string upto but not including the rightmost '\'
' e.g. 'c:\winnt\win.ini' returns 'win.ini'
If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then
GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
End If
End Function