Excel VBA Range.Valuetypes不匹配?

如果列G中的单元格的值为“ – ”,我写了代码删除一行。 但是,在引用每个循环中的单元格时,我得到的types不匹配。 我知道问题来自“curr.Value”,但我不知道如何解决。 有任何想法吗?

这是我的代码:

Sub deleteRows() Dim curr As Range Dim ws As Worksheet Set ws = Workbooks("ExtractedColumns").Sheets("practice") For Each curr In Workbooks("ExtractedColumns").Sheets("practice").Range("G:G") If curr.Value = " - " Then EntireRow.Delete End If Next End Sub 

您可以尝试将值分配给变体并检查types。

 Dim vVal as Variant ..... vVal = curr.Value if IsError(vVal) then etc .... 

我很抱歉,但你错误的原因不是你接受的“答复”。

首先,循环时: For Each curr In Workbooks("ExtractedColumns").Sheets("practice").Range("G:G")

该语法假设在1行中:

For Each curr In Workbooks("ExtractedColumns").Sheets("practice").Range("G:G")

(除非你有-在两行代码之间,或者你没有分享你的代码)。

但是,你已经在上一行中为ws分配了Workbooks("ExtractedColumns").Sheets("practice") ,所以为什么不使用For Each curr In ws.Range("G:G")

此外,循环遍历整个列G将永远持续,循环遍历G列中仅占用的单元格,其中:

For Each curr In ws.Range("G1:G" & ws.Cells(ws.Rows.Count, "G").End(xlUp).Row)

2ns的原因,一旦findcurr.Value = " - " ,并且想要删除整行,就需要使用curr.EntireRow.Delete

最后,像@Comintern所提到的那样,你需要捕获错误的单元格,你不需要为curr.Value赋值另一个variables,只需要使用If IsError(curr.Value) Then

 Sub deleteRows() Dim curr As Range Dim ws As Worksheet Set ws = Workbooks("ExtractedColumns").Sheets("practice") ' loop through only occupied cells in Column G For Each curr In ws.Range("G1:G" & ws.Cells(ws.Rows.Count, "G").End(xlUp).Row) On Error Resume Next If IsError(curr.Value) Then ' check if cell.value return an error If Err.Number <> 0 Then Err.Clear On Error GoTo 0 End If Else ' current cell.value doesn't return an error If curr.Value = " - " Then curr.EntireRow.Delete '<-- delete entire row End If End If Next curr End Sub 

我怀疑types不匹配错误是由curr包含一个数值引起的,与一个string进行比较…很难知道确切无法看到代码的其余部分,如何curr填充,但尝试使用curr.text它为您的Iftesting返回一个string,而不是curr.value

希望这有助于TheSilkCode