Excel Macro: Итерация через строки и комбинированный цикл. Макрос excel цикл по строкам


цикл по строкам, при циклическом перемещении по листам

Поскольку ваш вопрос скорее текста на основе просит мнения без кодов, я даю вам мое мнение и нахождение с помощью этого ответа - достаточно справедливо :)

В соответствии с моими комментариями,

Так что если вы хотели бы сделать поиск на data book из другой книги, которая была бы лучшей идеей, учитывая этот BUG: Memory leak occurs when you query an open Excel worksheet by using ActiveX Data Objects (ADO)

Таким образом, вы относитесь к вашим data book как сама база данных и д uery из листа Excel. Даже при этом вы можете сделать так, чтобы каждый из ваших листов поиска, которые вы рассматриваете как набор данных, имеет аналогичную структуру. Если вы предоставили нам пример данных, то это намного лучше, чем мы продолжаем бросать камни в цель в темноте ...;) Вы упомянули о поиске строк. Вы ищете строки по одному столбцу на листе? Если так, все ваши поисковые листы содержат этот столбец?

Так что для строк, которые вы хотите произвести поиск/сканирование, вот что Microsoft должен сказать, очень важно заметить:

«Строка для сканирования: Excel не обеспечивает ADO с подробной схемой информации о организации данные, которые он содержит, поскольку реляционная база данных будет. Поэтому драйвер должен сканировать по крайней мере несколько строк существующих данных, чтобы получить обоснованное предположение о типе данных каждого столбца. Значение по умолчанию для «Строки в Scan "- восемь (8) строк. Вы можете указать целочисленное значение из одной (1) или шестнадцати (16) строк или указать нуль (0) для проверки всех существующих строк. Это делается путем добавления необязательного MaxScanRows = установка соединения или, изменив параметр Rows to Scan в диалоговом окне конфигурации DSN.

Однако из-за ошибки в драйвере ODBC, указав, что настройка Rows to Scan (MaxScanRows) в настоящее время не действует. Другими словами, драйвер ODBC Excel (MDAC 2.1 и более поздние версии) всегда проверяет первые 8 строк в указанном источнике данных, чтобы определить тип данных каждого столбца. "

Далее, если ваши строки для поиска имеет смешивать типы данных -> что ставит вас в большой опасности Microsoft также говорит о том аспекте тоже

..

Таким образом, существует много предосторожностей, которые вы можете предпринять с вышеуказанным процессом, но это быстрее, чем VBA Binary Search и .Find. Однако, если вы не хотите использовать подход ADO, тогда вы n предоставить нам некоторые разработанные вами, возможно, придумали. Счастливый шаг вперед в этом направлении. :)

stackoverrun.com

Итерация через строки и комбинированный цикл

Я изо всех сил пытаюсь выяснить, где ошибка в моем коде.

Состояние следующее: Я пишу свою магистерскую диссертацию и сделал эксперимент, где я наблюдал невербальное поведение людей. Я закодировал это невербальное поведение в конкретной программе, и теперь в качестве вывода у меня есть лист Excel со всеми наблюдательными данными. Дело в том, что много строк содержат информацию, которая мне не нужна, поэтому я хочу удалить их.

My Цель: Я хочу сохранить только строки, в которых соответствует часть содержимого столбца С и столбца D (номер участника, начиная с 101). Я попытался объединить две петли вместе, так что первый («внутренний») цикл ищет совпадения по всем номерам участников в столбцах C и D в одной строке (до номера участника 170), если нет совпадения, удаляет строку/if матч идет в следующую строку. Цикл «outter» должен повторять шаги «внутреннего» цикла для всех строк, содержащих данные (здесь до строки 2732).

Мой код до сих пор:

Dim ColumnC As String Dim ColumnD As String Dim ParticipantNumber As String Dim RowNumber As Integer Sub SearchAndDeleteRows() RowNumber = 2 ParticipantNumber = 101 ColumnD = "D" & RowNumber ColumnC = "C" & RowNumber Do While RowNumber < 2733 Do While ParticipantNumber < 170 If InStr(Range(ColumnD).Value, ParticipantNumber) = 0 And InStr(Range(ColumnC).Value, ParticipantNumber) > 0 Or InStr(Range(ColumnD).Value, ParticipantNumber) > 0 And InStr(Range(ColumnC).Value, ParticipantNumber) = 0 Then Rows(RowNumber).Select Selection.Delete Shift:=xlUp Else: GoTo NextParticipant End If NextParticipant: ParticipantNumber = ParticipantNumber + 1 If ParticipantNumber = 170 Then GoTo NextRow End If Loop NextRow: RowNumber = RowNumber + 1 Loop End Sub

