String 两个变量作为单元格引用

String 两个变量作为单元格引用,string,vba,loops,variables,String,Vba,Loops,Variables,我写的宏有一个问题,如下所示。简而言之,我已经删除了代码中所有不相关的部分,以使它更简单 Sub Macro1() Dim a As Integer For a = 2 To 21 Dim y As Integer For y = 27 To 47 If InStr(Cells(a, y), “SUB”) > 0 Then Range(Cells(a, y), Cells(a, (y + 2))).Select Selection.Cut Cells(a, 22).Select Activ

我写的宏有一个问题,如下所示。简而言之,我已经删除了代码中所有不相关的部分,以使它更简单

Sub Macro1()
Dim a As Integer
For a = 2 To 21
Dim y As Integer
For y = 27 To 47
If InStr(Cells(a, y), “SUB”) > 0 Then
Range(Cells(a, y), Cells(a, (y + 2))).Select
Selection.Cut
Cells(a, 22).Select
ActiveSheet.Paste
End If
Next y
Next a
End Sub
所发生的事情是,它正在剪切和粘贴y=27到y=47的所有范围,而不仅仅是传递IF语句的单元格。我怀疑这与为列和行标识符使用变量有关,但我不知道

它应该做的是找到一个包含“SUB”的单元格,然后将该单元格和右边的两个单元格复制并粘贴到同一行中,但不包括第22-24列


有人有什么想法吗?

您发布的代码没有明显的错误,但是可以通过删除选择来改进/缩短代码

Sub Macro1()

    Dim a As Long, y As Long

    For a = 2 To 21
        For y = 27 To 47
            If InStr(Cells(a, y), "SUB") > 0 Then
                Cells(a, y).Resize(1, 3).Cut Cells(a, 22)
            End If
        Next y
    Next a

End Sub

'将通过IF语句'。你有没有检查过不是所有人都通过了if?用F8逐步浏览你的代码,这样你就可以看到执行过程中发生了什么。也许有些“代码中不相关的部分”毕竟是相关的。您显示的代码相当简单(即使它使用了过多的
Select
),并且没有说明您所描述的内容。JZZ:仔细看,大多数单元格都是空白的,因此没有理由传递if语句。对John说:我说代码的其他部分与问题无关,因为当它被分解到这个问题时,我得到的问题与我从完整版本中得到的问题相同。虽然这很好,使宏运行速度明显加快,但在完成后,单元格(a,22)仍然会得到最初在单元格(a,47)中的值单元格(a,27)到单元格(a,49)中的所有值都已清除。这不是我在测试中看到的。你使用的正是我发布的代码吗?你有没有在工作表上运行任何事件处理程序?我不知道这是怎么发生的,但在你编写的确切代码不起作用后,我删除并重新键入了“SUB”部分,现在它工作得很好。我请求有人向我解释一下excel的特殊怪癖。谢谢Tim的帮助看起来你问题代码中SUB的引号已经变成了“智能引号”(我刚刚在代码中修复了这一点)。但是,智能引号通常会在VB编辑器中给您一个编译错误。。。