Синтаксис VBA для выбора объектов диапазона - PullRequest
0 голосов
/ 03 апреля 2020

Я получаю:

Ошибка времени выполнения '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

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

К сожалению, у меня нет данных для проверки вашего или моего кода. Поэтому я не могу развить представление о том, что вы пытаетесь сделать. Тем не менее, я рассмотрел ваш код и ниже приведен результат. В ней не должно быть ошибки, на которую вы жаловались.

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 диапазоном, значением или адресом. Извините, что удалил все ваши прекрасные имена змей. Я не могу их читать. В остальном я сохранил ваш код таким, каким он был, но адаптировал его для правильного использования определенных вами переменных.

1 голос
/ 03 апреля 2020

При назначении объектам необходимо использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...