Excel 每个阵列中的VBA类型不匹配
我一直在使用下面的代码发送电子邮件,但是当M列中只有一个值时,我得到一个“运行时错误13” 如果我有两个以上的值,它可以正常工作。需要帮忙吗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
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项目将为您
捕获这些错误