Примечание: Я знаю, что функция GoTo это зло, но я не придумал способ, чтобы работать вокруг него до сих пор.

Надеюсь, я ясно объяснил.

Заранее благодарим за вашу помощь!

Cheers, J

stackoverrun.com

Макросы Excel: цикл по строкам

Я работаю над другим проектом Excel, и на этот раз я впервые окунулся в макросы VBA. У меня были очень простые знания о VB, но прошло более десяти лет с тех пор, как я использовал этот язык, поэтому я скорее потерялся.

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

Sub setRecord() If [K2].Value <> "" Then appendToRecord "RecordsTable", [E2:K2].Value End If If [K3].Value <> "" Then appendToRecord "RecordsTable", [E3:K3].Value End If If [K4].Value <> "" Then appendToRecord "RecordsTable", [E4:K4].Value End If If [K5].Value <> "" Then appendToRecord "RecordsTable", [E5:K5].Value End If If [K6].Value <> "" Then appendToRecord "RecordsTable", [E6:K6].Value End If End Sub

Я уверен, что я не единственный, кто чувствует то же самое ...

У меня есть фиксированное количество строк прямо сейчас. Однако это может измениться в будущем, и я бы хотел, чтобы мой код был готов к этому без необходимости добавления или удаления оператора IF.

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

Итак, мой вопрос заключается в том, есть ли способ прокрутить ряд строк, таких как цикл For или ForEach, при проверке значения в определенном столбце на этом пути, чтобы я мог сделать этот кусок кода короче / более эффективным в VBA? Любые указатели будут высоко оценены. Кстати, я использую Office 365.

УВА FOR Конструкция выглядит так:

FOR counter = start TO end [Step increment] {...statements...} NEXT [counter];

пример использования:

Dim myCount As Integer For myCount = 1 to 5 MsgBox (myCount) Next myCount

Для вашей проблемы вы можете начать работу в определенной ячейке, а затем настроить цикл на

а) проверить Активная ячейка, тогда

б) использовать VBA OFFSET чтобы перейти к следующей ячейке диапазона.

Вот решение, которое я придумал:

Dim RecordRange As ListObject Set RecordRange = Worksheets("Set Record").ListObjects("NewRecord") For i = 1 To RecordRange.DataBodyRange.Rows.Count If RecordRange.DataBodyRange.Cells(i, RecordRange.ListColumns("N").Index) <> "" Then appendToRecord "RecordsTable", RecordRange.DataBodyRange.Rows(i) End If Next i

Я попытался использовать ресурсы в ответе, предоставленном @mcalex, но я не мог заставить его работать - это в основном из-за моего отсутствия опыта. К счастью, я нашел несколько статей о VBA и таблицах, которые помогли мне составить ответ для себя.

ityouth.ru

Итерация по строкам и комбинированный цикл MS Excel онлайн

Я изо всех сил пытаюсь выяснить, где ошибка в моем коде.

Ситуация такова: я пишу магистерскую диссертацию и проводил эксперимент, где наблюдал невербальное поведение людей. Я закодировал это невербальное поведение в конкретной программе, и теперь в качестве вывода у меня есть лист Excel со всеми наблюдательными данными. Дело в том, что много строк содержат информацию, которая мне не нужна, поэтому я хочу удалить их.

Моя цель : я хочу сохранить только строки, в которых соответствует часть содержимого столбца C и столбца D (номер участника, начиная с 101). Я попытался объединить две петли вместе, так что первый («внутренний») цикл ищет совпадения по всем номерам участников в столбцах C и D в одной строке (до номера участника 170), если нет совпадения, удаляет строку / if матч идет в следующую строку. Цикл «outter» должен повторять шаги «внутреннего» цикла для всех строк, содержащих данные (здесь до строки 2732).

Мой код :

Dim ColumnC As String Dim ColumnD As String Dim ParticipantNumber As String Dim RowNumber As Integer Sub SearchAndDeleteRows() RowNumber = 2 ParticipantNumber = 101 ColumnD = "D" & RowNumber ColumnC = "C" & RowNumber Do While RowNumber < 2733 Do While ParticipantNumber < 170 If InStr(Range(ColumnD).Value, ParticipantNumber) = 0 And InStr(Range(ColumnC).Value, ParticipantNumber) > 0 Or InStr(Range(ColumnD).Value, ParticipantNumber) > 0 And InStr(Range(ColumnC).Value, ParticipantNumber) = 0 Then Rows(RowNumber).Select Selection.Delete Shift:=xlUp Else: GoTo NextParticipant End If NextParticipant: ParticipantNumber = ParticipantNumber + 1 If ParticipantNumber = 170 Then GoTo NextRow End If Loop NextRow: RowNumber = RowNumber + 1 Loop End Sub

