Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Вставить новый лист и проВПРить - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Вставить новый лист и проВПРить
Serge_007 Дата: Четверг, 28.06.2012, 10:48 | Сообщение № 1
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Всем привет

Прошу помочь с макросом
Описание в файле

Спасибо

PS Извиняюсь, файл не тот сначала вложил. Исправил
К сообщению приложен файл: SerchReplace.xls (40.0 Kb)


ЮMoney:41001419691823 | WMR:126292472390


Сообщение отредактировал Serge_007 - Четверг, 28.06.2012, 10:58
 
Ответить
СообщениеВсем привет

Прошу помочь с макросом
Описание в файле

Спасибо

PS Извиняюсь, файл не тот сначала вложил. Исправил

Автор - Serge_007
Дата добавления - 28.06.2012 в 10:48
RAN Дата: Четверг, 28.06.2012, 11:51 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Лови
[vba]
Code
Sub Serge_007()
     Application.ScreenUpdating = False
     Application.DisplayAlerts = False
     Rows("1:2").UnMerge
     Range("O1:R1") = Range("O2:R2")
     Rows("2:2").Delete Shift:=xlUp
     For Each sh In Worksheets
         If sh.Name = "Справочник" Then sh.Delete
     Next
     Set wb = GetObject("d:\Excel_Макрос\0.xls")
     wb.Sheets("Справочник").Copy After:=Sheets(Sheets.Count)
     wb.Close False
     Sheets("Рабочий").Activate
     arr = Sheets("Справочник").Range("A1").CurrentRegion.Value
     With CreateObject("Scripting.Dictionary")
         For i = 1 To UBound(arr)
             .Item(arr(i, 1)) = arr(i, 2)
         Next
         arr = Range(Cells(1, "S"), Cells(Rows.Count, "X").End(xlUp)).Value
         For i = 1 To UBound(arr)
             For j = 1 To UBound(arr, 2)
                 If .exists(arr(i, j)) Then
                     arr(i, j) = .Item(arr(i, j))
                 Else
                     Cells(i, 18 + j).Interior.Color = vbRed
                 End If
             Next: Next
     End With
     Range(Cells(1, "S"), Cells(Rows.Count, "X").End(xlUp)) = arr
     Application.DisplayAlerts = True
     Application.ScreenUpdating = True
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеЛови
[vba]
Code
Sub Serge_007()
     Application.ScreenUpdating = False
     Application.DisplayAlerts = False
     Rows("1:2").UnMerge
     Range("O1:R1") = Range("O2:R2")
     Rows("2:2").Delete Shift:=xlUp
     For Each sh In Worksheets
         If sh.Name = "Справочник" Then sh.Delete
     Next
     Set wb = GetObject("d:\Excel_Макрос\0.xls")
     wb.Sheets("Справочник").Copy After:=Sheets(Sheets.Count)
     wb.Close False
     Sheets("Рабочий").Activate
     arr = Sheets("Справочник").Range("A1").CurrentRegion.Value
     With CreateObject("Scripting.Dictionary")
         For i = 1 To UBound(arr)
             .Item(arr(i, 1)) = arr(i, 2)
         Next
         arr = Range(Cells(1, "S"), Cells(Rows.Count, "X").End(xlUp)).Value
         For i = 1 To UBound(arr)
             For j = 1 To UBound(arr, 2)
                 If .exists(arr(i, j)) Then
                     arr(i, j) = .Item(arr(i, j))
                 Else
                     Cells(i, 18 + j).Interior.Color = vbRed
                 End If
             Next: Next
     End With
     Range(Cells(1, "S"), Cells(Rows.Count, "X").End(xlUp)) = arr
     Application.DisplayAlerts = True
     Application.ScreenUpdating = True
End Sub
[/vba]

