Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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 编译错误:未找到方法或数据成员,VBA_Excel_Vba_Ms Word_Activex - Fatal编程技术网

Excel 编译错误:未找到方法或数据成员,VBA

Excel 编译错误:未找到方法或数据成员,VBA,excel,vba,ms-word,activex,Excel,Vba,Ms Word,Activex,我正在使用Microsoft Word中的ActiveX命令按钮执行以下任务: 将ActiveX标签添加到一系列表中 重命名插入的ActiveX标签 使用Excel工作簿中的数据填充ActiveX标签的标题 我正在将ActiveX标签重命名为“FY”&seq,其中seq是一个数字序列。例如,重命名的标签可以是“FY1”。在步骤3中,我的代码使用了“FY1”(ThisDocument.FY1.Caption=rw.Cells(1.Value)),但代码不会运行,我收到一条编译错误:找不到方法或数据

我正在使用Microsoft Word中的ActiveX命令按钮执行以下任务:

  • 将ActiveX标签添加到一系列表中
  • 重命名插入的ActiveX标签
  • 使用Excel工作簿中的数据填充ActiveX标签的标题

  • 我正在将ActiveX标签重命名为
    “FY”&seq
    ,其中
    seq
    是一个数字序列。例如,重命名的标签可以是“FY1”。在步骤3中,我的代码使用了“FY1”(
    ThisDocument.FY1.Caption=rw.Cells(1.Value)
    ),但代码不会运行,我收到一条
    编译错误:找不到方法或数据成员
    消息

    我是否必须呼叫新的Sub才能识别我的标签?是否有一种方法可以通过单击ActiveX按钮来运行整个代码

    Private Sub CommandButton1_Click()
    
    Dim objExcel As Excel.Application
    Dim exWb As Excel.Workbook
    Dim rng As Excel.Range, m, rw As Excel.Range
    Dim num As Integer
    Dim TableNo As Integer
    Dim seq As Integer
    Dim ctl As MSForms.Label
    Dim ils As Word.InlineShape
    
    Set objExcel = New Excel.Application
    Set exWb = objExcel.Workbooks.Open("O:\Documents\Database.csv")
    Set rng = exWb.Sheets("FY1819_DatabaseExtracted").Cells
    TableNo = ActiveDocument.Tables.Count
    num = 3
    seq = 1
    
    '' Now, create all FY labels
    Do
        Set ils = ActiveDocument.Tables(num).cell(6, 2).Range.InlineShapes.AddOLEControl(ClassType:="Forms.Label.1")
        Set ctl = ils.OLEFormat.Object
        ctl.Name = "FY" & seq
        seq = seq + 1
        num = num + 1
    Loop Until num = TableNo + 1
    
    '''' Match to Excel Database
    m = objExcel.Match(ThisDocument.Code1.Caption, rng.Columns(3), 0)
    
    If Not IsError(m) Then
        Set rw = rng.Rows(m) '<< get the matching row as a Range
        ThisDocument.FY1.Caption = rw.Cells(1).Value 'value from colA
    End If
    
    Set exWb = Nothing
    
    End Sub
    
    Private子命令按钮1\u单击()
    Dim objExcel作为Excel.Application
    将exWb设置为Excel.工作簿
    尺寸rng为Excel.Range,m、rw为Excel.Range
    Dim num作为整数
    Dim TableNo作为整数
    作为整数的Dim seq
    作为MSForms.Label的Dim ctl
    将ils设置为Word.InlineShape
    Set objExcel=New Excel.Application
    设置exWb=objExcel.Workbooks.Open(“O:\Documents\Database.csv”)
    设置rng=exWb.Sheets(“FY1819_数据库提取”).单元格
    TableNo=ActiveDocument.Tables.Count
    num=3
    序号=1
    “”现在,创建所有FY标签
    做
    设置ils=ActiveDocument.Tables(num).cell(6,2).Range.InlineShapes.AddolControl(类类型:=“Forms.Label.1”)
    设置ctl=ils.OLEFormat.Object
    ctl.Name=“FY”和seq
    序号=序号+1
    num=num+1
    循环直到num=TableNo+1
    ''与Excel数据库匹配
    m=objExcel.Match(ThisDocument.Code1.Caption,rng.Columns(3),0)
    如果不是IsError(m),则
    
    设置rw=rng.Rows(m)’下面是一个如何更改代码的简化示例:

    Private Sub CommandButton1_Click()
    
        Dim obj, ctl, ils As Word.InlineShape
    
        'add a control and set its name          
        Set ils = ActiveDocument.Tables(1).Cell(1, 1).Range. _
                      InlineShapes.AddOLEControl(ClassType:="Forms.Label.1")
        Set ctl = ils.OLEFormat.Object
        ctl.Name = "FY1"
        'consider setting the caption here?
    
    
        'ThisDocument.FY1.Caption = "Hello" '<< will not compile
    
        'alternate approach
        Set obj = GetControl(ActiveDocument, "FY1")
        If Not obj Is Nothing Then
            obj.Caption = "Hello"
        End If
    
    End Sub
    
    'get a control by name
    Function GetControl(doc As Document, conName As String) As Object
        Dim rv As Object, obj
        For Each obj In doc.InlineShapes
            If obj.OLEFormat.Object.Name = conName Then
                Set rv = obj.OLEFormat.Object
                Exit For
            End If
        Next obj
        Set GetControl = rv
    End Function
    
    Private子命令按钮1\u单击()
    Dim obj、ctl、ils作为Word.InlineShape
    '添加控件并设置其名称
    设置ils=ActiveDocument.Tables(1).Cell(1,1).Range_
    InlineShapes.AddolControl(类类型:=“Forms.Label.1”)
    设置ctl=ils.OLEFormat.Object
    ctl.Name=“FY1”
    '考虑在此处设置标题?
    
    “ThisDocument.FY1.Caption=“Hello””打开文档后,它看起来像
    seq=2
    ,然后
    seq
    在它下面的循环中递增。文档中是否确实有一个
    FY1
    ,或者应该以
    FY2
    开头?刚刚编辑了
    seq
    ,因此它=1。错误消息仍然出现。
    ThisDocument.FY1.Caption
    需要能够编译,然后代码才能运行以添加控件-这是一个问题。也许可以看看这里如何避免硬编码的名称-完美!我使用了第一个选项,将标题命名为
    ctl.caption=rw.Cells(7).Value
    。是的,这肯定是最简单的方法。