VBA报错:无法合并工作表与区域类型及方法/数据成员未找到求助
嘿,我来帮你搞定这两个VBA错误!先看看你代码里的核心问题,一个个解决:
第一个错误:"Method or data member not found"
你提到的hoja.cell.Value写法是错的——Worksheet对象根本没有叫cell的成员,正确的引用应该是hoja.Cells(row, column)(指定具体行列),或者在循环里像你原来那样用cell.Value(因为cell已经是循环里的Range对象了)。不过看你的代码,其实你在循环里已经用了cell.Value,大概率是调试时误写了hoja.cell.Value才触发的这个错误。
第二个错误:"Can't combine worksheet type with range type"
这个问题出在你的循环语句:
For Each cell In Range("G3:G" & ultimaFila)
这里的Range没有指定所属的工作表,默认会指向当前活动工作表,而你已经把目标工作表存在hoja变量里了。如果hoja不是当前活动表,就会出现工作表类型和范围类型不兼容的错误。解决方法就是把Range绑定到hoja对象上:
For Each cell In hoja.Range("G3:G" & ultimaFila)
其他优化点(避免后续踩坑)
- 去掉冗余代码:你写了
If sheet = "Consolidado" Then Set hoja = ...,但前面已经有Set hoja = ActiveWorkbook.Worksheets(sheet),如果参数sheet是"Consolidado",这行已经生效了,重复设置完全没必要,删掉就行。 - 显式初始化计数变量:虽然VBA里Integer默认是0,但显式给这些计数变量赋值
=0会让代码更清晰,也避免意外的初始值问题。 - 声明参数类型:原过程的参数都是变体类型(Variant),最好显式声明类型,比如
sheet As String,index As Integer,这样能提前发现类型不匹配的错误。
修复后的完整代码
Sub search(date1 As Variant, month As Variant, sheet As String, index As Integer) Dim cell As Range Dim startDate As Integer Dim textoPlano As Integer: textoPlano = 0 Dim svcPoliza As Integer: svcPoliza = 0 Dim svcMarcas As Integer: svcMarcas = 0 Dim svcDptos As Integer: svcDptos = 0 Dim svcCotizacionesCme As Integer: svcCotizacionesCme = 0 Dim svcAniosVehiculo As Integer: svcAniosVehiculo = 0 Dim svcRiesgoVigente As Integer: svcRiesgoVigente = 0 Dim svcLineasVehiculos As Integer: svcLineasVehiculos = 0 Dim svcLeeLocalidades As Integer: svcLeeLocalidades = 0 Dim hoja As Worksheet Dim ultimaFila As Long Dim resultado As Worksheet Set resultado = ActiveWorkbook.Worksheets("Resultados") Set hoja = ActiveWorkbook.Worksheets(sheet) ultimaFila = hoja.Cells(hoja.Rows.Count, "G").End(xlUp).Row ' 关键:把Range绑定到hoja工作表上 For Each cell In hoja.Range("G3:G" & ultimaFila) If InStr(cell.Value, "enviarCorreoTextoPlano") > 0 Then textoPlano = textoPlano + 1 End If If InStr(cell.Value, "svcPolizaRecienteVehiculo") > 0 Then svcPoliza = svcPoliza + 1 End If If InStr(cell.Value, "svcMarcasVehiculos") > 0 Then svcMarcas = svcMarcas + 1 End If If InStr(cell.Value, "svcLeeDptos") > 0 Then svcDptos = svcDptos + 1 End If If InStr(cell.Value, "svcLeeCotizacionesCme") > 0 Then svcCotizacionesCme = svcCotizacionesCme + 1 End If If InStr(cell.Value, "svcLeeAniosVehiculo") > 0 Then svcAniosVehiculo = svcAniosVehiculo + 1 End If If InStr(cell.Value, "svcRiesgoVigenteVehiculo") > 0 Then svcRiesgoVigente = svcRiesgoVigente + 1 End If If InStr(cell.Value, "svcLineasVehiculos") > 0 Then svcLineasVehiculos = svcLineasVehiculos + 1 End If If InStr(cell.Value, "svcLeeLocalidades") > 0 Then svcLeeLocalidades = svcLeeLocalidades + 1 End If Next cell End Sub
调试小提醒
如果你再遇到类似成员找不到的错误,记得Worksheet对象的单元格引用是复数的Cells,比如hoja.Cells(3, "G").Value就是第3行G列的值,而循环里的cell是已经遍历到的Range对象,直接用cell.Value就对了。
内容的提问来源于stack exchange,提问作者Eldest




