You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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 Stringindex 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

火山引擎 最新活动