Excel VBA-将查找结果存储在范围变量中

smcamero

我试图将范围存储在范围变量startID,endID和endDest中,但是我不断收到运行时错误1004“对象_Global的方法范围失败”。

我的工作簿的“控制页”上有贷款清单,它们都有多行(从2到6行),如下所示:

  • A | B | C
  • 贷款1 | 东西| 1.0
  • 贷款1 | 东西| 1.1
  • 贷款2 | 东西| 2.0
  • 贷款2 | 东西| 2.1
  • 贷款2 | 东西| 2.2

整个目的是将活动单元向下移动到列表底部的贷款。这是我到目前为止遇到的问题:假设活动单元格在上面的项目符号列表临时工作表中为B2 -活动单元格的行以及固定的列索引3表示我在行1.1上。然后,我将“ 1.1”固定为1,并将该整数存储在currentID中。现在,我可以在列C中找到currentID的第一次出现,然后将currentID出现在范围变量startID中的范围地址存储。在这种情况下,我应该将C1存储在startID中。

我读过查找返回一个范围。所以我尝试了Set startID = .Range("C:C").Find(what:=currentID),但这只是在startID中存储了currentID 1。因此,我尝试了一下Set startID = Range(.Range("C:C").Find(what:=currentID))(这是我的代码块下面显示的内容),但这会导致运行时错误。我还尝试添加和删除句点,以防弄乱With语句,但这没有帮助。有什么想法吗?

如果我缺少一些明显的东西,我深表歉意。我已经使用VBA大约三周了,所以通常我必须用Google搜索我需要的每件事,直到我开始记住重复出现的主题为止。

Sub ExpireLoan()
With Workbooks("1908 AUS IC Loans Recon.xlsm").Worksheets("Control Page")
Dim currentID As Integer
Dim startID As Range
Dim endID As Range
Dim endDest As Range
Dim rowCount As Integer

'find the current loan range
    currentID = Fix(.Cells(ActiveCell.Row, 3).Value)
    Set startID = Range(.Range("C:C").Find(what:=currentID))
    Set endID = Range(.Range("C:C").Find(what:=currentID + 1))
    Set endID = Range(endID.Offset(-1, 0))

'find the last row
    Set endDest = .Range("A7").End(xlDown)
    Set endDest = endDest.Offset(-1, 0)

'copy the current loan and paste into the end of the table
    rowCount = .Range(startID, endID).Count
    .Range(startID, endID).EntireRow.Copy
    .endDest.EntireRow.PasteSpecial

'set bottom border at new end of the table
    endDest.Select
    ActiveCell.Offset(0, 0).Range("A1:AF1").Borders(xlEdgeBottom).LineStyle = xlDouble

'delete rows from loan's original position above
    .Range(startID, endID).EntireRow.Delete

'set sort ID
    ActiveCell.Offset(0, 2).Value = Fix(ActiveCell.Offset(-1, 2).Value) + 1
    For i = 0 To rowCount - 2
        ActiveCell.Offset(i + 1, 2).Value = ActiveCell.Offset(i, 2).Value + 0.1
    Next

'delete loanTypeCode
    ActiveCell.Offset(0, 1).ClearContents
    For i = 1 To rowCount - 1
        ActiveCell.Offset(i, 1).ClearContents
    Next

'fix sortID
    Set sortIdRange = Range(startID, startID.End(xlDown))
    Call subtractOneFromCells

'make it red
    ActiveCell.Offset(0, 0).Range("A1:AF1").Interior.TintAndShade = 0.399975585192419
    For i = 1 To rowCount - 1
        ActiveCell.Offset(i, 17).Range("A1:P1").Interior.TintAndShade = 0.399975585192419
    Next

End With
End Sub
沙尔克

以我的经验.Find,寻找数字时可能会有些奇怪。使用xlWhole通常的修复对我来说,它也没有当我试图在你的样本数据。否则,currentID = 3例如,如果您正在寻找.Find则将返回其中第一个单元格为3的第一单元作为子字符串。这意味着值1.3的像元可以作为3的第一次出现返回。请尝试以下行:

Set startID = .Range("C:C").Find(What:=currentID, LookAt:=xlWhole)

要进行调试,您可以使用F8代码逐行浏览和使用,Debug.Print currentIDDebug.Print startID.Address通过即时窗口查看正在发生的情况。

较短代码(不一定总是更具可读性)的技巧如下:您可以合并以下两行:

Set endDest = .Range("A7").End(xlDown)
Set endDest = endDest.Offset(-1, 0)

像这样一行:

Set endDest = .Range("A7").End(xlDown).Offset(-1, 0)

由于第一行返回一个Range对象,因此无需将其存储在步骤之间的变量中。

另一方面,关于这两行:

endDest.Select
ActiveCell.Offset(0, 0).Range("A1:AF1").Borders(xlEdgeBottom).LineStyle = xlDouble

首先,建议尽可能避免使用.Select,如此处所述:如何避免在Excel VBA中使用“选择”其次,第二行很难理解。尝试Resize像这样使用

ActiveCell.Resize(1, 32).Borders(xlEdgeBottom).LineStyle = xlDouble

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章