Автор - RAN
Дата добавления - 28.06.2012 в 11:51
RAN Дата: Четверг, 28.06.2012, 12:15 | Сообщение № 3
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Если очень нать сообщение, исправь так
[vba]
Code
  Cells(i, 18 + j).Interior.Color = vbRed
                     Strc = Strc & "; " & Cells(i, 18 + j).Address
                 End If
             Next: Next
     End With
     Range(Cells(1, "S"), Cells(Rows.Count, "X").End(xlUp)) = arr
     Application.DisplayAlerts = True
     Application.ScreenUpdating = True
     MsgBox Mid$(Strc, 2)
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеЕсли очень нать сообщение, исправь так
[vba]
Code
  Cells(i, 18 + j).Interior.Color = vbRed
                     Strc = Strc & "; " & Cells(i, 18 + j).Address
                 End If
             Next: Next
     End With
     Range(Cells(1, "S"), Cells(Rows.Count, "X").End(xlUp)) = arr
     Application.DisplayAlerts = True
     Application.ScreenUpdating = True
     MsgBox Mid$(Strc, 2)
[/vba]

Автор - RAN
Дата добавления - 28.06.2012 в 12:15
Формуляр Дата: Четверг, 28.06.2012, 12:22 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Привет Серж!

Предлагаю с шапкой не париться, а брать готовую.

Справочник тоже проще копировать не листом, а даными
К сообщению приложен файл: SerchReplace_FM.xls (56.5 Kb)


Excel 2003 EN, 2013 EN
 
Ответить
СообщениеПривет Серж!

Предлагаю с шапкой не париться, а брать готовую.

Справочник тоже проще копировать не листом, а даными

Автор - Формуляр
Дата добавления - 28.06.2012 в 12:22
_Boroda_ Дата: Четверг, 28.06.2012, 12:22 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 16715
Репутация: 6504 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
Я немного иначе написал - сначала проверка на существование книги и листа "Справочник" в ней, а потом уже удаление своего листа "Справочник" и операции с шапкой. А то может получиться так, что поудаляем всё, а листа "Справочник" не будет. И чего тогда - и свой лист убили, и чужой не вставили.
И еще - в сообщении не стал адреса ячеек выводить. Зачем? Все равно оттуда не скопировать и будешь искать красные.
[vba]
Code
Sub tt()
Application.ScreenUpdating = 0
Application.DisplayAlerts = 0
fp_ = "D:\Мои_\Стереть\" ' путь
fn_ = "Для_справочника.xls" ' название файла
sn_ = "Справочник" ' название листа
asn_ = ThisWorkbook.ActiveSheet.Name
On Error Resume Next
     Workbooks.Open Filename:=fp_ & fn_
     ThisWorkbook.Activate
     q = Workbooks(fn_).Sheets(sn_).Range("A1")
     If Err.Number Then
         MsgBox "Нет или книги " & fp_ & fn_ & ", или листа " & sn_
         Exit Sub
     End If
     ThisWorkbook.Sheets("Справочник").Delete
     Workbooks(fn_).Sheets(sn_).Copy After:=ThisWorkbook.Sheets(Sheets.Count)
     Worksheets(asn_).Activate
     Windows("Для_справочника.xls").Close
     Err = ""
On Error GoTo 0
With ThisWorkbook.Sheets(asn_)
     .Rows("1:2").UnMerge
     .Range("O2:R2").Cut Destination:=.Range("O1:R1")
     .Rows("2:2").Delete Shift:=xlUp
     c_ = .Cells(1, Columns.Count).End(xlToLeft).Column
     If c_ > 18 Then
     r_ = Sheets(sn_).Range("A" & Rows.Count).End(xlUp).Row
         For i = 19 To c_
             On Error Resume Next
             .Cells(1, i) = WorksheetFunction.VLookup(.Cells(1, i), Sheets(sn_).Range("A1:B" & r_), 2, 0)
             If Err.Number Then
                 .Cells(1, i).Interior.Color = 255
                 e_ = e_ + 1
                 Err = ""
             End If
             On Error GoTo 0
         Next i
         If e_ Then MsgBox "Фигня какая-то в шапке. Посмотри в красных ячейках."
     End If
