Вопрос по vba, excel – Excel VBA: цикл по ячейкам и копирование значений в другую книгу

4

Я уже часами занимался этой проблемой, но мне не удалось найти рабочее решение.

Вот мойproblem description:

Я хочу перебрать определенный диапазон ячеек в одной рабочей книге и скопировать значения в другую рабочую книгу. В зависимости от текущего столбца в первой книге, я копирую значения в другой лист во второй книге. Когда я выполняю свой код, я всегда получаюruntime error 439: object does not support this method or property.

мойcode выглядит примерно так:

Sub trial()

Dim Group As Range
Dim Mat As Range
Dim CurCell_1 As Range
Dim CurCell_2 As Range

Application.ScreenUpdating = False

Set CurCell_1 = Range("B3") 'starting point in wb 1

For Each Group in Workbooks("My_WB_1").Worksheets("My_Sheet").Range("B4:P4")
    Set CurCell_2 = Range("B4") 'starting point in wb 2
    For Each Mat in Workbooks("My_WB_1").Worksheets("My_Sheet").Range("A5:A29")
        Set CurCell_1 = Cells(Mat.Row, Group.Column) 'Set current cell in the loop
        If Not IsEmpty(CurCell_1)
            Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value = Workbooks("My_WB_1").Worksheets("My_Sheet").CurCell_1.Value 'Here it break with runtime error '438 object does not support this method or property
            CurCell_2 = CurCell_2.Offset(1,0) 'Move one cell down
        End If
    Next
Next

Application.ScreenUpdating = True

End Sub

Я провел обширное исследование и знаю, как копировать значения из одной рабочей книги в другую, если вы используете явные имена для ваших объектов (листов и диапазонов), но я не знаю, почему это не работает, как я его реализовал используя переменные. Я также выполнил поиск в stackoverlow и, очевидно, в Google, но не нашел подобной проблемы, которая отвечала бы на мой вопрос.

Так что мойquestion является: Не могли бы вы сказать мне, где ошибка в моем коде или есть другой, более простой способ сделать то же самое, используя другой способ?

Это мой первый вопрос, поэтому я надеюсь, что все в порядке с форматом моего кода, заданным вопросом и предоставленной информацией. В противном случае, дайте мне знать.

Ваш Ответ

2   ответа
2
Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value

Это не будет работать, так как CurCell_2 - это не метод Worksheet, а переменная. Заменить на

Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).Range("B4").Value
Error: User Rate Limit Exceeded Patrick
Error: User Rate Limit Exceeded
11

5 Things...

1) Вам не нужна эта строка

Set CurCell_1 = Range("B3") 'starting point in wb 1

Эта строка не имеет смысла, так как вы устанавливаете ее внутри цикла

2) Вы устанавливаете это в цикле каждый раз

Set CurCell_2 = Range("B4")

Зачем ты это делаешь? Он будет просто перезаписывать значения каждый раз. Кроме того, какой лист этот диапазон в ??? (См. Пункт 5)

3)CurCell_2 это Range, и, как указал JohnB, это не метод.

+ Изменить

Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value = Workbooks("My_WB_1").Worksheets("My_Sheet").CurCell_1.Value

в

CurCell_2.Value = CurCell_1.Value

4) Вы не можете назначить диапазон, просто установив & quot; = & quot; знак

CurCell_2 = CurCell_2.Offset(1,0)

Измените это на

Set CurCell_2 = CurCell_2.Offset(1,0)

5) Всегда указывайте полные объявления при работе с двумя или более объектами, чтобы избежать путаницы. Ваш код также может быть записан как (UNTESTED)

Option Explicit

Sub trial()
    Dim wb1 As Workbook, wb2 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim Group As Range, Mat As Range
    Dim CurCell_1 As Range, CurCell_2 As Range

    Application.ScreenUpdating = False

    '~~> Change as applicable
    Set wb1 = Workbooks("My_WB_1")
    Set wb2 = Workbooks("My_WB_2")

    Set ws1 = wb1.Sheets("My_Sheet")
    Set ws2 = wb2.Sheets("Sheet2") '<~~ Change as required

    For Each Group In ws1.Range("B4:P4")
        '~~> Why this?
        Set CurCell_2 = ws2.Range("B4")
        For Each Mat In ws1.Range("A5:A29")
            Set CurCell_1 = ws1.Cells(Mat.Row, Group.Column)
            If Not IsEmpty(CurCell_1) Then
                CurCell_2.Value = CurCell_1.Value
                Set CurCell_2 = CurCell_2.Offset(1)
            End If
        Next
    Next

    Application.ScreenUpdating = True
End Sub
If I understood you right, then a Range refers to a specific cell, a sheet and a workbook, not only a cell.Error: User Rate Limit ExceededRangeError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded2)Error: User Rate Limit ExceededOffsetError: User Rate Limit Exceeded Patrick

Похожие вопросы