从单词vba

时间:2018-07-06 15:15:14

标签: vba excel-vba word-vba excel

我正在编写一个宏,该宏将用word中来自活动x控件的用户输入来填充excel文件。除了在尝试在工作簿中要使用的工作表中选择单元格A1时不断收到错误消息外,我几乎可以完成所有工作。这是代码:

    Workbooks.Open ("mypath\myfile.xlsm")
    Workbooks("myfile.xlsm").Activate
    Worksheets("sheet1").Select
    Range("A1").Select
    Do Until (IsEmpty(ActiveCell.Value))
    ActiveCell.Offset(1, 0).Select
    Loop
    ActiveCell.Value = n
    ActiveCell.Offset(0, 1).Value = a
    ActiveCell.Offset(0, 2).Value = b
    ActiveCell.Offset(0, 3).Value = c
    Columns("D:D").EntireColumn.AutoFit
    Columns("A:A").EntireColumn.AutoFit
    Columns("B:B").EntireColumn.AutoFit
    Columns("C:C").EntireColumn.AutoFit
    Workbooks("myfile.xlsm").Save
    Workbooks("myfile.xlsm").Close

此代码块中的变量是活动x控件的值,并且位于子控件的更远位置。此代码块是sub中if语句的一小部分。无论如何,当我从代码中选择Range(“ A2”)。Select时,除了我要输入的信息没有到达正确的位置(因为它没有选择范围A1)之外,它都可以正常工作首先)。

我得到的错误是类型不匹配4218。

3 个答案:

答案 0 :(得分:1)

通过引用Excel对象模型,您可以访问该对象模型中定义的某些全局对象。

VBA以此顺序解析标识符:

  1. 当前程序
  2. 当前模块
  3. 当前项目
  4. VBA标准库
  5. 主机应用程序对象模型
  6. 任何其他引用的库,按照它们在引用对话框中出现的顺序

因此,当您调用Range意味着要对Excel对象模型进行调用时,您实际上会调用Word对象模型中定义的同名Range全局成员。

请注意,我说的是成员,其意思是:这些是对Global.Range的不合格的成员调用。这很重要,因为 member 表示 object ,并且Excel对象模型中的所有内容(Word也是如此)都具有Application属性,如果如果没有确切说明所指的是什么,则可能是在隐式创建Excel.Application对象,以致无法正确清理。宏完成运行后,这通常会转化为任务管理器中徘徊的“幽灵” EXCEL.EXE进程。

诀窍是使该引用显式,并显式限制其寿命-With块非常适合:

With New Excel.Application
    With .Workbooks.Open(path)
        With .Worksheets("Sheet1")
            lRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            .Cells(lRow, 1) = n
            .Cells(lRow, 2) = a
            .Cells(lRow, 3) = b
            .Cells(lRow, 4) = c
            .Columns("A:D").EntireColumn.AutoFit
        End With
        .Save
        .Close
    End With
    .Close
End With

答案 1 :(得分:0)

我猜是因为我通常不从Word运行Excel,但是我认为问题可能与从Word中获得的所有不合格有关。

如果Workbooks.Open在工作,那么我们可以将与此工作簿相关的所有内容挂在上面。

请尝试以下代码:

Dim myWkBk As Workbook, lRow As Long

Set myWkBk = Excel.Application.Workbooks.Open("mypath\myfile.xlsm")
With myWkBk.Sheets("sheet1")
    lRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
    .Cells(lRow, 1) = n
    .Cells(lRow, 2) = a
    .Cells(lRow, 3) = b
    .Cells(lRow, 4) = c
    .Columns("A:D").EntireColumn.AutoFit
End With
myWkBk.Save
myWkBk.Close

答案 2 :(得分:0)

我知道了。 @Cindy Meister我只需要添加一个ActiveSheet。麻烦线上的预选赛:

    Workbooks.Open ("H:\Second Rotation\OBI project\answersUsers.xlsm")
    Workbooks("answersUsers.xlsm").Activate
    Sheets("Answers Users").Select
    ActiveSheet.Range("A1").Select
    Do Until (IsEmpty(ActiveCell.Value))
    ActiveCell.Offset(1, 0).Select
    Loop
    ActiveCell.Value = n
    ActiveCell.Offset(0, 1).Value = cwid
    ActiveCell.Offset(0, 2).Value = mann
    ActiveCell.Offset(0, 3).Value = dept
    Columns("A:D").EntireColumn.AutoFit
    Workbooks("answersUsers.xlsm").Save
    Workbooks("answersUsers.xlsm").Close
    Dim myWkBk As Workbook, lRow As Long