Страницы: 1
RSS
VBA: Проверка наличия значения и добавление его при отсутствии
 
Всем привет.  
 
Имеются два листа.  
1. Выделяем на Листе2 диапазон, скажем, A1:A5, строки всегда меняются, столбец всегда А  
1. Надо проверить, содержится ли в столбце A Листа1 значения ячейки A1 Листа2.  
2. Если да - перейти к следующей ячейке выделенного диапазона.  
3. Если нет, то:  
а) найти в столбце В Листа1 значения ячейки В1 Листа2,  
б) добавить строку ниже найденной ячейки  
в) скопировать в нее формулы из строки выше (очень желательно только формулы, а ячейки со значениями - не копировать),  
г) в ячейки столбцов С, D, E новой строки Листа1 откопировать значения из ячеек С1, D1, E1 Листа2 (при переходе к ячейке А2 - из ячеек С2, D2, E2 соответственно и т.д.)  
4. Проделать со всеми ячейками выделенного диапазона.  
 
Нужна помощь :-[
 
Забыла, еще есть  
 
д) отформатировать новую строку по образцу в зависимости от получившегося значения в столбце F
 
{quote}{login=Warbler}{date=07.09.2010 01:33}{thema=P.S.}{post}отформатировать новую строку по образцу {/post}{/quote}  
Образец для форматирования очень понравился. Как Вы это сделали?
 
А файла с примером не будет? :-[
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Например, вот так:  
 
Sub Copy_Formats()  
   Range("D6").Select  
   Selection.Copy  
   Range("D10").Select  
   Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _  
       SkipBlanks:=False, Transpose:=False  
End Sub
 
{quote}{login=гость}{date=07.09.2010 02:01}{thema=}{post}А файла с примером не будет? :-[{/post}{/quote} Просто есть пример файла но пока нет примера макроса
 
{quote}{login=Warbler}{date=07.09.2010 02:03}{thema=}{post}Например, вот так:  
 
Sub Copy_Formats()  
   Range("D6").Select  
   Selection.Copy  
   Range("D10").Select  
   Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _  
       SkipBlanks:=False, Transpose:=False  
End Sub{/post}{/quote}  
 
или вот так:  
 
Sub Copy_Formats()  
   Range("D6").Copy  
   Range("D10").PasteSpecial Paste:=xlPasteFormats, _  
                             Operation:=xlNone, _  
                             SkipBlanks:=False, _  
                             Transpose:=False  
End Sub  
 
Файл с примером данных будет?  
(утром файл - вечером макрос, или вечером — файл, а на другой день утром — макрос. А другие условия душа не принимает) (сорри, :) )  
Вопросы:  
а) что делать, если в столбце В Листа1 значения ячейки В1 Листа2 - не найти?  
в) т.е. если не формулы - то вообще ничего не копировать?
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
{quote}{login=гость}Файл с примером данных будет?{/quote} Так уже ведь приложила в предыдущем посте :)
 
{quote}{login=гость}{date=07.09.2010 02:35}{thema=Re: }{post}Вопросы:  
а) что делать, если в столбце В Листа1 значения ячейки В1 Листа2 - не найти?  
в) т.е. если не формулы - то вообще ничего не копировать?{/post}{/quote}  
Ответы:  
1. Спасибо, пока не сталкивалась с ситуацией, что значения В1 не было, поэтому не подумала, что делать. Наверное, проще всего сказать пользователю: Создай раздел "В1".  
2. Как правило, формул нет только в столбцах С, D, E, в которые и переносятся данные с Листа2. Если не формулы - ничего не копировать. Можно написать "ВНИМАНИЕ", но это уже роскошь :)
 
На всякий случай, уточню по пункту "г" - вставить именно значения ячеек C, D и Е. Из примера не видно, но значения в столбцах C, D и Е на Листе2 могут содержать формулы.
 
