vba - 使用位于已关闭工作簿中的工作表时出错

时间:2016-05-27 13:26:23

标签: vba excel-vba excel

我想在不打开它的情况下处理位于另一个excel文件中的工作表。为此,我使用Excel.Application对象而不是workbook对象

我需要使用子程序trieTableau2Colonne(ByRef w As Worksheet, ByRef colonne1, ByRef colonne2)

将该工作表排序为2列

当我提供任何工作表(ActiveWorkbook.Worksheets,或工作表在使用工作簿对象声明的打开工作簿中)时,它工作正常。但是,当我使用Excel.Application对象处理已关闭的工作簿时,它不起作用。

错误与SortFields方法的Add对象有关。 下面,您可以看到我编写的子程序,主程序以及显示错误的屏幕截图。

trieTableau2Colonne程序(w.Sort.SortFields.Add)的第二行发生错误。我在w变量中放了一个间谍来看看里面有什么。

在第二个屏幕截图中,我们可以看到我使用的两个工作表之间的区别。

  • ws_cible是从workbook对象

    获取的工作表对象
    Dim ws_cible As Worksheet
    
    Set ws_cible = ThisWorkbook.Worksheets("Liste Réclas")
    

    - >我们可以读到它的类型是Worksheet / Feuil1

  • w是worksheet个对象,但是从Excel.Application对象而不是workbook对象获取

    Dim wb_src As Excel.Application
    Set wb_src = CreateObject("Excel.Application")
    
    Set ws_src = wb_src.Worksheets("Sheet1")
    

    - >我们可以读到它的类型是Worksheet / Worksheet

我确信问题来自于这种差异,但我没有看到每个对象的属性或方法有任何差异。

Sub trieTableau2Colonne(ByRef w As Worksheet, ByRef colonne1, ByRef colonne2)

  w.Sort.SortFields.Clear
  w.Sort.SortFields.Add Key:=Range((colonne1 & ":" & colonne1)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
  w.Sort.SortFields.Add Key:=Range( _
    (colonne2 & ":" & colonne2)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
  With w.Sort
    .SetRange Range("A:AZ")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With
End Sub

' main program'


    Dim ws_src As Worksheet
    Dim wb_src As Excel.Application
    Set wb_src = CreateObject("Excel.Application")
    ChDir Workbooks(ActiveWorkbook.Name).Path
    stfile = Application.GetOpenFilename

    If stfile = False Then
        Exit Sub
    End If
    With wb_src
        .Workbooks.Open (stfile)
        .Visible = False
    End With
    Set ws_src = wb_src.Worksheets("Sheet1")
    'MsgBox (ws_src.Cells(1, 1).Value)
    Call trieTableau2Colonne(ws_src, "E", "B")

IDE窗口截图

error occured and spy

变量观察窗口截图

spy

2 个答案:

答案 0 :(得分:0)

在此代码中,您在打开工作簿之前引用Worksheet。您无法从Worksheet获得Excel.Application。您从Worksheet对象获得Workbook

Dim wb_src As Excel.Application
Set wb_src = CreateObject("Excel.Application")

Set ws_src = wb_src.Worksheets("Sheet1")

尝试在引用工作表之前添加wb_src.Workbooks.Open()wb_src.Workbooks.Add()

答案 1 :(得分:0)

感谢您的回答。

事实上,在我的主程序中,我已经很好地打开了工作簿

With wb_src
  .Workbooks.Open (stfile)
  .Visible = False
End With

我可以看到我通过使用msgbox检查内部单元格的内容来正确访问该文件,并且它运行良好:

MsgBox (ws_src.Cells(1, 1).Value)