End With
Application.ScreenUpdating = 1
Application.DisplayAlerts = 1
End Sub
[/vba]
К сообщению приложен файл: SerchReplace_3.xls (48.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеЯ немного иначе написал - сначала проверка на существование книги и листа "Справочник" в ней, а потом уже удаление своего листа "Справочник" и операции с шапкой. А то может получиться так, что поудаляем всё, а листа "Справочник" не будет. И чего тогда - и свой лист убили, и чужой не вставили.
И еще - в сообщении не стал адреса ячеек выводить. Зачем? Все равно оттуда не скопировать и будешь искать красные.
[vba]
Code
Sub tt()
Application.ScreenUpdating = 0
Application.DisplayAlerts = 0
fp_ = "D:\Мои_\Стереть\" ' путь
fn_ = "Для_справочника.xls" ' название файла
sn_ = "Справочник" ' название листа
asn_ = ThisWorkbook.ActiveSheet.Name
On Error Resume Next
     Workbooks.Open Filename:=fp_ & fn_
     ThisWorkbook.Activate
     q = Workbooks(fn_).Sheets(sn_).Range("A1")
     If Err.Number Then
         MsgBox "Нет или книги " & fp_ & fn_ & ", или листа " & sn_
         Exit Sub
     End If
     ThisWorkbook.Sheets("Справочник").Delete
     Workbooks(fn_).Sheets(sn_).Copy After:=ThisWorkbook.Sheets(Sheets.Count)
     Worksheets(asn_).Activate
     Windows("Для_справочника.xls").Close
     Err = ""
On Error GoTo 0
With ThisWorkbook.Sheets(asn_)
     .Rows("1:2").UnMerge
     .Range("O2:R2").Cut Destination:=.Range("O1:R1")
     .Rows("2:2").Delete Shift:=xlUp
     c_ = .Cells(1, Columns.Count).End(xlToLeft).Column
     If c_ > 18 Then
     r_ = Sheets(sn_).Range("A" & Rows.Count).End(xlUp).Row
         For i = 19 To c_
             On Error Resume Next
             .Cells(1, i) = WorksheetFunction.VLookup(.Cells(1, i), Sheets(sn_).Range("A1:B" & r_), 2, 0)
             If Err.Number Then
                 .Cells(1, i).Interior.Color = 255
                 e_ = e_ + 1
                 Err = ""
             End If
             On Error GoTo 0
         Next i
         If e_ Then MsgBox "Фигня какая-то в шапке. Посмотри в красных ячейках."
     End If
End With
Application.ScreenUpdating = 1
Application.DisplayAlerts = 1
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 28.06.2012 в 12:22
RAN Дата: Четверг, 28.06.2012, 12:50 | Сообщение № 6
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
_Boroda_, Наверное действительно с проверкой на существование файла лучше
Изменить блок так
[vba]
Code
Rows("2:2").Delete Shift:=xlUp
     On Error GoTo error_S
     Set wb = GetObject("d:\Excel_Макрос\0.xls")
     Set sh = wb.Sheets("Справочник"): Set sh = Nothing
     For Each sh In ThisWorkbook.Worksheets
         If sh.Name = "Справочник" Then sh.Delete
     Next
     wb.Sheets("Справочник").Copy After:=Sheets(Sheets.Count)
     wb.Close False: Set wb = Nothing
error_S:
     On Error GoTo 0
     Sheets("Рабочий").Activate
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение_Boroda_, Наверное действительно с проверкой на существование файла лучше
Изменить блок так
[vba]
Code
Rows("2:2").Delete Shift:=xlUp
     On Error GoTo error_S
     Set wb = GetObject("d:\Excel_Макрос\0.xls")
     Set sh = wb.Sheets("Справочник"): Set sh = Nothing
     For Each sh In ThisWorkbook.Worksheets
         If sh.Name = "Справочник" Then sh.Delete
     Next
     wb.Sheets("Справочник").Copy After:=Sheets(Sheets.Count)
     wb.Close False: Set wb = Nothing
error_S:
     On Error GoTo 0
     Sheets("Рабочий").Activate
[/vba]

Автор - RAN
Дата добавления - 28.06.2012 в 12:50
Serge_007 Дата: Четверг, 28.06.2012, 13:37 | Сообщение № 7
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Сколько вариантов, спасибо!

Попробовал вариант Андрея. Три момента:
1. O1:R1 остается пустым. Понял почему,
[vba]
Code
Range("O1:R1") = Range("O2:R2")
[/vba]
заменил на
[vba]
Code
Range("O2:R2").AutoFill Destination:=Range("O1:R2")
[/vba]
теперь всё работает

2. Если в справочнике, в столбце В, отсутствует соответствие, то msgBox всё-равно без указания ячейки с ошибкой, а сама ячейка остаётся пустой

3. Если добавить столбец в лист Рабочий, то даже при отсутствии соответствия в справочнике этот столбец остётся с тем значением, которое в нём было раньше и ячейка не указывается в сообщении и не окрашивается

Quote (_Boroda_)
сначала проверка на существование книги и листа "Справочник" в ней

Это лишнее. Если не будет той книги, в которой находится исходный справочник, то и не будет того отчёта, который мы, собственно, обрабатываем smile

Quote (_Boroda_)
адреса ячеек выводить. Зачем?

Предполагается, что такие случаи будут редко и не более одной-двух ячеек. Есть смысл, увидев адрес, вбить его в поле имя и сразу её (ячейку) увидеть

Quote (Формуляр)
Предлагаю с шапкой не париться, а брать готовую

Не понял, откуда она будет браться? Она ведь одна, постоянно изменяемая, и только на листе Рабочий


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеСколько вариантов, спасибо!

Попробовал вариант Андрея. Три момента:
1. O1:R1 остается пустым. Понял почему,
[vba]
Code
Range("O1:R1") = Range("O2:R2")
[/vba]
заменил на
[vba]
Code
Range("O2:R2").AutoFill Destination:=Range("O1:R2")
[/vba]
теперь всё работает

2. Если в справочнике, в столбце В, отсутствует соответствие, то msgBox всё-равно без указания ячейки с ошибкой, а сама ячейка остаётся пустой

3. Если добавить столбец в лист Рабочий, то даже при отсутствии соответствия в справочнике этот столбец остётся с тем значением, которое в нём было раньше и ячейка не указывается в сообщении и не окрашивается

Quote (_Boroda_)
сначала проверка на существование книги и листа "Справочник" в ней

Это лишнее. Если не будет той книги, в которой находится исходный справочник, то и не будет того отчёта, который мы, собственно, обрабатываем smile

Quote (_Boroda_)
адреса ячеек выводить. Зачем?

Предполагается, что такие случаи будут редко и не более одной-двух ячеек. Есть смысл, увидев адрес, вбить его в поле имя и сразу её (ячейку) увидеть

Quote (Формуляр)
Предлагаю с шапкой не париться, а брать готовую

Не понял, откуда она будет браться? Она ведь одна, постоянно изменяемая, и только на листе Рабочий

Автор - Serge_007
Дата добавления - 28.06.2012 в 13:37
Serge_007 Дата: Четверг, 28.06.2012, 14:32 | Сообщение № 8
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (_Boroda_)
А если вдруг ручки шаловливые? Книгу в другое место перетащат. Или лист переименуют.
Или сбойнет чего.


Тогда отчёт, который я использую, не сформируется и вставлять на лист мне будет нечего.
Так что до макроса дело даже не дойдёт smile


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (_Boroda_)
А если вдруг ручки шаловливые? Книгу в другое место перетащат. Или лист переименуют.
Или сбойнет чего.


Тогда отчёт, который я использую, не сформируется и вставлять на лист мне будет нечего.
Так что до макроса дело даже не дойдёт smile

Автор - Serge_007
Дата добавления - 28.06.2012 в 14:32
Формуляр Дата: Четверг, 28.06.2012, 14:42 | Сообщение № 9
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Quote (Serge_007)
Не понял, откуда она будет браться? Она ведь одна, постоянно изменяемая, и только на листе Рабочий
Ну, можно её в том же Справочнике хранить (его проще сделать постоянным, чем каждый раз проверять: есть-нет). А то, что изменяемая - так она изменяемая и получится.

Да, с копированием в предыдущем макросе накосячил маненько.
К сообщению приложен файл: SerchReplace_FM.xls (54.0 Kb)


Excel 2003 EN, 2013 EN
 
Ответить
Сообщение
Quote (Serge_007)
Не понял, откуда она будет браться? Она ведь одна, постоянно изменяемая, и только на листе Рабочий
Ну, можно её в том же Справочнике хранить (его проще сделать постоянным, чем каждый раз проверять: есть-нет). А то, что изменяемая - так она изменяемая и получится.

Да, с копированием в предыдущем макросе накосячил маненько.

Автор - Формуляр
Дата добавления - 28.06.2012 в 14:42
Serge_007 Дата: Четверг, 28.06.2012, 15:00 | Сообщение № 10
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Формуляр)
можно её в том же Справочнике хранить