Примечание . Я знаю, что функция GoTo зла, но до сих пор у меня не было способа работать вокруг нее.

Надеюсь, я ясно объяснил.

Заранее спасибо за вашу помощь!

Cheers, J

Solutions Collecting From Web of "Excel Macro: Итерация по строкам и комбинированный цикл"

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

Sub copyNOTdelete() Dim ParticipantNumber As Long, RowNumber As Long Dim wsMain As Worksheet, WSnew As Worksheet, newRowNumber As Long Set wsMain = ActiveSheet Set WSnew = Sheets.Add wsMain.Activate RowNumber = 2 newRowNumber = 1 ParticipantNumber = 101 For ParticipantNumber = 101 To 170 With wsMain.Range("c2:c2733") Set c = .Find(CStr(ParticipantNumber), LookIn:=xlValues) If Not c Is Nothing Then firstaddress = c.Address Do If wsMain.Range("D" & Right(c.Address, 1)) = ParticipantNumber Then WSnew.Rows(newRowNumber).EntireRow.Value = wsMain.Rows(Right(c.Address, 1)).Value newRowNumber = newRowNumber + 1 End If Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstaddress End If End With Next ParticipantNumber End Sub

excel.bilee.com

Как цикл по строкам столбцов в Excel VBA макросов

Привет, я пытаюсь создать макрос, который есть петля, которая копирует вниз функция столбца 1 (Т) и другую функцию вниз столбца 2 (МОЩНОСТИ) для каждой Станции. Это то, что я так далеко:

Sub TieOut() Dim i As Integer Dim j As Integer For i = 1 To 3 For j = 1 To 3 Worksheets("TieOut").Cells(i, j).Value = "'=INDEX('ZaiNet Data'!$A:$H038,MATCH('INDEX-MATCH'!Z&TEXT('INDEX-MATCH'!$A9,"m/dd/yyyy"),'ZaiNet Data'!$C:$C038,0), 4)" Next j Next i End Sub

картина того, чего я ХОЧУ, приведен ниже: Вы можете видеть, что я вручную скопировал и вставил два моих функций вниз каждого столбца. Мне просто нужен макрос, который может перебрать.

функции я хочу повторяться вниз VOL столбец для каждой Станции:

=INDEX('ZaiNet Data'!$A:$H038,MATCH('INDEX-MATCH'!Z&TEXT('INDEX-MATCH'!$A438,"M/DD/YYYY"),'ZaiNet Data'!$C:$C038,0), 4)

функции я хочу повторяться вниз ПОТЕНЦИАЛА столбец для каждой Станции:

=INDEX('ZaiNet Data'!$A:$H038,MATCH('INDEX-MATCH'!Z&TEXT('INDEX-MATCH'!$A438,"M/DD/YYYY"),'ZaiNet Data'!$C:$C038,0), 5)

Может кто-то пожалуйста, помогите? Спасибо!

ОБНОВЛЕНИЕ

**Как я могу сделать цикла выполняются автоматически, без необходимости вручную вводить формулы в первые две ячейки и щелкните на макро?Также, как я могу сделать петлю проходят через все столбцы/строки? (horizontically)**

я включил два снимков экрана, чтобы показать, что я имею в виду. Ниже мое настоящего кодекса.Спасибо!

Sub Loop3() Selection.Copy ActiveCell.Offset(1, 0).Select ActiveSheet.Paste ActiveCell.Offset(-1, 1).Select Selection.Copy ActiveCell.Offset(1, 0).Select ActiveSheet.Paste ActiveCell.Offset(0, -1).Select Dim i As Integer Dim j As Integer With Worksheets("Loop") i = 1 Do Until .Cells(10, i).Value = "blank" For j = 1 To 10 .Cells(j, i).Formula = "=INDEX('ZAINET DATA'!$A:$H038,MATCH(Loop!E&TEXT(Loop!$A9,"/"M/D/YYYY"/"),'ZAINET DATA'!$C:$C038,0),4)" .Cells(j, i + 1).Formula = "=INDEX('ZAINET DATA'!$A:$H038,MATCH(Loop!E&TEXT(Loop!$A9,"/"M/D/YYYY"/"),'ZAINET DATA'!$C:$C038,0),5)" Next j i = i + 2 Loop End With Selection.Copy ActiveCell.Offset(1, 0).Select ActiveSheet.Paste ActiveCell.Offset(-1, 1).Select Selection.Copy ActiveCell.Offset(1, 0).Select ActiveSheet.Paste ActiveCell.Offset(0, -1).Select End Sub

v-resheno.ru