Доброго всем времени суток. Есть задачка, одно из условий которой является выделение одного столбца в зависимости от дня и способа производства. День это СЕГОДНЯ(), способ производства находится в ячейке К9. К сожалению нет времени научится делать самому, начальство торопит Можно просто Select. Дальше сам попробую додумать
Доброго всем времени суток. Есть задачка, одно из условий которой является выделение одного столбца в зависимости от дня и способа производства. День это СЕГОДНЯ(), способ производства находится в ячейке К9. К сожалению нет времени научится делать самому, начальство торопит Можно просто Select. Дальше сам попробую додуматькитин
Выделить столбец с помощью макроса не получается - выделяется несколько столбцов из-за объединенных ячеек в строке 5. Этот макрос выделяет только ячейку в строке 10.
[vba]
Код
Sub Найти()
Dim arr(), lc As Long, j As Long Dim criteria1, criteria2
criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column arr() = Range("A10").Resize(2, lc).Value For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Cells(10, j).Select Exit For End If Next j
End Sub
[/vba]
Выделить столбец с помощью макроса не получается - выделяется несколько столбцов из-за объединенных ячеек в строке 5. Этот макрос выделяет только ячейку в строке 10.
[vba]
Код
Sub Найти()
Dim arr(), lc As Long, j As Long Dim criteria1, criteria2
criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column arr() = Range("A10").Resize(2, lc).Value For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Cells(10, j).Select Exit For End If Next j
Цикл от столбца 16 до последнего столбца, в котором есть данные в строке 10. В Вашем файле последний столбец GA. Вот до него макрос и будет просматривать. По массиву быстрее двигаться, поэтому макрос двигается не по листу, а по массиву.
Цикл от столбца 16 до последнего столбца, в котором есть данные в строке 10. В Вашем файле последний столбец GA. Вот до него макрос и будет просматривать. По массиву быстрее двигаться, поэтому макрос двигается не по листу, а по массиву.Karataev
Может, тебе нужно выделить не весь столбец, а толькро внутри таблицы? Тогда в макросе Олега (самому лень писать, уж если готовый есть) одну строку поменять нужно [vba]
Код
Sub Найти() Dim arr(), lc As Long, j As Long Dim criteria1, criteria2 criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column arr() = Rows("10:11").Value For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Cells(13, j).Resize(Range("B" & Rows.Count).End(3).Row - 12, 1).Select'<<<Вот эту строку Exit For End If Next j End Sub
[/vba]
Может, тебе нужно выделить не весь столбец, а толькро внутри таблицы? Тогда в макросе Олега (самому лень писать, уж если готовый есть) одну строку поменять нужно [vba]
Код
Sub Найти() Dim arr(), lc As Long, j As Long Dim criteria1, criteria2 criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column arr() = Rows("10:11").Value For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Cells(13, j).Resize(Range("B" & Rows.Count).End(3).Row - 12, 1).Select'<<<Вот эту строку Exit For End If Next j End Sub
Точно. А я, конечно же, не заметил. Но неважно. Нужно только одну строку поменять. Я ее пометил в макросе. А может и не нужно. Мы ж так и не выяснили, что Игорь хочет потом делать.
Точно. А я, конечно же, не заметил. Но неважно. Нужно только одну строку поменять. Я ее пометил в макросе. А может и не нужно. Мы ж так и не выяснили, что Игорь хочет потом делать._Boroda_
спасибо вам. я тоже малость переделал код Олега Karataev, под выделение внутри таблицы( прошу прощения за неточность)
[vba]
Код
Sub Найти()
Dim arr(), lc As Long, j As Long, lr As Long Dim criteria1, criteria2
criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column lr = Cells(Rows.Count, 3).End(xlUp).Row arr() = Rows("10:11").Value For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Range(Cells(10, j), Cells(lr, j)).Select Exit For End If Next j
End Sub
[/vba]
только вот почему не дает объявить массив, ограниченный опр. рамками? вот такой [vba]
Код
arr() = Rows("P10:GA11").Value
[/vba] понял не Rows а Range
спасибо вам. я тоже малость переделал код Олега Karataev, под выделение внутри таблицы( прошу прощения за неточность)
[vba]
Код
Sub Найти()
Dim arr(), lc As Long, j As Long, lr As Long Dim criteria1, criteria2
criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column lr = Cells(Rows.Count, 3).End(xlUp).Row arr() = Rows("10:11").Value For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Range(Cells(10, j), Cells(lr, j)).Select Exit For End If Next j
End Sub
[/vba]
только вот почему не дает объявить массив, ограниченный опр. рамками? вот такой [vba]
второй вопрос.далее мне надо все данные из этого столбца перенести в завтрашний( сложив эти данные с данными столбца из завтра) попробую сам наваять китин
Не судите очень строго:я пытаюсь научиться ЯД 41001877306852
китин, Вы используете не ту версию моего макроса. Я внес изменения в макрос в посте 2. В этой версии в массив arr помещаются строки не циликом, а с первого столбца по последний, в котором есть данные в строке 10. Не вижу смысла его переделывать, т.к. так даже удобнее искать проблемы, если будут, т.к. будет соответствие между листом и массивом.
[vba]
Код
Sub Найти()
Dim arr(), lc As Long, j As Long Dim criteria1, criteria2
criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column arr() = Range("A10").Resize(2, lc).Value For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Cells(10, j).Select Exit For End If Next j
End Sub
[/vba]
Что касается Вашего вопроса, то нужно записать так (вместо Rows Range): [vba]
Код
rr() = Range("P10:GA11").Value
[/vba] Но в этом случае надо начинать j не с 16, а с 1. И нужно еще здесь корректировать j: [vba]
Код
Cells(10, j+15).Select
[/vba]
китин, Вы используете не ту версию моего макроса. Я внес изменения в макрос в посте 2. В этой версии в массив arr помещаются строки не циликом, а с первого столбца по последний, в котором есть данные в строке 10. Не вижу смысла его переделывать, т.к. так даже удобнее искать проблемы, если будут, т.к. будет соответствие между листом и массивом.
[vba]
Код
Sub Найти()
Dim arr(), lc As Long, j As Long Dim criteria1, criteria2
criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column arr() = Range("A10").Resize(2, lc).Value For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Cells(10, j).Select Exit For End If Next j
End Sub
[/vba]
Что касается Вашего вопроса, то нужно записать так (вместо Rows Range): [vba]
Код
rr() = Range("P10:GA11").Value
[/vba] Но в этом случае надо начинать j не с 16, а с 1. И нужно еще здесь корректировать j: [vba]
Олег мне нужен был пинок, я его получил. спасибо .Самому никак не удавалось присвоить переменным значения СЕГОДНЯ() и ячейки К9. Теперь есть два варианта
Олег мне нужен был пинок, я его получил. спасибо .Самому никак не удавалось присвоить переменным значения СЕГОДНЯ() и ячейки К9. Теперь есть два вариантакитин
Не судите очень строго:я пытаюсь научиться ЯД 41001877306852
criteria1 = Date criteria2 = Range("K9").Value arr() = Range("P10:GA11").Value For j = 1 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Range("P10:GA11").Columns(j).Select Exit For End If Next j
End Sub
[/vba]
китин, вариант по Вашим вопросам:
[vba]
Код
Sub Найти()
Dim arr(), j As Long Dim criteria1, criteria2
criteria1 = Date criteria2 = Range("K9").Value arr() = Range("P10:GA11").Value For j = 1 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Range("P10:GA11").Columns(j).Select Exit For End If Next j
ну вот, с вашей помощью наваял какое то подобие макроса. у меня работает. критика приветствуется и ожидается
[vba]
Код
Sub videlit() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False
Dim arr(), lc As Long, j As Long, lr As Long Dim criteria1, criteria2 lr = Cells(Rows.Count, 3).End(xlUp).Row criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column arr() = Range("A10").Resize(2, lc).Value For i = 13 To lr For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Cells(i, j).Select Application.EnableEvents = False If Cells(i, j).Value <> "" Then Cells(i, j + 6).Value = Cells(i, j + 6).Value + Cells(i, j).Value Cells(i, j).ClearContents Application.EnableEvents = True Exit For End If Next j Next i Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
[/vba]
ну вот, с вашей помощью наваял какое то подобие макроса. у меня работает. критика приветствуется и ожидается
[vba]
Код
Sub videlit() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False
Dim arr(), lc As Long, j As Long, lr As Long Dim criteria1, criteria2 lr = Cells(Rows.Count, 3).End(xlUp).Row criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column arr() = Range("A10").Resize(2, lc).Value For i = 13 To lr For j = 16 To UBound(arr, 2) If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then Cells(i, j).Select Application.EnableEvents = False If Cells(i, j).Value <> "" Then Cells(i, j + 6).Value = Cells(i, j + 6).Value + Cells(i, j).Value Cells(i, j).ClearContents Application.EnableEvents = True Exit For End If Next j Next i Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
Не критика, а комментарии. Я прямо в макросе написал
[vba]
Код
Sub videlit1() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False
Dim arr(), lc As Long, j As Long, lr As Long Dim criteria1, criteria2 lr = Cells(Rows.Count, 3).End(xlUp).Row criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column 'До этой строки ничего не трогал. Новые переменные не объявлял. Патамушта лентяй c0_ = 16 arr() = Cells(10, c0_).Resize(2, lc).Value 'массив меньше, там только нужные значения For s = c0_ To UBound(arr, 2) 'цикл по нему If arr(1, s) = criteria1 And arr(2, s) = criteria2 Then c1_ = s + c0_ - 1 Exit For 'сразу определяем столбец для работы, а не ищем его заново для каждого прохода цикла по i End If Next s Application.EnableEvents = False 'Обработчик событий лучше включить один раз перед циклом 'обычно все Application складывают вместе или вначале, или там, где начинается работа на листе For i = 13 To lr ' For j = с0_ To UBound(arr, 2) ' If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then ' Cells(i, j).Select'Зачем это? ' Application.EnableEvents = False With Cells(i, c1_) 'чтобы не обращаться к ячейке несколько раз If .Value <> "" Then .Offset(, 6).Value = .Offset(, 6).Value + .Value .ClearContents End If ' Cells(i, j).ClearContents'зачем стирать и так пустую ячейку? End With ' Application.EnableEvents = True ' Exit For ' End If ' Next j Next i Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True MsgBox "Всё" End Sub
Не критика, а комментарии. Я прямо в макросе написал
[vba]
Код
Sub videlit1() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False
Dim arr(), lc As Long, j As Long, lr As Long Dim criteria1, criteria2 lr = Cells(Rows.Count, 3).End(xlUp).Row criteria1 = Date criteria2 = Range("K9").Value lc = Cells(10, Columns.Count).End(xlToLeft).Column 'До этой строки ничего не трогал. Новые переменные не объявлял. Патамушта лентяй c0_ = 16 arr() = Cells(10, c0_).Resize(2, lc).Value 'массив меньше, там только нужные значения For s = c0_ To UBound(arr, 2) 'цикл по нему If arr(1, s) = criteria1 And arr(2, s) = criteria2 Then c1_ = s + c0_ - 1 Exit For 'сразу определяем столбец для работы, а не ищем его заново для каждого прохода цикла по i End If Next s Application.EnableEvents = False 'Обработчик событий лучше включить один раз перед циклом 'обычно все Application складывают вместе или вначале, или там, где начинается работа на листе For i = 13 To lr ' For j = с0_ To UBound(arr, 2) ' If arr(1, j) = criteria1 And arr(2, j) = criteria2 Then ' Cells(i, j).Select'Зачем это? ' Application.EnableEvents = False With Cells(i, c1_) 'чтобы не обращаться к ячейке несколько раз If .Value <> "" Then .Offset(, 6).Value = .Offset(, 6).Value + .Value .ClearContents End If ' Cells(i, j).ClearContents'зачем стирать и так пустую ячейку? End With ' Application.EnableEvents = True ' Exit For ' End If ' Next j Next i Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True MsgBox "Всё" End Sub