MS Word VBA:从Word控制excel工作簿-需要对象错误
我正在用MS Word创建一个宏,它需要能够(基本上)将Word中表格的内容复制并粘贴到excel中 免责声明:这似乎过于复杂;然而,这种方法是必需的,因为它是一种用于更复杂处理的设置 长话短说,我循环遍历文档中的每个表,然后遍历表中的每个单元格,并将文本放入excel工作表中相应的单元格中 我对excel对象有以下声明:MS Word VBA:从Word控制excel工作簿-需要对象错误,vba,excel,ms-word,Vba,Excel,Ms Word,我正在用MS Word创建一个宏,它需要能够(基本上)将Word中表格的内容复制并粘贴到excel中 免责声明:这似乎过于复杂;然而,这种方法是必需的,因为它是一种用于更复杂处理的设置 长话短说,我循环遍历文档中的每个表,然后遍历表中的每个单元格,并将文本放入excel工作表中相应的单元格中 我对excel对象有以下声明: 'Objects Dim xlApp As New Excel.Application Dim xlBook As Excel.Workbook Dim xlRange As
'Objects
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlRange As Excel.Range
在循环的底部,我有以下代码:
xlBook.Worksheets(x).Activate
Set xlRange = xlBook.ActiveSheet.Range(Chr(65 + x) & y)
xlRange.Text = tString
最后一行抛出“需要对象”错误。变量tstring被定义为字符串,并在循环的前面设置
完整代码:
Sub CopyTablesToExcel()
'Constants
Const COLUMN_INDEX = 1
Const ROW_INDEX = 2
'Ints
Dim x As Integer, y As Integer, z As Integer 'Counters
Dim numTables As Integer 'Number of tables in the word file
Dim numSheets As Integer 'Number of sheets in the excel file
Dim LastCell(1 To 2) As Integer 'Used to keep track of the last cell of a newly created excel table
Dim map() As Integer 'Holds a map of the table columns
'strings
Dim xlBookName As String 'Name of the excel workbook
Dim tString As String 'Temporary string
'Objects
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlRange As Excel.Range
'Initialize
Set xlBook = xlApp.Workbooks.Add
numSheets = xlBook.Worksheets.count
numTables = ActiveDocument.Tables.count
'Save the new book
xlBookName = InputBox("Enter the ticker symbol:")
xlBook.SaveAs FileName:=xlBookName
'Show the file?
xlApp.Visible = True
'Make sure there are enough sheets
If numSheets < numTables Then
For x = 1 To (numTables - numSheets)
xlBook.Worksheets.Add
numSheets = numSheets + 1
Next
End If
'Cycle through every table in the document and paste it to the worksheet
For z = 1 To numTables 'Cycle through tables
'Keep track of the last cell in the table
LastCell(COLUMN_INDEX) = ActiveDocument.Tables(z).Columns.count
LastCell(ROW_INDEX) = ActiveDocument.Tables(z).rows.count
For x = ActiveDocument.Tables(z).rows(ActiveDocument.Tables(z).rows.count).Cells.count To 1 Step -1 'Cycle through columns
'Used selections to support horizontally merged cells
ActiveDocument.Tables(z).rows(ActiveDocument.Tables(z).rows.count).Cells(x).Select
Selection.SelectColumn
For y = Selection.Cells.count To 1 Step -1 'Cycle through cells
tString = Selection.Cells(y).Range.Text
'Move the content into excel
xlBook.Worksheets(x).Activate
Set xlRange = xlBook.ActiveSheet.Range(Chr(65 + x) & y)
Debug.Print Chr(65 + x) & y 'Prints as expected
xlRange.Text = tString
Next
Next
Next
End Sub
上面的计算结果将为true,但仍会在标记行抛出错误我看到两件事:
.Text
是只读属性。我希望此行出现“无法设置范围对象的文本属性”错误:
xlRange.Text = tString
Set xlRange = xlBook.ActiveSheet.Range(Chr(65 + x) & y)
改为:
xlRange.Value = tString
此外,您的范围分配可能是错误的。我不知道你为什么要做CHR(65)
而不是简单的“A”,但问题是这一行:
xlRange.Text = tString
Set xlRange = xlBook.ActiveSheet.Range(Chr(65 + x) & y)
在这里,您要将x
添加到65
,然后Chr
函数返回任何可能导致错误的结果。如果x
的值大于25,则极有可能引发错误,因为Chr(65+x)
的计算结果不是有效的范围地址
由于您在评论中明确表示您确实打算这样做(例如,“A”+1=“B”等),因此最好这样做,如果没有其他原因,只是因为它看起来更清晰,并且以不那么模糊的方式利用Excel对象模型:
Set xlRange = xlBook.ActiveSheet.Range("A" & y).Offset(,x)
这肯定是个错误。我正在努力解释:)我已经将它更新为64,当我意识到+1总是“B”时。我们的最大值永远不会超过17,所以这不会是一个问题,但谢谢你的警告。使用value只更新了1个单元格的值,但我打赌这是我的错。我只是没有意识到excel不喜欢.text属性。谢谢,那么您打算在
chr
函数中添加整数。我会用另一个建议修改,但很高兴这对你有帮助!这是个好消息。我习惯C++,我们尽量尽可能多地做数学。如果我错了,请纠正我,但计算机通常更容易进行数学运算,而且开销也小得多。在VBA中,我的解决方案在技术上不是更有效吗?它可能更有效(我真的不知道它是否有效),但我以前从未见过在VBA中使用这种约定来定义范围。我倾向于不使用这种引用方式,因为它不常见(因此我认为大多数人不太容易解释),但也因为它在使用上非常有限——例如,除非你添加更多的逻辑,否则你不能用这种方法轻松引用范围“AG6”。你可以使用坐标,例如,范围(单元格(1,1).地址)
指的是单元格A1
。