Excel 每个阵列中的VBA类型不匹配

Excel 每个阵列中的VBA类型不匹配,excel,vba,Excel,Vba,我一直在使用下面的代码发送电子邮件,但是当M列中只有一个值时,我得到一个“运行时错误13” 如果我有两个以上的值,它可以正常工作。需要帮忙吗 Sub testDemo() Dim outlookApp As Object Dim objMail As Object Dim Region Dim rng As Range Dim Mailaddr As String Dim MyRange As String Dim arr As Varia

我一直在使用下面的代码发送电子邮件,但是当M列中只有一个值时,我得到一个“运行时错误13”

如果我有两个以上的值,它可以正常工作。需要帮忙吗

Sub testDemo()
    Dim outlookApp As Object
    Dim objMail As Object
    Dim Region
    Dim rng As Range
    Dim Mailaddr As String
    Dim MyRange As String
    Dim arr As Variant
    Dim lastrow As Long
    Dim lastrow2 As Long


     ' Create email
    Set outlookApp = CreateObject("Outlook.Application")

    ' Update with your sheet reference
    With Sheets("Escalate")

    lastrow = Range("A65536").End(xlUp).Row
    lastrow2 = Range("M65536").End(xlUp).Row
    Set rng = .Range("A1:I" & lastrow)

    End With

    arr = Range("M2:M" & lastrow2).Value


    For Each Region In arr

    myrangename = Worksheets("email").Range("C2:D200")
    Mailaddr = WorksheetFunction.VLookup(Region, myrangename, 2, False)

    On Error Resume Next


    With outlookApp.CreateItem(0)
            ' Add table to Email body
            .SentOnBehalfOfName = "script Tracking"
            .cc = "Pearson.S@cambridgeenglish.org; Tracking.S@cambridgeenglish.org"
            .HTMLBody = "Dear Team," & "<br><br>" & _
            "blahblah  " & "<br><br>" & _
            GenerateHTMLTable(rng, CStr(Region), True) & "<br><br>" & _
            "Many thanks in advance " & "<br><br>" & _
            "Kind regards "

            .To = Mailaddr
            .Subject = "Region " & Region & " Outstanding scripts -  " & Range("L1")
            .Display

        End With
skip:

    Next Region


End Sub

Public Function GenerateHTMLTable(srcData As Range, Region As String, Optional FirstRowAsHeaders As Boolean = True) As String
    Dim InputData As Variant, HeaderData As Variant
    Dim HTMLTable As String
    Dim i As Long



    ' Declare constants of table element
    Const HTMLTableHeader As String = "<table>"
    Const HTMLTableFooter As String = "</table>"

    ' Update with your sheet reference
    If FirstRowAsHeaders = True Then
        HeaderData = Application.Transpose(Application.Transpose(srcData.Rows(1).Value2))
        InputData = Range(srcData.Rows(2), srcData.Rows(srcData.Rows.Count)).Value2
        ' Add Headers to table
        HTMLTable = "<tr><th>" & Join(HeaderData, "</th><th>") & "</th></tr>"


    End If

    ' Loop through each row of data and add selected region to table output
        For i = LBound(InputData, 1) To UBound(InputData, 1)
        ' Test Region against chosen option
        If Region = InputData(i, 9) Then
            ' Add row to table for output in email
            HTMLTable = HTMLTable & "<tr><td>" & Join(Application.Index(InputData, i, 0), "</td><td>") & "</td></tr>"


        End If


Next i


    GenerateHTMLTable = HTMLTableHeader & HTMLTable & HTMLTableFooter

End Function
子测试演示()
Dim outlookApp作为对象
Dim objMail作为对象
暗区
变暗rng As范围
Dim Mailaddr作为字符串
将MyRange设置为字符串
作为变体的Dim-arr
最后一排一样长
暗淡的最后一行2一样长
'创建电子邮件
设置outlookApp=CreateObject(“Outlook.Application”)
'使用工作表引用更新
使用表格(“升级”)
lastrow=范围(“A65536”)。结束(xlUp)。行
lastrow2=范围(“M65536”)。结束(xlUp)。行
设置rng=.Range(“A1:I”和lastrow)
以
arr=范围(“M2:M”和最后一行2).值
对于arr中的每个区域
myrangename=工作表(“电子邮件”)。范围(“C2:D200”)
Mailaddr=WorksheetFunction.VLookup(Region,myrangename,2,False)
出错时继续下一步
使用outlookApp.CreateItem(0)
'将表添加到电子邮件正文
.SentonBehalfName=“脚本跟踪”
.cc=“皮尔逊。S@cambridgeenglish.org;跟踪。S@cambridgeenglish.org"
.HTMLBody=“亲爱的团队,&”

“&”_ “布拉布拉”和“布拉布拉”_ GenerateHTMLTable(rng、CStr(地区)、True)和“

”以及_ “提前多谢”&“

”和_ “亲切问候” .To=Mailaddr .Subject=“Region”和Region&“优秀脚本-”和Range(“L1”) .展示 以 跳过: 下一个地区 端接头 公共函数GenerateHTMLTable(srcData作为范围,Region作为字符串,可选firstrowashheaders作为Boolean=True)作为字符串 Dim输入数据作为变量,HeaderData作为变量 Dim HTMLTable作为字符串 我想我会坚持多久 '声明表元素的常量 常量HTMLTableHeader为String=“” 常量HTMLTableFooter As String=“” '使用工作表引用更新 如果firstRowaHeaders=True,则 HeaderData=Application.Transpose(Application.Transpose(srcData.Rows(1.Value2)) InputData=Range(srcData.Rows(2),srcData.Rows(srcData.Rows.Count)).Value2 '将标题添加到表中 HTMLTable=“”&加入(HeaderData“”&“” 如果结束 '循环遍历每行数据,并将选定区域添加到表输出中 对于i=LBound(InputData,1)到UBound(InputData,1) '针对所选选项的测试区域 如果区域=输入数据(i,9),则 '将行添加到表中以在电子邮件中输出 HTMLTable=HTMLTable&&Join(Application.Index(InputData,i,0),“”)和 如果结束 接下来我 GenerateHTMLTable=HTMLTableHeader&HTMLTable&HTMLTableFooter 端函数

这将更好地解释它

Sub Sample()
    Dim arr

    lastrow2 = 2

    arr = Range("M2:M" & lastrow2).Value

    lastrow2 = 3

    arr = Range("M2:M" & lastrow2).Value
End Sub
lastrow2=2
时,
arr
仅保存一个单元格值,因此它成为
变量/(字符串/双精度…等,具体取决于单元格M2中的值)

lastrow2>2
时,
arr
成为2D数组,因此它成为
变体/变体(1到2,1到1)

可以使用VBA中的
arr
上的
Watch
来验证上述内容


这就是当您有多个单元格时,代码工作的原因。

因为它不是一个集合或数组,它是一个单一值-您可以在为每个单元格运行
之前,通过检查
IsArray(arr)
来测试这一点

有几种方法可以解决此问题,但最快的方法是在每个
之前包含行
,如果不是IsArray(Arr),那么Arr=Array(Arr)
,将其转换为一个1元素数组

其他需要考虑的问题:
  • 下一步错误恢复的
    目的是什么
    
  • 您的
    跳过:
    标签的目的是什么
  • 变量<代码> MyRangeNeNe/COD>未定义-考虑将<代码>选项显式< /代码>添加到模块的顶部,以便“调试”>编译VBA项目将为您
  • 捕获这些错误