Excel 方法';范围';对象的'_全球';第二次运行时失败

Excel 方法';范围';对象的'_全球';第二次运行时失败,excel,ms-access,vba,Excel,Ms Access,Vba,我对错误有问题: 对象“U全局”的方法“范围”失败 。。。第二次运行时,在代码段上 整个程序是通过access查询从SQL数据库导出信息,并创建源表,然后将其导出到excel电子表格,源表包含来自14个不同位置的信息。因此,excel电子表格创建了14次(最终通过电子邮件发送给14个不同的人) 为了测试代码,我将其放在Do While循环中,以模拟必须多次运行的代码,几十年来我没有做过任何编程,因此我非常生疏,失败的代码部分是: .Cells.EntireRow.EntireColumn.Sor

我对错误有问题:

对象“U全局”的方法“范围”失败

。。。第二次运行时,在代码段上

整个程序是通过access查询从SQL数据库导出信息,并创建源表,然后将其导出到excel电子表格,源表包含来自14个不同位置的信息。因此,excel电子表格创建了14次(最终通过电子邮件发送给14个不同的人)

为了测试代码,我将其放在Do While循环中,以模拟必须多次运行的代码,几十年来我没有做过任何编程,因此我非常生疏,失败的代码部分是:

.Cells.EntireRow.EntireColumn.Sort key1:=Range("G2"), order1:=xlDescending, Header:=xlYes
完整代码:

Private Function Open_Excel_Spreadsheet()

    Dim Cnt As Integer 'Counter
    Cnt = 1

    Do While Cnt < 4

        Dim oExcel      As Excel.Application
        Dim oBook       As Excel.Workbook
        Dim oSheet      As Excel.Worksheet
        Dim LastRow     As Long
        Dim FirstNewRow As Long
        Dim i As Integer 'Row counter in the range of 2 to FirstNewRow
        i = 2

        Set oExcel = CreateObject("Excel.Application")
        Set oBook = oExcel.Workbooks.Open([MyDocsPath], , ReadOnly:=False)
        Set oSheet = oBook.Worksheets(1)

        oExcel.Visible = True

        'Find the last used row in Column A and set LastRow and FirstNewRow variables
        With oSheet
            LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        End With
        FirstNewRow = LastRow + 1

        Debug.Print Cnt; FirstNewRow

        'Format the Spreadsheet
        With oSheet
            .Sort.SortFields.Clear

            ' Next line generates "Method 'Range' of Object'_Global' Failed" the second time it runs
            .Cells.EntireRow.EntireColumn.Sort key1:=Range("G2"), order1:=xlDescending, Header:=xlYes

            .Cells(FirstNewRow, 5) = "=sum(E2:E" & [LastRow] & ")"
            .Cells(FirstNewRow, 6) = "=sum(F2:F" & [LastRow] & ")"
            For i = 2 To FirstNewRow
                .Cells(i, 7) = "=IF(+E" & [i] & "=0,0,Round(((+E" & [i] & "-F" & [i] & ")/E" & [i] & ")*100,2))"
            Next i
            .Range("E1:G1").EntireColumn.NumberFormat = "#,##0.00_);[Red]-#,##0.00"
            .Range("a1").EntireRow.EntireColumn.AutoFit
        End With

        'Save Workbook and drop Excel
        oBook.Close True

    Cnt = Cnt + 1
    Loop

End Function
Private Function Open\u Excel\u电子表格()
作为“整数”计数器的Dim Cnt
Cnt=1
当Cnt<4时,溶解氧
Dim oExcel作为Excel.Application
将oBook设置为Excel.Workbook
将oSheet设置为Excel.工作表
最后一排一样长
第一个纽罗河一样长
Dim i作为整数的行计数器,范围为2到FirstNewRow
i=2
设置oExcel=CreateObject(“Excel.Application”)
设置oBook=oExcel.Workbooks.Open([MyDocsPath],只读:=False)
设置oSheet=oBook.工作表(1)
oExcel.Visible=True
'在列A中查找最后使用的行,并设置LastRow和FirstNewRow变量
与奥希特
LastRow=.Cells(.Rows.Count,“A”).End(xlUp).Row
以
FirstNewRow=LastRow+1
调试。打印Cnt;第一纽罗
'格式化电子表格
与奥希特
.Sort.SortFields.Clear
“下一行在第二次运行时生成对象的“方法”“范围”“全局”“失败”
.Cells.EntireRow.EntireClumn.Sort键1:=范围(“G2”),顺序1:=xlDescending,标题:=xlYes
.Cells(FirstNewRow,5)=“=总和(E2:E”&[LastRow]&”)
.Cells(FirstNewRow,6)=“=sum(F2:F“&[LastRow]”
对于i=2到FirstNewRow
。单元格(i,7)=“=IF(+E“&[i]&”=0,0,圆形(((((+E“&[i]&)-F“&[i]&”)/E“&[i]&”)*100,2))”
接下来我
.Range(“E1:G1”).EntireColumn.NumberFormat=“#,##0.00#,[Red]-#,##0.00”
.范围(“a1”).EntireRow.EntireClumn.AutoFit
以
'保存工作簿并删除Excel
好的,接近真值
Cnt=Cnt+1
环
端函数
就其所处位置而言,
范围(“G2”)
可能指也可能不指工作表上的G2单元格。唯一可以确定的是,它指的是工作表上当前保存数据的G2单元格

试试看

.Cells.EntireRow.EntireColumn.Sort key1:=.Range("G2"), order1:=xlDescending, Header:=xlYes
注意
.Range(“G2”)
而不是
Range(“G2”)
。这明确地引用了工作表上的G2,在它所在的位置上,
范围(“G2”)
可能是也可能不是指oSheet工作表上的G2单元格。唯一可以确定的是,它指的是工作表上当前保存数据的G2单元格

试试看

.Cells.EntireRow.EntireColumn.Sort key1:=.Range("G2"), order1:=xlDescending, Header:=xlYes
注意
.Range(“G2”)
而不是
Range(“G2”)
。这将显式引用工作表上的G2,并使用