Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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
所需对象:Excel&;Word VBA、字典和存储范围_Excel_Vba_Dictionary_Ms Word_Range - Fatal编程技术网

所需对象:Excel&;Word VBA、字典和存储范围

所需对象:Excel&;Word VBA、字典和存储范围,excel,vba,dictionary,ms-word,range,Excel,Vba,Dictionary,Ms Word,Range,我需要帮助理解为什么我在Ln82上不断出现“需要对象”错误。我以为你可以在字典里储存任何东西 工作流程是: 启动程序 创建临时项字典以循环输入框 稍后使用此词典将所有用户输入存储为范围 调用子例程打开目标文档(Mysupes) 调用子例程以打开源代码excel wb(警报) 提示用户12次(通过循环)在源excel中选择范围 粘贴到目标word文档中(此时我不在乎在哪里,我只需要粘贴该死的东西) 也请忽略任何评论,这只是我的白手起家的工作,我尝试了不同的途径 Sub AlertToSupes()

我需要帮助理解为什么我在Ln82上不断出现“需要对象”错误。我以为你可以在字典里储存任何东西

工作流程是:

  • 启动程序
  • 创建临时项字典以循环输入框
  • 稍后使用此词典将所有用户输入存储为范围
  • 调用子例程打开目标文档(Mysupes)
  • 调用子例程以打开源代码excel wb(警报)
  • 提示用户12次(通过循环)在源excel中选择范围
  • 粘贴到目标word文档中(此时我不在乎在哪里,我只需要粘贴该死的东西)
  • 也请忽略任何评论,这只是我的白手起家的工作,我尝试了不同的途径

    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