Excel 如何修复1个月循环

Excel 如何修复1个月循环,excel,loops,Excel,Loops,我有一个第1个月的循环代码,它搜索一个日期列表来查找1月份(1)订购的工作,并将这些工作复制粘贴到新的工作表中 代码运行正常,但当它结束时,它会标记一个@debug error 13' 如果我禁用该行,代码将不起作用,但我无法找出哪些代码被破坏 Sub Search_Month() Dim datasheet As Worksheet Set datasheet = Sheet2 Dim Mreport As Worksheet Set Mreport = Sh

我有一个第1个月的循环代码,它搜索一个日期列表来查找1月份(1)订购的工作,并将这些工作复制粘贴到新的工作表中

代码运行正常,但当它结束时,它会标记一个@debug error 13'

如果我禁用该行,代码将不起作用,但我无法找出哪些代码被破坏

Sub Search_Month()

    Dim datasheet As Worksheet
    Set datasheet = Sheet2
    Dim Mreport As Worksheet
    Set Mreport = Sheet9

    Dim Lmonth As Integer
    Search = Range("m4").Value

    Dim i As Integer

    Mreport.Unprotect Password:=rapid1

    Mreport.Range("a2:a300").ClearContents

    datasheet.Activate

    For i = 7 To 5000

        Lmonth = Month(Cells(i, 6))

        If Lmonth = Search Then

            Range(Cells(i, 2), Cells(i + 3, 2)).Copy
            Mreport.Activate
            Range("A1000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
            datasheet.Activate

        End If

    Next i

    Mreport.Activate

    Mreport.Protect Password:=rapid1

    MsgBox "End of Month Report Updated"

End Sub
标记的行是lmmonth=Month(单元格(i,6)),但我不知道为什么


宏找到的所有结果都是正确的,只是结尾的错误令人讨厌。我认为它的意思是“下一个搜索行不显示lmonth=1,因此我无法再运行代码,因此它必须被破坏”

调试错误13是一个类型不匹配。因此函数“Month”给定了一个值,无法处理

请参阅以获取参考。它必须是日期

你的主要问题似乎是,你只是从第7行转到5000行,甚至没有检查是否有任何内容。我认为你不能相信这个事实,表中总是有4993个条目


因此,我建议将I=7的循环更改为类似于ActiveSheet.UsedRange.Rows.Count的
。如果您不确定,还可以在使用“-”函数之前检查数据类型。

调试错误13是一个类型不匹配。因此,函数“Month”给定了一个无法处理的值

请参阅以获取参考。它必须是日期

你的主要问题似乎是,你只是从第7行转到5000行,甚至没有检查是否有任何内容。我认为你不能相信这个事实,表中总是有4993个条目

因此,我建议将I=7的循环更改为类似于
的形式,以ActiveSheet.UsedRange.Rows.Count
。如果您不确定,还可以在使用“-函数”之前检查数据类型。

每月复制一次
  • 我已将变量
    rapid1
    更改为字符串。您可能需要 更改此选项以使代码正常工作
  • 虽然实现常量(仅更改一次,并且更改速度很快 “在一个地方”(在开头)并恰当地命名它们是非常重要的 可能会增加其他人的可读性(以及在 虽然),但在开发时可能不是这样。因此,我将 主版本下方的无常量版本
主要版本 无常数版本 月刊
  • 我已将变量
    rapid1
    更改为字符串。您可能需要 更改此选项以使代码正常工作
  • 虽然实现常量(仅更改一次,并且更改速度很快 “在一个地方”(在开头)并恰当地命名它们是非常重要的 可能会增加其他人的可读性(以及在 虽然),但在开发时可能不是这样。因此,我将 主版本下方的无常量版本
主要版本 无常数版本
这太尴尬了

我尝试了你上面的许多选项,但都没有用,然后我去粘贴一些东西到我的代码中,它粘贴了一个我认为奇怪的工号,但实际上是代码出现故障的工号。所以我去查看这个字段,发现我输入了该字段的日期为07/02/19/,最后一个转发者抛出了一个代码错误r

删除/并重新运行代码,它工作正常,没有调试错误

感谢大家的帮助和建议,我将使用您的编码和反馈来改进此代码,并在将来改进更多

再次感谢


菜鸟错误!这太尴尬了

我尝试了你上面的许多选项,但都没有用,然后我去粘贴一些东西到我的代码中,它粘贴了一个我认为奇怪的工号,但实际上是代码出现故障的工号。所以我去查看这个字段,发现我输入了该字段的日期为07/02/19/,最后一个转发者抛出了一个代码错误r

删除/并重新运行代码,它工作正常,没有调试错误

感谢大家的帮助和建议,我将使用您的编码和反馈来改进此代码,并在将来改进更多

再次感谢


新手错误!当出现错误时,
i
的值和
单元格(i,6)
的内容是什么?i的值会有所不同,但当搜索的日期不再等于所查找的月数时,i的值就会改变。例如,如果我搜索的是1月份的所有作业,而i82是01/02/19(单元格(1,6)然后它将在第82行出错。我无法用您提供的信息和代码重现您的错误。如果您没有找到其他解决方案,我建议您上传一份工作簿(删除敏感信息),向某些共享站点(例如dropbox、onedrive)演示此问题然后在这里发布一个链接。
i
的值是多少?当它出错时,
单元格(i,6)
的内容是什么?i的值会有所不同,但会在搜索的日期不再等于搜索的月数时出现。例如,如果我搜索的是1月份的所有作业,而i82是01/02/19(单元格(1,6)然后它将在第82行出错。我无法用您提供的信息和代码重现您的错误。如果您没有找到其他解决方案,我建议您上传一份工作簿(删除敏感信息),向某些共享站点(例如dropbox、onedrive)演示此问题然后在这里发布一个链接。我使用7-5000的唯一原因是我无法使用usedrange编码,我知道5000是一个安全数字(每个作业需要4行)因为一年中有1200个左右的工作岗位是我们最多能得到的。我的问题是我对VBA的经验很少,所以我的代码通常都很简单和冗长。你也应该检查一下有关的教程——错误的日期已经成了过去。我使用7-5000的唯一原因是因为我无法使用使用VBA编码,我知道5000是安全的编号(每个作业占用4行)为1200左右j
Sub Search_Month()

    ' Data
    Const cSearch As String = "M4"  ' Search Value Cell Range
    Const cFRD As Long = 7          ' First Row Number
    Const cOffset As String = 3     ' Copy Row Offset
    Const cCol As Variant = "F"     ' Search Column Letter/Number
    Const cCopy As Variant = "B"    ' Copy Column Letter/Number
    ' Report
    Const cFRR As Long = 2          ' First Row Number
    Const cWrite As Variant = "A"   ' Write Column Letter/Number
    ' Data
    Dim datasheet As Worksheet  ' Worksheet
    Dim rng As Range            ' Last Cell Range
    Dim Search As Long          ' Search Month
    Dim vntMonth As Variant     ' Current Month
    Dim i As Long               ' Row Counter
    ' Report
    Dim Mreport As Worksheet    ' Worksheet
    Dim FER As Long             ' First Empty Row

    ' Create References to Worksheets
    Set datasheet = Sheet2
    Set Mreport = Sheet9

    ' Speed up
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
    On Error GoTo ProcedureExit

    ' In Data Worksheet
    With datasheet

        ' Assign value from Search Value Cell Range to Search Month.
        Search = .Range(cSearch).Value

        ' In Search Column
        With .Columns(cCol)
            ' Calculate Last Cell Range in Search Column.
            Set rng = .Find("*", , xlFormulas, xlWhole, xlByColumns, xlPrevious)
        End With

        If rng Is Nothing Then ' No data in column (Highly unlikely).
            MsgBox "No Data in column '" _
                    & Split(.Cells(1, cCol).Address, "$")(1) & "'."
            GoTo ProcedureExit
        End If

        ' In Report Worksheet
        With Mreport
            .Unprotect Password:="rapid1"
            ' Clear contents from First Row to bottom cell of Write Column.
            .Cells(cFRR, cWrite).Resize(.Rows.Count - cFRR + 1).ClearContents
            ' Write First Row Number to First Empty Row.
            FER = cFRR
        End With

        ' Loop through cells of Data Worksheet.
        For i = cFRD To rng.Row
            ' Write value of current cell to Current Month.
            vntMonth = .Cells(i, cCol)
            ' Check if Current Month is a date or can be converted to a date.
            If IsDate(vntMonth) Then
                ' Check if month of current cell value is equal to Current Month.
                If Month(vntMonth) = Search Then
                    ' Write data from Data Worksheet to Report Worksheet.
                    Mreport.Cells(FER, cWrite).Resize(cOffset) = _
                            .Cells(i, cCopy).Resize(cOffset).Value
                    FER = FER + cOffset
                End If
            End If
        Next
    End With

    ' In Report Worksheet
    With Mreport
        .Protect Password:="rapid1"
        MsgBox "End of Month Report Updated"
    End With

ProcedureExit:

    ' Speed down
    With Application
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With

End Sub
Sub Search_Month_No_Constants()

    ' Data
    Dim datasheet As Worksheet  ' Worksheet
    Dim rng As Range            ' Last Cell Range
    Dim Search As Long          ' Search Month
    Dim vntMonth As Variant     ' Current Month
    Dim i As Long               ' Row Counter
    ' Report
    Dim Mreport As Worksheet    ' Worksheet
    Dim FER As Long             ' First Empty Row

    ' Create References to Worksheets
    Set datasheet = Sheet2
    Set Mreport = Sheet9

    ' Speed up
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
    On Error GoTo ProcedureExit

    ' In Data Worksheet
    With datasheet

        ' Assign value from Search Value Cell Range to Search Month.
        Search = .Range("M4").Value

        ' In Search Column
        With .Columns("F")
            ' Calculate Last Cell Range in Search Column.
            Set rng = .Find("*", , xlFormulas, xlWhole, xlByColumns, xlPrevious)
        End With

        If rng Is Nothing Then ' No data in column (Highly unlikely).
            MsgBox "No Data in column 'F'." _
            GoTo ProcedureExit
        End If

        ' In Report Worksheet
        With Mreport
            .Unprotect Password:="rapid1"
            ' Clear contents from First Row to bottom cell of Write Column.
            .Cells(2, "A").Resize(.Rows.Count - 2 + 1).ClearContents
            ' Write First Row Number to First Empty Row.
            FER = 2
        End With

        ' Loop through cells of Data Worksheet.
        For i = 7 To rng.Row
            ' Write value of current cell to Current Month.
            vntMonth = .Cells(i, "F")
            ' Check if Current Month is a date or can be converted to a date.
            If IsDate(vntMonth) Then
                ' Check if month of current cell value is equal to Current Month.
                If Month(vntMonth) = Search Then
                    ' Write data from Data Worksheet to Report Worksheet.
                    Mreport.Cells(FER, "A").Resize(3) = _
                            .Cells(i, "B").Resize(3).Value
                    FER = FER + 3
                End If
            End If
        Next
    End With

    ' In Report Worksheet
    With Mreport
        .Protect Password:="rapid1"
        MsgBox "End of Month Report Updated"
    End With

ProcedureExit:

    ' Speed down
    With Application
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With

End Sub