确保您用于Option Explicit
检测可变错别字。
确保每个 Range
、Cells
和对象都有一个像 一样引用的工作表Rows
,否则它将占用任何处于活动状态的工作表(并且可以通过用户单击轻松更改)。Colums
ws.Range
正如您在Range.Find 方法的文档中所见,您绝对需要指定以下 4 个参数,否则会得到随机结果:
每次使用此方法时都会保存LookIn
、LookAt
、SearchOrder
和的设置。MatchByte
如果下次调用该方法时没有为这些参数指定值,则使用保存的值。设置这些参数会更改“查找”对话框中的设置,而更改“查找”对话框中的设置会更改在省略参数时使用的保存值。为避免出现问题,请在每次使用此方法时显式设置这些参数。
如果不定义这些参数,它可能现在可以工作并在下次停止工作。
使用该Find()
方法后,请确保您测试是否找到了某些东西,If Not FoundAt Is Nothing Then
否则它会出错。
[ ]
您使用的 in与符号[celladdress]
无关,[A1]
并且不像您假设的那样工作。他们需要被删除!
声明你的变量尽可能接近它们的第一次使用而不是最顶部。否则你很容易得到类似的东西Dim v As Integer
并且永远不会v
在整个代码中使用。
最后使用正确的代码格式和正确的缩进。代码越容易阅读,错误就越少,调试也就越容易。不要像“我稍后会修复格式”那样工作。这会减慢您编写好代码的速度,并且您可能永远无法修复它。
所以你最终会得到类似的东西:
Option Explicit
Public Sub Example()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1") 'define your sheet
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(1, 0).Row
ws.Cells(LastRow, 13).Value = "Sampling"
ws.Range("C3").Copy ws.Range("C" & LastRow)
ws.Range("B3").Copy ws.Range("B" & LastRow)
ws.Range("A3").Copy ws.Range("A" & LastRow)
Dim FoundAt As Range 'define ALL these parameters below to prevent random/wrong results
Set FoundAt = ws.Range("G3:G1000").Find(What:="Description", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=False)
If Not FoundAt Is Nothing Then 'test if something was found you cannot delete if you found nothing
Dim CellAddress As String
CellAddress = FoundAt.Offset(-1, 30).Address
ws.Range("A2", CellAddress).Delete
Else
MsgBox "'Description' was not found.", vbCritical
End If
End Sub