получение данных с предыдущих листов

#excel #for-loop #vba

#excel #for-цикл #vba

Вопрос:

Ребята, вы можете мне помочь? Я думаю, что я отчасти застрял с приведенным ниже кодом. Я почти получил код, который хотел, но в конце он делает не то, что мне нравится.

 Dim acs, cos, as_col, as_row As Integer

     cos = Sheets.Count
     acs = ActiveSheet.Index

     as_LRow = Sheets(acs).Cells(Sheets(acs).Rows.Count, "A").End(xlUp).Row

     For as_row = 3 To as_LRow
        std_number = Sheets(acs).Cells(as_row, 1).Value 

        earliersheets = acs - 1 

        For s = 1 To earliersheets
             ilast_row = Sheets(s).Cells(Sheets(s).Rows.Count, "A").End(xlUp).Row 
             For r = 3 To ilast_row
                std_number_new = Sheets(s).Cells(r, 1).Value

                If std_number = std_number_new Then
                    a = a amp; Sheets(s).Cells(r, 6).Value
                    'Sheets(acs).Cells(as_row, 8).Value = Sheets(s).Cells(r, 8).Value
                    Sheets(acs).Cells(as_row, 8).Value = Sheets(acs).Cells(as_row, 6).Value amp; "   " amp; a

                End If
                a = ""
             Next r

        Next s

     Next as_row
  

Чего я хочу, так это:
После добавления вручную нового листа я хочу нажать на кнопку. Эта кнопка активирует приведенный выше код. Что я хочу, так это проверить значение в конкретной ячейке в столбце «A». Если значение в этом столбце совпадает со значением с предыдущего листа, то отобразите значение в шестом столбце во вновь добавленном листе. Приведенный выше код делает это, но он работает только для двух листов. Если я создам более двух листов, на нем не будет отображаться больше значений, чем два.

Обновление Я добавил свой файл по ссылке: Check.xlsm
После открытия этого файла очистите столбец H на третьем (и, возможно, на втором листе), затем запустите макрос внутри. Вы поймете, что я имею в виду введите описание изображения здесь

Все, что я хочу, это переместить все предыдущие значения на предыдущем листе в столбец-H. Например, я пометил две ячейки значениями, эти значения отображаются в столбце H после запуска макроса.

Комментарии:

1. Вы пытаетесь обновить столбец 6? Ваш код помещает новое значение в столбец 8. ( Sheets(acs).Cells(as_row, 8).Value = Sheets(acs).Cells(as_row, 6).Value amp; " " amp; a помещает в столбец 8 значение, которое находится в столбце 6 нового листа, дополненное знаком » «, и значение из любого обрабатываемого предыдущего листа. Следовательно, если std_number найдено на нескольких предыдущих листах, только последнее из этих значений добавляется к значению в столбце 6 нового листа и помещается в столбец 8.)

2. Справка, смотрите обновление

3. Нет. Ни в коем случае. Я не собираюсь переходить по ссылке на сторонний сайт. (Помимо очевидных проблем с безопасностью, это означает, что будущие пользователи сайта не смогут увидеть вопрос полностью, потому что все, с чем они, вероятно, столкнутся, — это неработающая ссылка.) Если вы хотите, чтобы мы поняли, что вы имеете в виду, пожалуйста, вставьте изображение в свой вопрос. (И я уже знаю, что делает ваш код, потому что вы разместили код в своем вопросе, мне просто нужно больше информации о том, что вы хотите , чтобы он делал — например, вы хотите обновить столбец 8 / H или столбец 6 / F?)

Ответ №1:

Ваша проблема заключалась в том, что вы всегда сохраняли в столбце H значение, созданное путем взятия значения из столбца F текущего листа и добавления значения из столбца F обрабатываемого листа в цикле. Когда вы переходите к следующему листу в цикле, вы заменяете предыдущее значение новым значением.

Итак, при обработке листа w3-6 вы сначала просматриваете лист w1-4 и генерируете значение «13 34» и сохраняете его в ячейке H3 листа w3-6. Затем вы просматриваете лист w2-5 и генерируете значение «13 18» и заменяете значение «13 34», находящееся в данный момент в ячейке H3 листа w3-6, на значение «13 18».

Попробуйте этот код вместо:

 Dim acs As Long, cos As Long, as_col As Long, as_row As Long
Dim s As Long
Dim as_LRow As Long
Dim ilast_row As Long
Dim r As Long
Dim a As String

cos = Sheets.Count
acs = ActiveSheet.Index

as_LRow = Sheets(acs).Cells(Sheets(acs).Rows.Count, "A").End(xlUp).Row

For as_row = 3 To as_LRow
    std_number = Sheets(acs).Cells(as_row, 1).Value 

    'Initialise variable containing result to go into column H
    a = Sheets(acs).Cells(as_row, 6).Value

    'Process earlier sheets in reverse order
    '(so that values will be shown in reverse order)
    For s = acs - 1 To 1 Step -1
        ilast_row = Sheets(s).Cells(Sheets(s).Rows.Count, "A").End(xlUp).Row 
        For r = 3 To ilast_row
            std_number_new = Sheets(s).Cells(r, 1).Value

            If std_number = std_number_new Then
                'Append value to result string
                a = a amp; "   " amp; Cstr(Sheets(s).Cells(r, 6).Value)
                Exit For
            End If
        Next r

    Next s

    'Store result
    Sheets(acs).Cells(as_row, 8).Value = a
Next as_row
  

Комментарии:

1. Спасибо, приятель, я собираюсь это проверить.