Саш, как же её там хранить, если в каждом отчёте она новая?
Я не знаю как хранить то, чего ещё нет...


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Формуляр)
можно её в том же Справочнике хранить

Саш, как же её там хранить, если в каждом отчёте она новая?
Я не знаю как хранить то, чего ещё нет...

Автор - Serge_007
Дата добавления - 28.06.2012 в 15:00
Формуляр Дата: Четверг, 28.06.2012, 15:22 | Сообщение № 11
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Quote (Serge_007)
Этот блок шапки всегда одинаков, остальная часть меняется постоянно. Что нужно сделать.
1. Отменить объединение шапки
2. Переместить О2:R2 в О1:R1
Зачем постоянную часть каждый раз трансформировать с одним и тем же результатом? А переменная часть - на формулах. Только вот переменное кол-во ст-цов я не учёл, но это уже решено у коллег.


Excel 2003 EN, 2013 EN
 
Ответить
Сообщение
Quote (Serge_007)
Этот блок шапки всегда одинаков, остальная часть меняется постоянно. Что нужно сделать.
1. Отменить объединение шапки
2. Переместить О2:R2 в О1:R1
Зачем постоянную часть каждый раз трансформировать с одним и тем же результатом? А переменная часть - на формулах. Только вот переменное кол-во ст-цов я не учёл, но это уже решено у коллег.

