Excel 如何修复1个月循环
我有一个第1个月的循环代码,它搜索一个日期列表来查找1月份(1)订购的工作,并将这些工作复制粘贴到新的工作表中 代码运行正常,但当它结束时,它会标记一个@debug error 13' 如果我禁用该行,代码将不起作用,但我无法找出哪些代码被破坏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
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