繁体   English   中英

获取未定义的编译错误函数或子函数 Excel VBA

[英]Getting Compile Error Function or Sub Function not Defined Excel VBA

我正在尝试通过在 Excel 中编写代码来自动化 Outlook。 Excel 数据将复制到 Outlook 邮件正文中。 但是当我尝试运行代码时,我收到编译错误,即未定义函数或子函数。 以下是代码:

Private Sub SendMail_Click()


Dim Outlookbj As Object

Dim OutlookMailItem As Object

Dim OutlookAttachment As Object

Dim CopyExcelData As Range

Dim VarDate As String

Dim VarDate1 As String

VarDate = Date

VarDate1 = Left(VarDate, 2)


Set CopyExcelData = Nothing

Set CopyExcelData = Sheets("Sheet1").Range("A1:L27").SpecialCells(xlCellTypeVisible)

If CopyExcelData Is Nothing Then
MsgBox "The Selection is not a range"

End If

With Application
.EnableEvents = False
.ScreenUpdating = False
End With

Set OutlookObj = CreateObject("Outlook.Application")
Set OutlookMailItem = OutlookObj.CreateItem(0)

With OutlookMailItem
.To = "abc@dc.com"
.Subject = "Satus as on " & VarDate1 & " March "
.HTMLBody = RangetoHTML(CopyExcelData)
.Display


End With

End Sub

Private Sub SendMail_Click() 以黄色突出显示。 问题出在这行代码上。 我也尝试过添加对求解器加载项的引用。 但我仍然面临同样的问题。

提前致谢

首先在模块代码表顶部的声明区域中键入Option Explicit ¹(参见脚注)。

第一个错误:将Dim Outlookbj As Object Dim OutlookObj As Object应将Dim OutlookObj As Object

第二个错误: RangetoHTML(... <~~ 这不是本机工作表或 VBA 函数。它是一个 UDF(可能是 Ron de Bruin 编写的那个)。您需要模块代码表中的代码(见下文) )。

Function RangetoHTML(rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2010
    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim TempWB As Workbook

    TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

    'Copy the range and create a new workbook to past the data in
    rng.Copy
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        .Cells(1).Select
        Application.CutCopyMode = False
        On Error Resume Next
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
        On Error GoTo 0
    End With

    'Publish the sheet to a htm file
    With TempWB.PublishObjects.Add( _
         SourceType:=xlSourceRange, _
         Filename:=TempFile, _
         Sheet:=TempWB.Sheets(1).Name, _
         Source:=TempWB.Sheets(1).UsedRange.Address, _
         HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With

    'Read all data from the htm file into RangetoHTML
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.ReadAll
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")

    'Close TempWB
    TempWB.Close savechanges:=False

    'Delete the htm file we used in this function
    Kill TempFile

    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing
End Function

¹在 VBE 的工具 ► 选项 ► 编辑器属性页面中设置Require Variable Declaration会将Option Explicit语句放在每个新创建的代码表的顶部。 这将避免诸如拼写错误之类的愚蠢编码错误以及影响您在变量声明中使用正确的变量类型。 没有声明的动态创建的变量都是变体/对象类型。 使用Option Explicit被广泛认为是“最佳实践”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM