Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2013, 08:55   #1
Number_30
Пользователь
 
Регистрация: 30.01.2013
Сообщений: 15
По умолчанию Цикл внутри цикла?

Добрый день!

Есть следующий код:

Код:
Private Sub Button1_Click()
Dim lItem As Long
Dim r As Integer
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("лист1")
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("новый")
Dim ws3 As Worksheet: Set ws3 = ThisWorkbook.Sheets("input")
Dim test1 As String


For lItem = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(lItem) = True Then
        
    With ws3
    .Cells(1, 1).Value = ListBox1.List(lItem, 0)
    End With
    
        test1 = ws3.Cells(1, 1).Value
        For r = 3 To ws1.Range("H50").End(xlUp).Row
        If ws1.Cells(r, 8) = test1 Then
        ws1.Rows(r).Copy ws2.Rows(ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row + 1)
    End If
Next r

End If
   
Next lItem

MsgBox "Данные успешно скопированы"


End Sub
Суть работы, как должно быть - предварительно отмечаются checkbox-ом несколько строк в listbox-е расположенного на userform.
Делается клик по кнопке и из листа "лист1" копируются все строки, содержащие значение из listbox-a на новый лист "новый" (т.е. например, значение "BY1D" из листбокса повторяется 30 раз в листе "лист1" по столбцу "H", и все они должны копироваться).

как это выглядет согласно кода - клик по кнопке, выбранное значение из listbox-a копируется в ячейку А1 в листе "input", затем этой ячейке задается значение test1 и далее производится поиск строки содержащей значение из test1 в листе "лист1" по столбцу H . Он должен бы находить все строки, и копировать их один за другим на лист "новый". Но, он копирует только первую строку, даже если выбрано несколько элементов из листбокса... геморрой и еще и не работает.

Но, если в
Код:
If ws1.Cells(r, 8) = test1 Then
вместо test1 прописать какое нибудь постоянное значение, слово, то он работает - копирует все строки с этим словом.
Но проблема заключается в - как сделать, чтобы этот код работал для переменной ?
Number_30 вне форума Ответить с цитированием
Старый 07.02.2013, 10:14   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Пункт 1

Number_30, не решение вашей задачи, просто замечание по коду.
Можно сразу поместить данные в переменную test1 из Listbox.


Пункт 2

Ошибка у вас здесь:
Код:
ws1.Rows(r).Copy ws2.Rows(ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row + 1)
на листе ws2 неправильно определяется номер строки, куда вставлять данные. В вашем коде строка, куда нужно вставить данные, определяется по второму столбцу. Видимо у вас на листе ws2 во втором столбце пусто.

Последний раз редактировалось Скрипт; 07.02.2013 в 10:44.
Скрипт вне форума Ответить с цитированием
Старый 07.02.2013, 11:09   #3
Number_30
Пользователь
 
Регистрация: 30.01.2013
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Пункт 1

Number_30, не решение вашей задачи, просто замечание по коду.
Можно сразу поместить данные в переменную test1 из Listbox.
Пробовал так сделать, но от этого он ее вообще не видит как.

Цитата:
Видимо у вас на листе ws2 во втором столбце пусто.
Нет там все в порядке.

Сейчас попробовал так:
Код:
Private Sub Buttondrgcopynochange1_Click()
Dim i As Integer
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("лист1")
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("новый")
Dim cell As Range

Application.ScreenUpdating = False
For Each cell In Range("H3:H50").Cells.SpecialCells(xlFormulas)
For i = 2 To ws1.Range("H50").End(xlUp).Row
    If ws1.Cells(i, 8) = "SPD1" Then
    ws1.Rows(i).Copy ws2.Rows(ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row + 1)
    End If
Next i
Next cell

End Sub
И он, в новый лист копирует первую попавшуюся строку из листа1 до 50-ой строки... Как задать правильно цикл? чтобы он для искомого значения копировал все строки с этим значением, а не только первую попавшуюся?
Number_30 вне форума Ответить с цитированием
Старый 07.02.2013, 11:57   #4
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Number_30, протестируйте код в выложенной книге.
Работает он так, как нужно?

При нажатии на верхнюю кнопку, ListBox заполянется данными.
При нажатии на нижнюю кнопку, копируются строки на второй лист.
Вложения
Тип файла: zip Listbox.zip (15.9 Кб, 12 просмотров)
Скрипт вне форума Ответить с цитированием
Старый 07.02.2013, 13:54   #5
Number_30
Пользователь
 
Регистрация: 30.01.2013
Сообщений: 15
По умолчанию

Попробовал и заметил такой момент - скопировал свой код в ваш лист и все работает нормально.... возвращаюсь в свою книгу и опять, копирует только первую строку, сколько бы строк не выбирал. Когда же я попробовал вручную заполнить столбец Н, то и в моей книге все заработало. Но, стоит только мне протянуть формулу до конца (до строки Н6836), то опять все сбивается и копируется только одна строка - самая первая. Формула стоит простая - ="SPD"&C2 (C2 - динамическая по столбцу). Я слышал что в таких случаях надо задавать значение столбца что все значения это формулы? как быть?
Number_30 вне форума Ответить с цитированием
Старый 07.02.2013, 13:59   #6
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Number_30, создайте примерную ситуацию в книге, которую я выложил. Убедитесь, что код не работает и выложите книгу на Форуме, пояснив, что не работает.

Последний раз редактировалось Скрипт; 07.02.2013 в 14:02.
Скрипт вне форума Ответить с цитированием
Старый 07.02.2013, 14:11   #7
Number_30
Пользователь
 
Регистрация: 30.01.2013
Сообщений: 15
По умолчанию

Разобрался... я диапазон по столбцу Н указал не достаточный. Было всего Н6836, теперь указал Н8000 с запасом и все заработало.

Спасибо большое за помощь!
Number_30 вне форума Ответить с цитированием
Старый 07.02.2013, 14:41   #8
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Number_30, может так вам определять номер последней строки с данными в столбце "H"?
Код:
Sub Procedure_1()

    Dim myLastRow As Long

    myLastRow = Worksheets(1).Range("H" & Worksheets(1).Rows.Count).End(xlUp).Row

End Sub
Скрипт вне форума Ответить с цитированием
Старый 07.02.2013, 16:56   #9
Number_30
Пользователь
 
Регистрация: 30.01.2013
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Number_30, может так вам определять номер последней строки с данными в столбце "H"?
Код:
Sub Procedure_1()

    Dim myLastRow As Long

    myLastRow = Worksheets(1).Range("H" & Worksheets(1).Rows.Count).End(xlUp).Row

End Sub
Отличное решение! Спасибо!
Number_30 вне форума Ответить с цитированием
Старый 07.02.2013, 17:07   #10
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Number_30, у вас такое уже применялось в вашем коде (сообщение #1):
Код:
ws1.Rows(i).Copy ws2.Rows(ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row + 1)
Скрипт вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл с условиями и выход из цикла KJ_ya Microsoft Office Excel 5 20.01.2013 14:43
iostream указатель работает только внутри цикла Egyptorium Помощь студентам 2 04.01.2012 13:54
Переделать цикл. Код внутри =) Silverstone Помощь студентам 4 21.12.2011 22:12
Цикл for. Переход в начало цикла по условию. webber9989 Общие вопросы Delphi 3 07.07.2011 11:26
цикл for i:=0 to count -1 do. Уменьшать счётчик i внутри цикла... Человек_Борща Общие вопросы Delphi 10 01.07.2011 21:11