Автор - Формуляр
Дата добавления - 28.06.2012 в 15:22
Serge_007 Дата: Четверг, 28.06.2012, 15:44 | Сообщение № 12
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Формуляр)
Зачем постоянную часть каждый раз трансформировать с одним и тем же результатом?

Значения в ячейках О2:R2 изменяются

Quote (Формуляр)
переменная часть - на формулах

Хотелось бы без них...

Quote (Формуляр)
переменное кол-во ст-цов я не учёл, но это уже решено у коллег

В макросе RAN не получается

Саша (Формуляр) твой макрос останавливается на строке
[vba]
Code
CutCopyMode =
[/vba]


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Формуляр)
Зачем постоянную часть каждый раз трансформировать с одним и тем же результатом?

Значения в ячейках О2:R2 изменяются

Quote (Формуляр)
переменная часть - на формулах

Хотелось бы без них...

Quote (Формуляр)
переменное кол-во ст-цов я не учёл, но это уже решено у коллег

В макросе RAN не получается

Саша (Формуляр) твой макрос останавливается на строке
[vba]
Code
CutCopyMode =
[/vba]

Автор - Serge_007
Дата добавления - 28.06.2012 в 15:44
Формуляр Дата: Четверг, 28.06.2012, 15:58 | Сообщение № 13
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Quote (Serge_007)
Саша (Формуляр) твой макрос останавливается на строке
CutCopyMode =
Странное дело... У меня срабатывает чисто. Можно эту строчку вообще удалить. Никчёмное излишество. smile
Quote (Serge_007)
Хотелось бы без них...
Я-то как раз подумал, что тебе при мелких правках с формулами проще будет, чем в чужих макросах копаться. Ну да дело хозяйское smile


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Четверг, 28.06.2012, 16:03
 
Ответить
Сообщение
Quote (Serge_007)
Саша (Формуляр) твой макрос останавливается на строке
CutCopyMode =
Странное дело... У меня срабатывает чисто. Можно эту строчку вообще удалить. Никчёмное излишество. smile
Quote (Serge_007)
Хотелось бы без них...
Я-то как раз подумал, что тебе при мелких правках с формулами проще будет, чем в чужих макросах копаться. Ну да дело хозяйское smile

Автор - Формуляр
Дата добавления - 28.06.2012 в 15:58
Serge_007 Дата: Четверг, 28.06.2012, 16:03 | Сообщение № 14
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Формуляр)
тебе при мелких правках с формулами проще будет

Тут цель - отсутствие каких либо правок smile


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Формуляр)
тебе при мелких правках с формулами проще будет

Тут цель - отсутствие каких либо правок smile

Автор - Serge_007
Дата добавления - 28.06.2012 в 16:03
RAN Дата: Четверг, 28.06.2012, 17:28 | Сообщение № 15
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Serge_007, кинь пример поподробнее (строк полста).
И желательно с данными, на которых пустой msgbox выскакивает.
Не понял про автозаполнение. А добавление столбцов вообще заказано не было. Где добавлять хочешь?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеSerge_007, кинь пример поподробнее (строк полста).
И желательно с данными, на которых пустой msgbox выскакивает.
Не понял про автозаполнение. А добавление столбцов вообще заказано не было. Где добавлять хочешь?

Автор - RAN
Дата добавления - 28.06.2012 в 17:28
Serge_007 Дата: Четверг, 28.06.2012, 17:42 | Сообщение № 16
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (RAN)
кинь пример поподробнее (строк полста)

Пример тот же остался. А зачем тебе строки? Они в обработке же не участвуют?

Quote (RAN)
с данными, на которых пустой msgbox выскакивает.

В справочнике, в столбце В удали любое значение и попробуй, получишь msgbox без указания "косячной" ячейки

Quote (RAN)
добавление столбцов вообще заказано не было.Где добавлять хочешь?

Добавление мне и не надо. Я про это: в файле топика SerchReplace.xls, второе предложение: Строк и столбцов всегда разное кол-во


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (RAN)
кинь пример поподробнее (строк полста)

Пример тот же остался. А зачем тебе строки? Они в обработке же не участвуют?

Quote (RAN)
с данными, на которых пустой msgbox выскакивает.

В справочнике, в столбце В удали любое значение и попробуй, получишь msgbox без указания "косячной" ячейки

Quote (RAN)
добавление столбцов вообще заказано не было.Где добавлять хочешь?

Добавление мне и не надо. Я про это: в файле топика SerchReplace.xls, второе предложение: Строк и столбцов всегда разное кол-во

Автор - Serge_007
Дата добавления - 28.06.2012 в 17:42
_Boroda_ Дата: Четверг, 28.06.2012, 18:20 | Сообщение № 17
Группа: Админы
Ранг: Местный житель
Сообщений: 16715
Репутация: 6504 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
Серег, посмотри так (выводит адреса)
[vba]
Code
Sub tt()
Application.ScreenUpdating = 0
Application.DisplayAlerts = 0
fp_ = "D:\Мои_\Стереть\" ' путь
fn_ = "Для_справочника.xls" ' название файла
sn_ = "Справочник" ' название листа
asn_ = ThisWorkbook.ActiveSheet.Name
On Error Resume Next
     Workbooks.Open Filename:=fp_ & fn_
     ThisWorkbook.Activate
     q = Workbooks(fn_).Sheets(sn_).Range("A1")
     If Err.Number Then
         MsgBox "Нет или книги " & fp_ & fn_ & ", или листа " & sn_
         Exit Sub
     End If
     ThisWorkbook.Sheets("Справочник").Delete
     Workbooks(fn_).Sheets(sn_).Copy After:=ThisWorkbook.Sheets(Sheets.Count)
     Worksheets(asn_).Activate
     Windows("Для_справочника.xls").Close
     Err = ""
