所需对象:Excel&;Word VBA、字典和存储范围
我需要帮助理解为什么我在Ln82上不断出现“需要对象”错误。我以为你可以在字典里储存任何东西 工作流程是:所需对象:Excel&;Word VBA、字典和存储范围,excel,vba,dictionary,ms-word,range,Excel,Vba,Dictionary,Ms Word,Range,我需要帮助理解为什么我在Ln82上不断出现“需要对象”错误。我以为你可以在字典里储存任何东西 工作流程是: 启动程序 创建临时项字典以循环输入框 稍后使用此词典将所有用户输入存储为范围 调用子例程打开目标文档(Mysupes) 调用子例程以打开源代码excel wb(警报) 提示用户12次(通过循环)在源excel中选择范围 粘贴到目标word文档中(此时我不在乎在哪里,我只需要粘贴该死的东西) 也请忽略任何评论,这只是我的白手起家的工作,我尝试了不同的途径 Sub AlertToSupes()
Sub AlertToSupes()
'Declarations
Dim MyAlert As String
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
'Dim key As Variant
Dim v As Long
Dim r As Variant
Dim Mysupes As Document
'Mysupes.Visible = True
'Dim AlertToSupeData As Object
Application.ScreenUpdating = True
'Collection of objects to get from Alert doc and paste into Supes
'Dim colSupesData As Collection
'Set colSupesData = New Collection
' colSupesData.Add "Project team names"
' colSupesData.Add "Programming"
' colSupesData.Add "Date(today)"
' colSupesData.Add "Subject(Blind study name in Alert)"
' colSupesData.Add "LRW job#"
' colSupesData.Add "LOI"
' colSupesData.Add "Incidence"
' colSupesData.Add "Sample size"
' colSupesData.Add "Dates(select from Alert)"
' colSupesData.Add "Devices allowed"
' colSupesData.Add "Respondent qualifications(from Alert)"
' colSupesData.Add "Quotas"
'Dictionary of attributes(alternative to list)
dict.Add "Project team names", ""
dict.Add "Programming", ""
dict.Add "Date(today)", ""
dict.Add "Subject(Blind study name in Alert)", ""
dict.Add "LRW job#", ""
dict.Add "LOI", ""
dict.Add "Incidence", ""
dict.Add "Sample size", ""
dict.Add "Dates(select from Alert)", ""
dict.Add "Devices allowed", ""
dict.Add "Respondent qualifications(from Alert)", ""
dict.Add "Quotas", ""
'Open up the Supes
Call OpenSupes
'Open up the Alert file
MyAlert = Application.GetOpenFilename()
Workbooks.Open (MyAlert)
'Loop for subroutine
For Each key In dict.keys
Debug.Print (key)
Call Cpy(key)
dict.item = r.Value
Next key
End Sub
子Cpy(钥匙作为变型)
亚公开赛()
代码中有许多问题 1) 关键的一点是,您正在尝试使用Word文档上的
工作簿。Open
方法<代码>[Workbooks.Open][1]需要一个工作簿变量。因此:
Workbooks.Open (MyAlert)
不能用Word doc
您需要文档。打开
,但还需要一个Word应用程序来使用它,因此您需要在相应的子系统中创建该应用程序实例。您可以在其他地方使用wordapp.Documents。打开
2) 在代码顶部使用选项Explicit
,并声明所有变量。到处都是缺失的
3) 在打开应用程序后退出它们,否则最终会由于运行的实例太多而导致崩溃
4) Application.screenUpdate=True
应位于子屏幕的末尾,以更新屏幕,并且仅当在此之前有Application.screenUpdate=False
时
5) 正如@Cindymister所指出的:在下一步的错误恢复中,您不需要在InputBox
周围设置。您可以通过将结果设置为变量并进行测试来进行测试。请参阅
6) 还有@dbmitch说了些什么。函数转换是一种合乎逻辑的选择。您报告的错误是在您尝试将r.值分配给字典时在循环中生成的
For Each key In dict.keys
Debug.Print (key)
Call Cpy(key)
dict.item = r.Value
Next key
假设Cpy
子例程正在将r单元格发送回程序,
但是它不是-r在您的程序中本地声明为变体,并且在本地声明为
在Cpy内部作为一个范围
您需要将r作为函数值而不是封闭的子例程返回,
或者,您可以将r Range类型变量设置为全局变量,以便您的所有程序都能看到它请在代码顶部添加显式选项,然后添加所有缺少的变量声明。此外,我们无法确定哪个是Ln82-请将代码行复制到导致错误的问题描述中。并且您希望Application.ScreenUpdate=True出现在SUB的末尾,而不是SUB的开头,并且只有在开始时将其关闭。为什么在显示输入框的地方使用On error Resume Next
?使用此功能应该没有理由这样做…并且要小心打开多个Word实例而不是关闭它们。谢谢您的帮助!我尝试将r全局声明为范围类型和对象,但在循环开始时仍然得到一个“424-Object required”错误:对于dict中的每个键。keys@JeffreyWilliamKaemmerling如果你仍然有问题,为什么你要把它标记为“答案”?它是否回答了您的问题?@JeffreyWilliamKaemmerling-您是否删除了覆盖您的全局的本地声明Dim r As Variant
-因为您已经发现了当前代码中的许多问题,而不仅仅是回答了眼前的问题。我认为解决一个问题只会导致下一个问题。谢谢你花时间
Workbooks.Open (MyAlert)
For Each key In dict.keys
Debug.Print (key)
Call Cpy(key)
dict.item = r.Value
Next key