Доброй поры суток, уважаемые форумчане. Прошу помощи в решении следующего вопроса.
Имеется определенный массив данных для анализа. Небольшую часть его я приложил в примере. Данные находятся на двух листах: ТЕСТ и РЕЗУЛЬТАТЫ. Задача: нужно взять некоторые данные из листа РЕЗУЛЬТАТЫ и скопировать их на лист ТЕСТ при выполнении определенных условий. Условие1: если дата находится в соответствующем диапазоне Условие2: если совпадают "дата игры" и "название команды" в обоих листах в соответствующих ячейках, то скопировать соответствующий результат.
И хотелось бы, чтобы эти все действия выполнялись по нажатию кнопки. Т.е. заполняется данными один лист, а потом другой, а потом я жму кнопку и происходит обработка этих данных.
Использую вот такой код в модуле
..................
[vba]
Код
Sub UDAL(data_1, data_2 As Date) Dim d1&, n1&, d2&, n2&, i&, j& Application.ScreenUpdating = False d1 = Sheets(1).Range("B" & Rows.Count).End(xlUp).Row n1 = Sheets(1).Range("C" & Rows.Count).End(xlUp).Row d2 = Sheets(2).Range("A" & Rows.Count).End(xlUp).Row
For i = 1 To d1
For j = 1 To d2
If Sheets(1).Cells(i, 2).End(xlUp).Offset(0, 0) = Sheets(2).Cells(j, 1).End(xlUp).Offset(0, 0) Then If (InStr(Sheets(1).Cells(i, 3), Sheets(2).Cells(j, 2)) = 1) And (InStr(Sheets(1).Cells(i, 3), Sheets(2).Cells(j, 3)) = 1) Then
Next Next Application.ScreenUpdating = True End Sub
[/vba]
..................
Ошибок VBA не выдает, но и результатов тоже... ((
И второй вопрос, гораздо менее важный, но все-таки: если пишу Sheets("тест"), выдает ошибку out of range, т.е. приходится писать Sheets(1), но это неудобно, когда много листов и они то добавляются, то удаляются.
Я в VB ноль без палочки, как говорится, вот уже полдня просидел, но не пойму, где у меня ошибка, и почему не получается никак выполнить условие проверки данных на предмет совпадения. Пример во вложении. Там в комментариях я постарался тоже описать свои вопросы, чтобы было понятно, что я пытаюсь сделать. [moder]Оформляйте коды тегами (кнопка #). Исправила на первый раз[/moder]
Доброй поры суток, уважаемые форумчане. Прошу помощи в решении следующего вопроса.
Имеется определенный массив данных для анализа. Небольшую часть его я приложил в примере. Данные находятся на двух листах: ТЕСТ и РЕЗУЛЬТАТЫ. Задача: нужно взять некоторые данные из листа РЕЗУЛЬТАТЫ и скопировать их на лист ТЕСТ при выполнении определенных условий. Условие1: если дата находится в соответствующем диапазоне Условие2: если совпадают "дата игры" и "название команды" в обоих листах в соответствующих ячейках, то скопировать соответствующий результат.
И хотелось бы, чтобы эти все действия выполнялись по нажатию кнопки. Т.е. заполняется данными один лист, а потом другой, а потом я жму кнопку и происходит обработка этих данных.
Использую вот такой код в модуле
..................
[vba]
Код
Sub UDAL(data_1, data_2 As Date) Dim d1&, n1&, d2&, n2&, i&, j& Application.ScreenUpdating = False d1 = Sheets(1).Range("B" & Rows.Count).End(xlUp).Row n1 = Sheets(1).Range("C" & Rows.Count).End(xlUp).Row d2 = Sheets(2).Range("A" & Rows.Count).End(xlUp).Row
For i = 1 To d1
For j = 1 To d2
If Sheets(1).Cells(i, 2).End(xlUp).Offset(0, 0) = Sheets(2).Cells(j, 1).End(xlUp).Offset(0, 0) Then If (InStr(Sheets(1).Cells(i, 3), Sheets(2).Cells(j, 2)) = 1) And (InStr(Sheets(1).Cells(i, 3), Sheets(2).Cells(j, 3)) = 1) Then
Next Next Application.ScreenUpdating = True End Sub
[/vba]
..................
Ошибок VBA не выдает, но и результатов тоже... ((
И второй вопрос, гораздо менее важный, но все-таки: если пишу Sheets("тест"), выдает ошибку out of range, т.е. приходится писать Sheets(1), но это неудобно, когда много листов и они то добавляются, то удаляются.
Я в VB ноль без палочки, как говорится, вот уже полдня просидел, но не пойму, где у меня ошибка, и почему не получается никак выполнить условие проверки данных на предмет совпадения. Пример во вложении. Там в комментариях я постарался тоже описать свои вопросы, чтобы было понятно, что я пытаюсь сделать. [moder]Оформляйте коды тегами (кнопка #). Исправила на первый раз[/moder]shurc
где у меня ошибка, и почему не получается никак выполнить условие проверки данных на предмет совпадения
Проверяйте [vba]
Код
Public data1 As Date Public data2 As Date
Private Sub CommandButton1_Click() data1 = Range("H1") data2 = Range("I1") Call UDAL(data1, data2) End Sub
Sub UDAL(data_1, data_2 As Date) Dim d1&, i& Dim iDate As Date Dim FoundDate As Range Application.ScreenUpdating = False d1 = Sheets("тест").Range("B" & Rows.Count).End(xlUp).Row Range("G2:G" & d1).ClearContents 'очищаем результат For i = 2 To d1 If Cells(i, 2) >= data_1 And Cells(i, 2) <= data_2 Then ' тогда идем дальше iDate = Cells(i, 2) With Worksheets("результаты") Set FoundDate = .Columns(1).Find(iDate, , xlFormulas, xlWhole) If Not FoundDate Is Nothing Then 'нашли дату на листе результаты If InStr(Cells(i, 3), .Cells(FoundDate.Row, 2)) <> 0 _ And InStr(Cells(i, 3), .Cells(FoundDate.Row, 3)) <> 0 Then 'проверяем команды Cells(i, 7) = .Cells(FoundDate.Row, 4) End If End If End With End If '- конец условного блока по органичению по дате Next ' конец 1-го ц Application.ScreenUpdating = True End Sub
[/vba]
Цитата
где у меня ошибка, и почему не получается никак выполнить условие проверки данных на предмет совпадения
Проверяйте [vba]
Код
Public data1 As Date Public data2 As Date
Private Sub CommandButton1_Click() data1 = Range("H1") data2 = Range("I1") Call UDAL(data1, data2) End Sub
Sub UDAL(data_1, data_2 As Date) Dim d1&, i& Dim iDate As Date Dim FoundDate As Range Application.ScreenUpdating = False d1 = Sheets("тест").Range("B" & Rows.Count).End(xlUp).Row Range("G2:G" & d1).ClearContents 'очищаем результат For i = 2 To d1 If Cells(i, 2) >= data_1 And Cells(i, 2) <= data_2 Then ' тогда идем дальше iDate = Cells(i, 2) With Worksheets("результаты") Set FoundDate = .Columns(1).Find(iDate, , xlFormulas, xlWhole) If Not FoundDate Is Nothing Then 'нашли дату на листе результаты If InStr(Cells(i, 3), .Cells(FoundDate.Row, 2)) <> 0 _ And InStr(Cells(i, 3), .Cells(FoundDate.Row, 3)) <> 0 Then 'проверяем команды Cells(i, 7) = .Cells(FoundDate.Row, 4) End If End If End With End If '- конец условного блока по органичению по дате Next ' конец 1-го ц Application.ScreenUpdating = True End Sub
Скопировал целиком пример Кузьмича и у меня тоже все заработало без ошибок. Возможно, в моем исходном файле были какие-то другие недочеты, а вылазило именно в этом месте.
Скопировал целиком пример Кузьмича и у меня тоже все заработало без ошибок. Возможно, в моем исходном файле были какие-то другие недочеты, а вылазило именно в этом месте.shurc
Function Substring(Текст As String, Символ_разделитель As String, _ Начальный_Номер_фрагмента As Long, Конечный_Номер_фрагмента As Long) As String '--------------------------------------------------------------------------------------- ' URL : http://www.planetaexcel.ru/tip.php?aid=54 ' Purpose : Выделяет из текста субстринг/и, ориентируясь по символам-разделителям ' Notes : Substring(текст; символ_разделитель; Начальный_Номер_фрагмента, Конечный_Номер_фрагмента), где ' текст - текст, который делим ' символ_разделитель - символ, который надо считать разделителем фрагментов ' Начальный_Номер_фрагмента - порядковый номер фрагмента, с которого нужна выборка ' Конечный_Номер_фрагмента - порядковый номер фрагмента, по который нужна выборка '--------------------------------------------------------------------------------------- On Error Resume Next Dim sArr() As String, li As Long sArr = Split(Application.Trim(Текст), Символ_разделитель) If Конечный_Номер_фрагмента > 0 Then Начальный_Номер_фрагмента = Начальный_Номер_фрагмента - 1 Конечный_Номер_фрагмента = Конечный_Номер_фрагмента - 1 For li = Начальный_Номер_фрагмента To Конечный_Номер_фрагмента Substring = IIf(li = Начальный_Номер_фрагмента, sArr(li), Substring & _ Символ_разделитель & sArr(li)) Next li Else Substring = Split(Application.Trim(Текст), _ Символ_разделитель)(Начальный_Номер_фрагмента - 1) End If End Function
[/vba]
Код
=Substring(G2;":";1;1)
Код
=Substring(SUBSTITUTE(G2;" ";":");":";2;2)
[vba]
Код
Function Substring(Текст As String, Символ_разделитель As String, _ Начальный_Номер_фрагмента As Long, Конечный_Номер_фрагмента As Long) As String '--------------------------------------------------------------------------------------- ' URL : http://www.planetaexcel.ru/tip.php?aid=54 ' Purpose : Выделяет из текста субстринг/и, ориентируясь по символам-разделителям ' Notes : Substring(текст; символ_разделитель; Начальный_Номер_фрагмента, Конечный_Номер_фрагмента), где ' текст - текст, который делим ' символ_разделитель - символ, который надо считать разделителем фрагментов ' Начальный_Номер_фрагмента - порядковый номер фрагмента, с которого нужна выборка ' Конечный_Номер_фрагмента - порядковый номер фрагмента, по который нужна выборка '--------------------------------------------------------------------------------------- On Error Resume Next Dim sArr() As String, li As Long sArr = Split(Application.Trim(Текст), Символ_разделитель) If Конечный_Номер_фрагмента > 0 Then Начальный_Номер_фрагмента = Начальный_Номер_фрагмента - 1 Конечный_Номер_фрагмента = Конечный_Номер_фрагмента - 1 For li = Начальный_Номер_фрагмента To Конечный_Номер_фрагмента Substring = IIf(li = Начальный_Номер_фрагмента, sArr(li), Substring & _ Символ_разделитель & sArr(li)) Next li Else Substring = Split(Application.Trim(Текст), _ Символ_разделитель)(Начальный_Номер_фрагмента - 1) End If End Function
Вот только дата может повторятся на листе РЕЗУЛЬТАТЫ несколько раз.
Тогда надо в стандартный модуль ввести команду FindNext, посмотрите [vba]
Код
Sub UDAL(data_1, data_2 As Date) Dim d1&, i& Dim iDate As Date Dim FoundDate As Range Dim FirstDate As String Application.ScreenUpdating = False d1 = Sheets("тест").Range("B" & Rows.Count).End(xlUp).Row Range("G2:G" & d1).ClearContents 'очищаем результат For i = 2 To d1 If Cells(i, 2) >= data_1 And Cells(i, 2) <= data_2 Then ' тогда идем дальше iDate = Cells(i, 2) With Worksheets("результаты") Set FoundDate = .Columns(1).Find(iDate, , xlFormulas, xlWhole) If Not FoundDate Is Nothing Then 'нашли дату на листе результаты FirstDate = FoundDate.Address Do If InStr(Cells(i, 3), .Cells(FoundDate.Row, 2)) <> 0 _ And InStr(Cells(i, 3), .Cells(FoundDate.Row, 3)) <> 0 Then 'проверяем команды Cells(i, 7) = .Cells(FoundDate.Row, 4) Exit Do End If Set FoundDate = .Columns(1).FindNext(FoundDate) Loop While FoundDate.Address <> FirstDate End If End With End If '- конец условного блока по органичению по дате Next ' конец 1-го ц Application.ScreenUpdating = True End Sub
[/vba]
Цитата
Вот только дата может повторятся на листе РЕЗУЛЬТАТЫ несколько раз.
Тогда надо в стандартный модуль ввести команду FindNext, посмотрите [vba]
Код
Sub UDAL(data_1, data_2 As Date) Dim d1&, i& Dim iDate As Date Dim FoundDate As Range Dim FirstDate As String Application.ScreenUpdating = False d1 = Sheets("тест").Range("B" & Rows.Count).End(xlUp).Row Range("G2:G" & d1).ClearContents 'очищаем результат For i = 2 To d1 If Cells(i, 2) >= data_1 And Cells(i, 2) <= data_2 Then ' тогда идем дальше iDate = Cells(i, 2) With Worksheets("результаты") Set FoundDate = .Columns(1).Find(iDate, , xlFormulas, xlWhole) If Not FoundDate Is Nothing Then 'нашли дату на листе результаты FirstDate = FoundDate.Address Do If InStr(Cells(i, 3), .Cells(FoundDate.Row, 2)) <> 0 _ And InStr(Cells(i, 3), .Cells(FoundDate.Row, 3)) <> 0 Then 'проверяем команды Cells(i, 7) = .Cells(FoundDate.Row, 4) Exit Do End If Set FoundDate = .Columns(1).FindNext(FoundDate) Loop While FoundDate.Address <> FirstDate End If End With End If '- конец условного блока по органичению по дате Next ' конец 1-го ц Application.ScreenUpdating = True End Sub
Как разбить подобные строки на отдельные переменные чисельного типа
Можно разбить так, (в какие столбцы разбивать выберите сами) [vba]
Код
Sub Razdel() Dim i As Long Dim iLastRow As Long iLastRow = Cells(Rows.Count, 7).End(xlUp).Row For i = 2 To iLastRow If Not IsEmpty(Cells(i, 7)) Then Cells(i, 5) =Val( Split(Split(Cells(i, 7), "(")(0), ":")(0)) Cells(i, 6) =Val( Split(Split(Cells(i, 7), "(")(0), ":")(1)) End If Next End Sub
[/vba]
Цитата
Как разбить подобные строки на отдельные переменные чисельного типа
Можно разбить так, (в какие столбцы разбивать выберите сами) [vba]
Код
Sub Razdel() Dim i As Long Dim iLastRow As Long iLastRow = Cells(Rows.Count, 7).End(xlUp).Row For i = 2 To iLastRow If Not IsEmpty(Cells(i, 7)) Then Cells(i, 5) =Val( Split(Split(Cells(i, 7), "(")(0), ":")(0)) Cells(i, 6) =Val( Split(Split(Cells(i, 7), "(")(0), ":")(1)) End If Next End Sub
Hugo, благодарю за функцию. Разжёвано как раз для меня! ) +1 Kuzmich, еще раз спасибо за индивидуальный подход )) Ctrl+C -> Ctrl+V и все работает в моей книге!
Hugo, благодарю за функцию. Разжёвано как раз для меня! ) +1 Kuzmich, еще раз спасибо за индивидуальный подход )) Ctrl+C -> Ctrl+V и все работает в моей книге!shurc