我想在不打开它的情况下处理位于另一个excel文件中的工作表。为此,我使用Excel.Application
对象而不是workbook
对象
我需要使用子程序trieTableau2Colonne(ByRef w As Worksheet, ByRef colonne1, ByRef colonne2)
当我提供任何工作表(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")
答案 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)