Ну вот, файл есть, ответа нет :(
 
В общем, у меня самой получилось так:  
 
Sub Insert_Row()  
'  
'  
   Dim BaseSht As String  
   Dim CurrentSht As String  
'  
   BaseSht = "Лист1"  
   CurrentSht = ActiveSheet.Name  
'  
'  
   Dim Row As Integer  
   Row = Selection.Row  
   Dim Column As Integer  
   Column = Selection.Column  
'  
'  
   If Column <> 1 Then  
       MsgBox "Установите курсор на идентификаторе!"  
       GoTo EndSub  
   End If  
'  
'  
   Dim FinalRow As Integer  
   FinalRow = Row + Selection.Rows.Count - 1  
'  
'  
   For i = Row To FinalRow  
'  
'  
       Dim A As String  
       Dim B As String  
       Dim C As String  
       Dim D As String  
       Dim E As String  
'  
       A = Worksheets(CurrentSht).Cells(i, Column).Value  
       B = Worksheets(CurrentSht).Cells(i, Column + 1).Value  
       C = Worksheets(CurrentSht).Cells(i, Column + 2).Value  
       D = Worksheets(CurrentSht).Cells(i, Column + 3).Value  
       E = Worksheets(CurrentSht).Cells(i, Column + 4).Value  
'  
       With ActiveWorkbook.Worksheets(BaseSht)  
       Set rFndRng = .UsedRange.Find(A)  
       If rFndRng Is Nothing Then  
           Set rFndRng = .UsedRange.Find(B)  
           If rFndRng Is Nothing Then  
               MsgBox ("Раздел " & B & " не найден. Создайте раздел " & B & "!")  
               Else  
               Dim rFndRngRow As Integer  
               rFndRngRow = rFndRng.Row  
               .Cells(rFndRngRow + 1, 1).EntireRow.Insert  
               .Rows(rFndRngRow + 1).FillDown  
               .Cells(rFndRngRow + 1, 3) = C  
               .Cells(rFndRngRow + 1, 4) = D  
               .Cells(rFndRngRow + 1, 5) = E  
'  
               Dim F As String  
               F = .Cells(rFndRngRow + 1, 6).Value  
               .Range("Template").Find(F).EntireRow.Copy  
               .Cells(rFndRngRow + 1, 1).PasteSpecial xlPasteFormats, xlNone, False, False  
           End If  
       End If  
   End With  
Next i  
'  
EndSub:  
   End Sub
 
Замечания, дополнения, указания и пр. найдут искреннюю благодарность.
 
Забыла, в приведенном коде пункт  
 
1 в) скопировать в нее формулы из строки выше (очень желательно только формулы, а ячейки со значениями - не копировать)  
 
в "желательной" части не реализован. Строка выше копируется полностью, без разделения на формулы и значения.
 
Держите вариант. Хотя Вы со всем справились сами:)  
Нажмите кнопку ответить с цитированием и скопируйте код. Он будет с отступами:)  
 
Option Explicit  
 
Sub Insert_Row()  
   Dim BaseSht As Worksheet, CurrentSht As Worksheet  
   Dim i As Integer, iRow As Integer, iColmn As Integer  
   Dim rFndRng As Range  
   'присваиваем листы переменным для удобства обращения в коде  
   Set BaseSht = ThisWorkbook.Sheets("Лист1")  
   Set CurrentSht = ThisWorkbook.ActiveSheet  
   '  
   'определяем по первой ячейке в выделенном диапазоне  
   iRow = Selection.Cells(1, 1).Row  
   iColmn = Selection.Cells(1, 1).Column  
       '  
   If iColmn > 1 Then  
       MsgBox "Установите курсор на идентификаторе!"  
       Exit Sub  
   End If  
   '  
   Dim FinalRow As Integer  
   FinalRow = iRow + Selection.Rows.Count - 1  
   '  
   For i = iRow To FinalRow  
       '  
       Dim A As String  
       Dim B As String  
       '  
       A = CurrentSht.Cells(i, 1).Value  
       B = CurrentSht.Cells(i, 2).Value  
 
       With BaseSht  
           Set rFndRng = .UsedRange.Columns(1).Find(What:=A, LookIn:=xlValues, LookAt:=xlWhole)  
           If rFndRng Is Nothing Then  
               Set rFndRng = .UsedRange.Columns(2).Find(What:=B, LookIn:=xlValues, LookAt:=xlWhole)  
               If Not rFndRng Is Nothing Then  
                   Dim rFndRngRow As Integer  
                   rFndRngRow = rFndRng.Row  
                   .Cells(rFndRngRow + 1, 1).EntireRow.Insert  
                   'копируем ячейки с формудами и форматами из строки с найденным разделом  
                   .Range(.Cells(rFndRngRow, 1), .Cells(rFndRngRow, 8)).Copy Destination:=.Cells(rFndRngRow + 1, 1)  
                   'во вставленной строке удаляем константы  
                   .Range(.Cells(rFndRngRow + 1, 1), .Cells(rFndRngRow + 1, 8)).SpecialCells(xlCellTypeConstants, 23).ClearContents  
                   'копируем на лист база значения из ячеек C   D   E  
                   Range(Cells(i, 3), Cells(i, 5)).Copy Destination:=.Cells(rFndRngRow + 1, 3)  
 
                   'здесь не понял:)  
                   Dim F As String  
                   F = .Cells(rFndRngRow + 1, 6).Value  
                   .Range("Template").Find(F).EntireRow.Copy  
                   .Cells(rFndRngRow + 1, 1).PasteSpecial xlPasteFormats, xlNone, False, False  
 
               Else  
                   MsgBox ("Раздел " & B & " не найден. Создайте раздел " & B & "!")  
 
               End If  
           End If  
       End With  
   Next i  
   '  
End Sub
 
{quote}{login=Igor67}{date=13.09.2010 10:36}{thema=}{post}Нажмите кнопку ответить с цитированием и скопируйте код. Он будет с отступами:){/post}{/quote}  
 
Здорово :) Спасибо :)  
 
И за код тоже спасибо, попробую :)
Страницы: 1
Читают тему
Наверх