【问题标题】:VBA Syntax for selecting range objects用于选择范围对象的 VBA 语法
【发布时间】:2020-04-03 13:15:06
【问题描述】:

我得到:

需要运行时错误“424”对象

这是我用来将一个范围的值复制到另一个范围的代码。请让我知道最后一行中的相同问题。我认为当我尝试创建一个单元格范围和一个偏移的单元格时,问题就出现了

num_lines = 4
Set ws = Sheets("Working BoM")
Set ws_ref = Sheets("BoM")

For i = 1 To num_lines

    match_value = Sheets("Line Info").Range("C" & Trim(Str(i))).Value
    match_range = ws_ref.Range("A2:Y2")
    bom_pos = Application.WorksheetFunction.Match(match_value, match_range, 0)
    bom_cell = ws_ref.Range(ws_ref.Cells(2, bom_pos).Address)
    ref_cell = ws.Range(ws.Cells(1, 4 * (i - 1) + 1).Address)
    num_rows = ws_ref.Range("A2").Offset(0, bom_pos - 1).End(xlDown).Row - 1

    ws_ref.Range(bom_cell, bom_cell.Offset(num_rows, 2)).Copy _
     Destination:=ws.Range(ref_cell, ref_cell.Offset(num_rows, 2))


Next i

【问题讨论】:

  • bom_cell 是一个字符串,一个范围的地址。它不是一个范围,也不是一个单元格。因此bom_cell.Offset(num_rows, 2) 失败。
  • 你能发布你的样本数据然后解释你想做什么吗?这将使您更容易找到解决方案

标签: excel vba


【解决方案1】:

分配给对象时,必须使用Set。 在这种情况下,您要存储单元格的范围对象。否则,您的变量将仅存储这些单元格的值。

所以,改变这些行:

bom_cell = ws_ref.Range(ws_ref.Cells(2, bom_pos).Address)
ref_cell = ws.Range(ws.Cells(1, 4 * (i - 1) + 1).Address)

这些

Set bom_cell = ws_ref.Range(ws_ref.Cells(2, bom_pos).Address)
Set ref_cell = ws.Range(ws.Cells(1, 4 * (i - 1) + 1).Address)

【讨论】:

    【解决方案2】:

    很遗憾,我没有数据来测试您或我的代码。因此,我无法了解您要做什么。但是,我查看了您的代码,结果如下。它不应该有你抱怨的错误。

    Sub ReviewedCode()
    
        Dim Ws As Worksheet
        Dim WsBom As Worksheet
        Dim WsInfo As Worksheet
        Dim MatchRng As Range
        Dim MatchVal As Variant
        Dim MatchPos As Long
        Dim BomCell As Range
        Dim RefCell As Range
        Dim NumRows As Integer
        Dim R As Long
        Dim Rt As Long                          ' Target row
    
        Set Ws = Worksheets("Working BoM")
        Set WsInfo = Worksheets("Line Info")
        Set WsBom = Worksheets("BoM")
        MatchRng = WsBom.Range("A2:Y2")
        NumRows = 4
    
        For R = 1 To NumRows
            MatchVal = WsInfo.Cells(R, "C").Value
            On Error Resume Next                ' in case no match is found
            MatchPos = Application.WorksheetFunction.Match(MatchVal, MatchRng, 0)
            If Err.Number Then
                ' enter code here what to do if there was no match
                ' for now: do nothing & skip to next row
            Else
                Set BomCell = WsBom.Cells(2, MatchPos)
                Set RefCell = Ws.Cells(1, 4 * (R - 1) + 1)
                Rt = WsBom.Range("A2").Offset(0, MatchPos - 1).End(xlDown).Row - 1
    
                WsBom.Range(BomCell, BomCell.Offset(Rt, 2)).Copy _
                            Destination:=Ws.Range(RefCell, RefCell.Offset(Rt, 2))
            End If
        Next R
    End Sub
    

    如您所见,我所做的最明显的更改是您使用的所有变量的列表。这将帮助您避免陷入不知道bom_cell 是范围、值还是地址的陷阱。请原谅我删除了你所有美丽的蛇名。我无法阅读它们。对于其余部分,我基本上保留了您的代码,但对其进行了调整以正确使用您定义的变量。

    【讨论】:

    • 非常感谢您的努力。这行得通。我使用 set 使其成为一个范围而不仅仅是值。我对 VBA 很陌生,因此这个问题。
    • 太棒了!我的回复是否需要进行任何修改,然后您才能将其认可为“已选择”以供其他人学习?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多