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