Vba 获取类型不匹配错误

Vba 获取类型不匹配错误,vba,excel,Vba,Excel,我在这段代码中遇到了一个运行时错误13“类型不匹配”,我不知道为什么。我以前没有使用过Mid()函数,这是抛出错误的那一行。初学者在这里,任何和所有的帮助感谢 我想让if行检查字符串中的第三个字符是否等于4。如果你知道更好的方法,我也愿意接受 For k = 2 To NRow If Mid(SummarySheet.Range("B2:B" & k), 3, 3) = 4 Then SummarySheet.Range("B" & k & ":D

我在这段代码中遇到了一个运行时错误13“类型不匹配”,我不知道为什么。我以前没有使用过
Mid()
函数,这是抛出错误的那一行。初学者在这里,任何和所有的帮助感谢

我想让if行检查字符串中的第三个字符是否等于4。如果你知道更好的方法,我也愿意接受

For k = 2 To NRow
    If Mid(SummarySheet.Range("B2:B" & k), 3, 3) = 4 Then
        SummarySheet.Range("B" & k & ":D" & k).Cut
        SummarySheet.Range("R" & k & ":T" & k).PasteSpecial xlPasteValues
    End If
Next
Mid()
用于获取单个文本值的子字符串。由于您正在阵列上尝试此操作,因此它将不起作用。我不完全确定这是您想要的,但这不应该引发错误:

If Mid(SummarySheet.Range("B" & k).Value, 3, 1) = "4" Then
请注意,引用是针对单个单元格的,引用“4”表示它是一个字符串。我将上一个参数更改为1,因为您正在查找单个字符。

Mid()
用于获取单个文本值的子字符串。由于您正在阵列上尝试此操作,因此它将不起作用。我不完全确定这是您想要的,但这不应该引发错误:

If Mid(SummarySheet.Range("B" & k).Value, 3, 1) = "4" Then

请注意,引用是针对单个单元格的,引用“4”表示它是一个字符串。我将您的上一个参数更改为1,因为您正在查找单个字符。

我相信这就是您正在尝试做的:

您需要向后迭代数据

Mid一次只允许一个单元格。第三个标准是长度,所以它应该是1

可以设置值,然后从集中删除数据

For k = Nrow To 2 Step -1
    If Mid(SummarySheet.Range("B" & k), 3, 1) = "4" Then
        SummarySheet.Range("R" & k & ":T" & k).Value = SummarySheet.Range("B" & k & ":D" & k).Value
        SummarySheet.Range("B" & k & ":D" & k).Delete xlshiftUp
    End If
Next
现在,如果您只想清除值并在数据中保留一个空行,请使用以下方法:

For k = Nrow To 2 Step -1
    If Mid(SummarySheet.Range("B" & k), 3, 1) = "4" Then
        SummarySheet.Range("R" & k & ":T" & k).Value = SummarySheet.Range("B" & k & ":D" & k).Value
        SummarySheet.Range("B" & k & ":D" & k).Clear
    End If
Next

我相信这就是你想要做的:

您需要向后迭代数据

Mid一次只允许一个单元格。第三个标准是长度,所以它应该是1

可以设置值,然后从集中删除数据

For k = Nrow To 2 Step -1
    If Mid(SummarySheet.Range("B" & k), 3, 1) = "4" Then
        SummarySheet.Range("R" & k & ":T" & k).Value = SummarySheet.Range("B" & k & ":D" & k).Value
        SummarySheet.Range("B" & k & ":D" & k).Delete xlshiftUp
    End If
Next
现在,如果您只想清除值并在数据中保留一个空行,请使用以下方法:

For k = Nrow To 2 Step -1
    If Mid(SummarySheet.Range("B" & k), 3, 1) = "4" Then
        SummarySheet.Range("R" & k & ":T" & k).Value = SummarySheet.Range("B" & k & ":D" & k).Value
        SummarySheet.Range("B" & k & ":D" & k).Clear
    End If
Next

我不认为您只能在使用剪切时粘贴值。这是一个全有或全无的问题。至于Mid,您一次只能做一个单元格,而不是一系列单元格。
Mid
共3个字符,但您只测试
4
?编辑:是的,正如Scott所说,您需要
范围(“B”&k)
我不认为您只能在使用剪切时粘贴值。这是一个全有或全无的问题。至于Mid,您一次只能做一个单元格,而不是一系列单元格。
Mid
共3个字符,但您只测试
4
?编辑:是的,正如斯科特所说,你需要
范围(“B”&k)
我认为这是错误的。假设Nrow=100,在k=94时if第一次为真。然后,范围B95:D100和R94:T94将被填充,而B2:D94将被删除。如果您没有添加向后迭代,这可能会起作用,但我认为使用xlUp删除不是有意的。@SeanScott是的,它应该是
xlshiftup
。修正了为什么向后迭代的问题。如果我们向前迭代,到达第6行,这是真的,那么我们复制并删除该行,数据向上移动。以前的第7行现在是第6行,当for循环迭代时会被跳过。虽然我们无法推测用户是如何使用这些数据的,但我相信您的“数据清理”方法也会从更改目标索引中受益,因为我们将在R:T列中得到一堆空白。我将对您的第一个解决方案进行编辑。@SeanScott我觉得OP只提供了一小部分代码,我希望提供与他们的代码相同的输出,而不是假设他们想要不同的输出。我相信这是错误的。假设Nrow=100,在k=94时if第一次为真。然后,范围B95:D100和R94:T94将被填充,而B2:D94将被删除。如果您没有添加向后迭代,这可能会起作用,但我认为使用xlUp删除不是有意的。@SeanScott是的,它应该是
xlshiftup
。修正了为什么向后迭代的问题。如果我们向前迭代,到达第6行,这是真的,那么我们复制并删除该行,数据向上移动。以前的第7行现在是第6行,当for循环迭代时会被跳过。虽然我们无法推测用户是如何使用这些数据的,但我相信您的“数据清理”方法也会从更改目标索引中受益,因为我们将在R:T列中得到一堆空白。我将对您的第一个解决方案进行编辑。@SeanScott我觉得OP只提供了一小部分代码,我希望提供与他们的代码相同的输出,而不是假设他们需要不同的输出。