当值写入单元格时,VBA停止运行

当值写入单元格时,VBA停止运行,vba,excel,Vba,Excel,我正在组织一个有组织的表格中的脏文本。当标记行的单元格完成时,此代码停止。你能帮我让它继续循环吗 Private Sub CommandButton1_Click() Dim sh As Worksheet Dim sh7 As Worksheet Dim CNAME As String Set sh = Worksheets("Sheet6") Set sh7 = Worksheets("Sheet7") lr = sh.Ce

我正在组织一个有组织的表格中的脏文本。当标记行的单元格完成时,此代码停止。你能帮我让它继续循环吗

Private Sub CommandButton1_Click()    
    Dim sh As Worksheet
    Dim sh7 As Worksheet

    Dim CNAME As String

    Set sh = Worksheets("Sheet6")
    Set sh7 = Worksheets("Sheet7")    
    lr = sh.Cells(Rows.Count, 1).End(xlUp).Row

    For n = 1 To lr
        If InStr(1, sh.Cells(n, 1), "CALL:") = 1 Then
            CNAME = sh.Cells(n, 7).Value    
            Ci = sh.Cells(n + 1, 7).Value    
            Cpd = sh.Cells(n + 1, 7).Value    
        Else
            If InStr(1, sh.Cells(n, 1), "Topic:") = 1 Then
                T = sh.Cells(n, 2)
                Tpd = sh.Cells(n + 1, 2)
                Types = sh.Cells(n + 4, 2)
                DM = sh.Cells(n + 5, 2)
                D = sh.Cells(n + 5, 4)
                OD = sh.Cells(n + 6, 2)
                lr7 = sh7.Cells(Rows.Count, 1).End(xlUp).Row
                sh7.Cells(lr7 + 1, 1).Value = CNAME '********This is the last line it runs.
                sh7.Cells(lr7 + 1, 2).Value = Ci
                sh7.Cells(lr7 + 1, 3).Value = Cpd
                sh7.Cells(lr7 + 1, 4).Value = T
                sh7.Cells(lr7 + 1, 5).Value = Tpd
                sh7.Cells(lr7 + 1, 6).Value = Types
                sh7.Cells(lr7 + 1, 7).Value = DM
                sh7.Cells(lr7 + 1, 8).Value = D
                sh7.Cells(lr7 + 1, 9).Value = OD
            End If  
        End If
    Next n
End Sub

您应该养成定义所有变量并提供默认值的习惯

编辑: 看来我原来的结论是不正确的。进一步检查后,我发现代码中可能存在什么问题。两次尝试获取最后一行时,都使用Rows.Count作为参数

也许可以换这些

lr = sh.Cells(Rows.Count, 1).End(xlUp).Row
lr7 = sh7.Cells(Rows.Count, 1).End(xlUp).Row
为此(请注意,我在第一个参数中使用了sheet变量)


定义
lr7
变量。另外,在模块顶部添加
Option Explicit
,以防止输入错误或未声明的变量。变量Ci、Cpd和CNAME似乎没有在条件的其他部分获取值,但它们正试图将其值放入单元格中。这可能就是它在CNAME处停止的原因。如果您在开始时将CNAME设置为空字符串,它可能会超过此行,但它将在下一行停止,因为您有相同的问题。再看一下,这些都是变体,所以它们可以为null。将CNAME设置为它应该是什么,或者在sub的开头将其设置为空字符串,您应该是好的。您有Microsoft Access吗?我认为您尝试做的更适合数据库。这个解决方案将更加简洁,现在知道如何编写查询是一件大事。Excel和Access配合得很好,您可以在VBA中编写自定义数据库函数。“此代码停止”是什么意思。它就这样停止了吗?它会给出一个错误吗?(如果是,什么错误?是在调试时突出显示行
sh7.Cells(lr7+1,2).Value=Ci
,还是突出显示
sh7.Cells(lr7+1,1).Value=CNAME
行?)使用适当的工作表对
行进行限定是个好主意,因为
sh
sh7
都被定义为在
ActiveWorkbook
中,所以它们的
行。Count
将与默认的
ActiveSheet.Rows.Count
具有相同的值,但是,我不确定他们是否指的是活动工作簿。我几乎可以肯定lr7不是。我还认为,在阅读代码时,您永远不应该猜测。如果是ActiveSheet,他们会说
ActiveSheet.Rows.Count
,这样就清楚了。
sh7
是使用
set sh7=Worksheets(“Sheet7”)
设置的,这相当于
set sh7=ActiveWorkbook.Worksheets(“Sheet7”)
lr7
使用
lr7=sh7.Cells(Rows.Count,1).End(xlUp).Row
分配一个值,该值相当于
lr7=sh7.Cells(ActiveSheet.Rows.Count,1).End(xlUp).Row
ActiveSheet
将位于
ActiveWorkbook
中,因此将具有相同的
行。计数
sh7
相同,因此应该可以。(对其进行限定仍然是一个好主意,但是,除非用户在代码运行时手动更改工作簿,否则在这种情况下这不会是一个问题。)那么您是说
sh7.Cells(Rows.Count,1).End(xlUp).Row
为您提供了最后一行,即使
sf7
不是活动工作表?看起来它会通过活动工作表的行计数,这将产生意外结果。问题是
sh7
可能不是活动工作表。它应该总是合格的。
lr = sh.Cells(sh.Rows.Count, 1).End(xlUp).Row
lr7 = sh7.Cells(sh7.Rows.Count, 1).End(xlUp).Row