#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. Спасибо, приятель, я собираюсь это проверить.