Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS Word VBA:从Word控制excel工作簿-需要对象错误_Vba_Excel_Ms Word - Fatal编程技术网

MS Word VBA:从Word控制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

我正在用MS Word创建一个宏,它需要能够(基本上)将Word中表格的内容复制并粘贴到excel中

免责声明:这似乎过于复杂;然而,这种方法是必需的,因为它是一种用于更复杂处理的设置

长话短说,我循环遍历文档中的每个表,然后遍历表中的每个单元格,并将文本放入excel工作表中相应的单元格中

我对excel对象有以下声明:

'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