On Error GoTo 0
With ThisWorkbook.Sheets(asn_)
     .Rows("1:2").UnMerge
     .Range("O2:R2").Cut Destination:=.Range("O1:R1")
     .Rows("2:2").Delete Shift:=xlUp
     c_ = .Cells(1, Columns.Count).End(xlToLeft).Column
     If c_ > 18 Then
     r_ = Sheets(sn_).Range("A" & Rows.Count).End(xlUp).Row
         For i = 19 To c_
             On Error Resume Next
             .Cells(1, i) = WorksheetFunction.VLookup(.Cells(1, i), Sheets(sn_).Range("A1:B" & r_), 2, 0)
             If Err.Number Then
                 .Cells(1, i).Interior.Color = 255
                 e_ = e_ & .Cells(1, i).Address(0, 0) & ", "
                 Err = ""
             End If
             On Error GoTo 0
         Next i
         If e_ <> "" Then MsgBox "Фигня какая-то в шапке. Посмотри в ячейках " & e_ & "они красные."
     End If
End With
Application.ScreenUpdating = 1
Application.DisplayAlerts = 1
End Sub
[/vba]
К сообщению приложен файл: SerchReplace_4.xls (47.5 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеСерег, посмотри так (выводит адреса)
[vba]
Code
Sub tt()
Application.ScreenUpdating = 0
Application.DisplayAlerts = 0
fp_ = "D:\Мои_\Стереть\" ' путь
fn_ = "Для_справочника.xls" ' название файла
sn_ = "Справочник" ' название листа
asn_ = ThisWorkbook.ActiveSheet.Name
On Error Resume Next
     Workbooks.Open Filename:=fp_ & fn_
     ThisWorkbook.Activate
     q = Workbooks(fn_).Sheets(sn_).Range("A1")
     If Err.Number Then
         MsgBox "Нет или книги " & fp_ & fn_ & ", или листа " & sn_
         Exit Sub
     End If
     ThisWorkbook.Sheets("Справочник").Delete
     Workbooks(fn_).Sheets(sn_).Copy After:=ThisWorkbook.Sheets(Sheets.Count)
     Worksheets(asn_).Activate
     Windows("Для_справочника.xls").Close
     Err = ""
On Error GoTo 0
With ThisWorkbook.Sheets(asn_)
     .Rows("1:2").UnMerge
     .Range("O2:R2").Cut Destination:=.Range("O1:R1")
     .Rows("2:2").Delete Shift:=xlUp
     c_ = .Cells(1, Columns.Count).End(xlToLeft).Column
     If c_ > 18 Then
     r_ = Sheets(sn_).Range("A" & Rows.Count).End(xlUp).Row
         For i = 19 To c_
             On Error Resume Next
             .Cells(1, i) = WorksheetFunction.VLookup(.Cells(1, i), Sheets(sn_).Range("A1:B" & r_), 2, 0)
             If Err.Number Then
                 .Cells(1, i).Interior.Color = 255
                 e_ = e_ & .Cells(1, i).Address(0, 0) & ", "
                 Err = ""
             End If
             On Error GoTo 0
         Next i
         If e_ <> "" Then MsgBox "Фигня какая-то в шапке. Посмотри в ячейках " & e_ & "они красные."
     End If
End With
Application.ScreenUpdating = 1
Application.DisplayAlerts = 1
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 28.06.2012 в 18:20
Serge_007 Дата: Четверг, 28.06.2012, 20:30 | Сообщение № 18
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (_Boroda_)
Серег, посмотри так (выводит адреса)

Ага, суперски, спасибо!

Завтра на работе на рабочих файлах потестю smile
Естественно, на копиях smile


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (_Boroda_)
Серег, посмотри так (выводит адреса)

Ага, суперски, спасибо!

Завтра на работе на рабочих файлах потестю smile
Естественно, на копиях smile

Автор - Serge_007
Дата добавления - 28.06.2012 в 20:30
RAN Дата: Пятница, 29.06.2012, 10:24 | Сообщение № 19
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Подправил код.
[vba]
Code
Sub Serge_007()
     Dim wb As Workbook, sh As Worksheet, arr
     Dim bookName As String, Strc As String
     Dim i As Long, j As Long, lastCol As Long
      
     bookName = "d:\0.xls"
     Application.ScreenUpdating = False
     Application.ShowWindowsInTaskbar = False
     Application.DisplayAlerts = False
     Rows("1:2").UnMerge
     lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
     Range("O1:R1").Value = Range("O2:R2").Value
     Rows("2:2").Delete Shift:=xlUp
      
     On Error GoTo error_S
     Set wb = GetObject(bookName)
     Set sh = wb.Sheets("Справочник")
     For Each sh In ThisWorkbook.Worksheets
         If sh.Name = "Справочник" Then sh.Delete
     Next
     wb.Sheets("Справочник").Copy After:=Sheets(Sheets.Count)
     wb.Close False: Set sh = Nothing: Set wb = Nothing
error_S:
     On Error GoTo 0
     Sheets("Рабочий").Activate

     arr = Sheets("Справочник").Range("A1").CurrentRegion.Value
     With CreateObject("Scripting.Dictionary")
         For i = 1 To UBound(arr)
             .Item(arr(i, 1)) = arr(i, 2)
         Next
         arr = Range(Cells(1, "S"), Cells(Rows.Count, lastCol).End(xlUp)).Value
         For i = 1 To UBound(arr)
             For j = 1 To UBound(arr, 2)
                 If .exists(arr(i, j)) Then
                     arr(i, j) = .Item(arr(i, j))
                 Else
                     Cells(i, 18 + j).Interior.Color = vbRed
                     Strc = Strc & "; " & Cells(i, 18 + j).Address
                 End If
             Next: Next
     End With
     Range(Cells(1, "S"), Cells(Rows.Count, lastCol).End(xlUp)) = arr
     Application.DisplayAlerts = True
     Application.ShowWindowsInTaskbar = True
     Application.ScreenUpdating = True
     If Len(Strc) Then MsgBox Mid$(Strc, 2)

End Sub
[/vba]
К сообщению приложен файл: SerchReplace_R.xls (59.5 Kb)


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПодправил код.
[vba]
Code
Sub Serge_007()
     Dim wb As Workbook, sh As Worksheet, arr
     Dim bookName As String, Strc As String
     Dim i As Long, j As Long, lastCol As Long
      
     bookName = "d:\0.xls"
     Application.ScreenUpdating = False
     Application.ShowWindowsInTaskbar = False
     Application.DisplayAlerts = False
     Rows("1:2").UnMerge
     lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
     Range("O1:R1").Value = Range("O2:R2").Value
     Rows("2:2").Delete Shift:=xlUp
      
     On Error GoTo error_S
     Set wb = GetObject(bookName)
     Set sh = wb.Sheets("Справочник")
     For Each sh In ThisWorkbook.Worksheets
         If sh.Name = "Справочник" Then sh.Delete
     Next
     wb.Sheets("Справочник").Copy After:=Sheets(Sheets.Count)
     wb.Close False: Set sh = Nothing: Set wb = Nothing
error_S:
     On Error GoTo 0
     Sheets("Рабочий").Activate

     arr = Sheets("Справочник").Range("A1").CurrentRegion.Value
     With CreateObject("Scripting.Dictionary")
         For i = 1 To UBound(arr)
             .Item(arr(i, 1)) = arr(i, 2)
         Next
         arr = Range(Cells(1, "S"), Cells(Rows.Count, lastCol).End(xlUp)).Value
         For i = 1 To UBound(arr)
             For j = 1 To UBound(arr, 2)
                 If .exists(arr(i, j)) Then
                     arr(i, j) = .Item(arr(i, j))
                 Else
                     Cells(i, 18 + j).Interior.Color = vbRed
                     Strc = Strc & "; " & Cells(i, 18 + j).Address
                 End If
             Next: Next
     End With
     Range(Cells(1, "S"), Cells(Rows.Count, lastCol).End(xlUp)) = arr
     Application.DisplayAlerts = True
     Application.ShowWindowsInTaskbar = True
     Application.ScreenUpdating = True
     If Len(Strc) Then MsgBox Mid$(Strc, 2)

End Sub
[/vba]

Автор - RAN
Дата добавления - 29.06.2012 в 10:24
Serge_007 Дата: Пятница, 29.06.2012, 12:21 | Сообщение № 20
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Андрей, спасибо
Путь к файлу надо здесь: bookName = прописать?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеАндрей, спасибо
Путь к файлу надо здесь: bookName = прописать?

Автор - Serge_007
Дата добавления - 29.06.2012 в 12:21
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!