Здравствуйте, уважаемые форумчане! Нужен ваш опыт в написании макросов. Задача кажется простой, но у меня мало опыта в решении. Необходим макрос, который может копировать данные из определенной условием ячейки в ячейку на другом листе. тоже с условием. Условия такие, в Листе 1 есть список месяцев, например выбираем "сентябрь" и выполняем макрос который скопирует ячейку D13 в J8(лист2), C9 в J7(лист2), B5 в J6(лист2) (столбец J(лист2) соответствует "сентябрю", B(лист2) "январю" и т.д, т.е. каждый столбец определенному месяцу). и закрасит ячейки в которые перенесены данные, но при условии, что в J8(лист2), J7(лист2) и J6(лист2) отсутствуют другие данные. Если данные в J8, J7 и J6 есть то они остаются без изменения, но перекрашиваются в другой цвет.
Здравствуйте, уважаемые форумчане! Нужен ваш опыт в написании макросов. Задача кажется простой, но у меня мало опыта в решении. Необходим макрос, который может копировать данные из определенной условием ячейки в ячейку на другом листе. тоже с условием. Условия такие, в Листе 1 есть список месяцев, например выбираем "сентябрь" и выполняем макрос который скопирует ячейку D13 в J8(лист2), C9 в J7(лист2), B5 в J6(лист2) (столбец J(лист2) соответствует "сентябрю", B(лист2) "январю" и т.д, т.е. каждый столбец определенному месяцу). и закрасит ячейки в которые перенесены данные, но при условии, что в J8(лист2), J7(лист2) и J6(лист2) отсутствуют другие данные. Если данные в J8, J7 и J6 есть то они остаются без изменения, но перекрашиваются в другой цвет.probetter
Dim sh1 As Excel.Worksheet, sh2 As Excel.Worksheet Dim arrSh1() As Variant Dim i As Long, j As Long, k As Long
'1. Даём VBA-имена "sh1" и "sh2" листам, чтобы удобнее 'писать код (чтобы меньше кода писать). Set sh1 = Worksheets(1) Set sh2 = Worksheets(2)
'2. Для упрощения написания кода берём данные 'из листа 1 в VBA-массив. 'Создаём три элемента в массиве. ReDim arrSh1(1 To 3) 'Берём данные из Excel-листа в VBA-массив. 'В цикле с "i" двигаеся со строки 5 до строки 13. 'Двигаемся через четрые строки (Step 4). 'C помощью переменной "j" передвигаемся по столбцам Excel-листа. j = 2 For i = 5 To 13 Step 4 'С помощью переменной "k" двигаемся по массиву. k = k + 1 arrSh1(k) = sh1.Cells(i, j).Value 'Переход к следующему столбцу на Excel-листе. j = j + 1 Next i
'3. Копируем данные из листа 1 на лист 2. 'В цикле с "i" двигаемся по строкам на листе 2. 'С помощью переменной "j" двигаемся по массиву "arrSh1". 'Очищаем переменную "j" от предыдущего использования. j = 0 For i = 6 To 8 Step 1
'Переход к следующему элементу в массиве "arrSh1". j = j + 1
'Если в ячейке пусто. If IsEmpty(sh2.Cells(i, "J")) = True Then 'Копируем данные из листа 1 на лист 2. sh2.Cells(i, "J").Value = arrSh1(j) 'Делаем заливку у ячейки. sh2.Cells(i, "J").Interior.Color = 65535 End If
Next i
End Sub
[/vba]
[vba]
Код
Sub Procedure_1()
Dim sh1 As Excel.Worksheet, sh2 As Excel.Worksheet Dim arrSh1() As Variant Dim i As Long, j As Long, k As Long
'1. Даём VBA-имена "sh1" и "sh2" листам, чтобы удобнее 'писать код (чтобы меньше кода писать). Set sh1 = Worksheets(1) Set sh2 = Worksheets(2)
'2. Для упрощения написания кода берём данные 'из листа 1 в VBA-массив. 'Создаём три элемента в массиве. ReDim arrSh1(1 To 3) 'Берём данные из Excel-листа в VBA-массив. 'В цикле с "i" двигаеся со строки 5 до строки 13. 'Двигаемся через четрые строки (Step 4). 'C помощью переменной "j" передвигаемся по столбцам Excel-листа. j = 2 For i = 5 To 13 Step 4 'С помощью переменной "k" двигаемся по массиву. k = k + 1 arrSh1(k) = sh1.Cells(i, j).Value 'Переход к следующему столбцу на Excel-листе. j = j + 1 Next i
'3. Копируем данные из листа 1 на лист 2. 'В цикле с "i" двигаемся по строкам на листе 2. 'С помощью переменной "j" двигаемся по массиву "arrSh1". 'Очищаем переменную "j" от предыдущего использования. j = 0 For i = 6 To 8 Step 1
'Переход к следующему элементу в массиве "arrSh1". j = j + 1
'Если в ячейке пусто. If IsEmpty(sh2.Cells(i, "J")) = True Then 'Копируем данные из листа 1 на лист 2. sh2.Cells(i, "J").Value = arrSh1(j) 'Делаем заливку у ячейки. sh2.Cells(i, "J").Interior.Color = 65535 End If
Частично работает, спасибо! Но не работает при условии если из списка выбран дрогой месяц, тогда должно копироваться в соответствующий месяцу столбец, в те же строки что и ранее. И не перекрашивается в другой цвет( например красный), если выполняешь макрос, но ячейки уже заполнены предыдущими данными.( Т.е. копирование должно происходить, если ячейки пустые.) P.S. F1 - это выпадающий список.
Частично работает, спасибо! Но не работает при условии если из списка выбран дрогой месяц, тогда должно копироваться в соответствующий месяцу столбец, в те же строки что и ранее. И не перекрашивается в другой цвет( например красный), если выполняешь макрос, но ячейки уже заполнены предыдущими данными.( Т.е. копирование должно происходить, если ячейки пустые.) P.S. F1 - это выпадающий список.probetter
Сообщение отредактировал probetter - Пятница, 19.07.2013, 12:12
probetter, не заметил сразу список, поэтому не понял, как макрос должен работать.
Вот другой вариант макроса:
[vba]
Код
Sub Procedure_1()
Dim sh1 As Excel.Worksheet, sh2 As Excel.Worksheet Dim arrSh1() As Variant Dim myFind As Excel.Range Dim myColumn As Long Dim i As Long, j As Long, k As Long
'1. Даём VBA-имена "sh1" и "sh2" листам, чтобы удобнее 'писать код (чтобы меньше кода писать). Set sh1 = Worksheets(1) Set sh2 = Worksheets(2)
'2. Для упрощения написания кода берём данные 'из листа 1 в VBA-массив. 'Создаём три элемента в массиве. ReDim arrSh1(1 To 3) 'Берём данные из Excel-листа в VBA-массив. 'В цикле с "i" двигаеся со строки 5 до строки 13. 'Двигаемся через четрые строки (Step 4). 'C помощью переменной "j" передвигаемся по столбцам Excel-листа. j = 2 For i = 5 To 13 Step 4 'С помощью переменной "k" двигаемся по массиву. k = k + 1 arrSh1(k) = sh1.Cells(i, j).Value 'Переход к следующему столбцу на Excel-листе. j = j + 1 Next i
'3. Определяем, в какой столбец на листе 2 нужно 'вставить данные из листа 1. '3.1. Ищем на листе 2 в первой строке текст из листа 1 'из ячейки "F1". 'Если будет найдено, то переменная "myFind" будет 'представлять собой найденную ячейку. Set myFind = sh2.Rows(1).Find(What:=sh1.Range("F1").Value, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) '3.2. Берём номер столбца, в котором было найдено. myColumn = myFind.Column
'4. Копируем данные из листа 1 на лист 2. 'В цикле с "i" двигаемся по строкам на листе 2. 'С помощью переменной "j" двигаемся по массиву "arrSh1". 'Очищаем переменную "j" от предыдущего использования. j = 0 For i = 6 To 8 Step 1
'Переход к следующему элементу в массиве "arrSh1". j = j + 1
'Если в ячейке пусто. If IsEmpty(sh2.Cells(i, myColumn)) = True Then 'Копируем данные из листа 1 на лист 2. sh2.Cells(i, myColumn).Value = arrSh1(j) 'Делаем заливку у ячейки. sh2.Cells(i, myColumn).Interior.Color = 65535 End If
Next i
End Sub
[/vba]
probetter, не заметил сразу список, поэтому не понял, как макрос должен работать.
Вот другой вариант макроса:
[vba]
Код
Sub Procedure_1()
Dim sh1 As Excel.Worksheet, sh2 As Excel.Worksheet Dim arrSh1() As Variant Dim myFind As Excel.Range Dim myColumn As Long Dim i As Long, j As Long, k As Long
'1. Даём VBA-имена "sh1" и "sh2" листам, чтобы удобнее 'писать код (чтобы меньше кода писать). Set sh1 = Worksheets(1) Set sh2 = Worksheets(2)
'2. Для упрощения написания кода берём данные 'из листа 1 в VBA-массив. 'Создаём три элемента в массиве. ReDim arrSh1(1 To 3) 'Берём данные из Excel-листа в VBA-массив. 'В цикле с "i" двигаеся со строки 5 до строки 13. 'Двигаемся через четрые строки (Step 4). 'C помощью переменной "j" передвигаемся по столбцам Excel-листа. j = 2 For i = 5 To 13 Step 4 'С помощью переменной "k" двигаемся по массиву. k = k + 1 arrSh1(k) = sh1.Cells(i, j).Value 'Переход к следующему столбцу на Excel-листе. j = j + 1 Next i
'3. Определяем, в какой столбец на листе 2 нужно 'вставить данные из листа 1. '3.1. Ищем на листе 2 в первой строке текст из листа 1 'из ячейки "F1". 'Если будет найдено, то переменная "myFind" будет 'представлять собой найденную ячейку. Set myFind = sh2.Rows(1).Find(What:=sh1.Range("F1").Value, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) '3.2. Берём номер столбца, в котором было найдено. myColumn = myFind.Column
'4. Копируем данные из листа 1 на лист 2. 'В цикле с "i" двигаемся по строкам на листе 2. 'С помощью переменной "j" двигаемся по массиву "arrSh1". 'Очищаем переменную "j" от предыдущего использования. j = 0 For i = 6 To 8 Step 1
'Переход к следующему элементу в массиве "arrSh1". j = j + 1
'Если в ячейке пусто. If IsEmpty(sh2.Cells(i, myColumn)) = True Then 'Копируем данные из листа 1 на лист 2. sh2.Cells(i, myColumn).Value = arrSh1(j) 'Делаем заливку у ячейки. sh2.Cells(i, myColumn).Interior.Color = 65535 End If
Спасибо за помощь, оба варианта рабочие! Но в варианте "СКРИПТА" не выполняется условие, по закрашиванию ячейки в другой цвет, если в ячейке уже есть данные и они не изменились, т.к. копируется только в пустую ячейку. В варианте "Wasilic" все работает.
СПАСИБО!
Спасибо за помощь, оба варианта рабочие! Но в варианте "СКРИПТА" не выполняется условие, по закрашиванию ячейки в другой цвет, если в ячейке уже есть данные и они не изменились, т.к. копируется только в пустую ячейку. В варианте "Wasilic" все работает.