我正在编写一个宏,该宏将用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。
答案 0 :(得分:1)
通过引用Excel对象模型,您可以访问该对象模型中定义的某些全局对象。
VBA以此顺序解析标识符:
因此,当您调用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