Начинает получаться. Помогите разобраться почему цикл For после успешного поиска первого листа (совпадение в названии в двух книгах) и вставки значений куда нужно, не переходит к такой же задаче на следующем листе?
Код
Sub Перенос_данных_в_БРЗ()
'Заключаем данную книгу в переменную
Dim tWB As Workbook
Set tWB = ThisWorkbook
'Указываем путь в файлу БРЗ
Dim nWB As Variant
Set nWB = Workbooks.Open(Filename:="D:\VB\Перенос значений\БРЗ.xlsx")
'Организовываем цикл по листам со сверкой их названий (лист присутствует в обеих книгах)
Dim shA As Worksheet
Dim shB As Worksheet
Dim arr
For Each shA In tWB.Sheets 'лист в Сверке
For Each shB In nWB.Sheets 'лист в БРЗ
If shA.Name = shB.Name Then
If Not IsArray(arr) Then
ReDim arr(1 To 1): arr(1) = shA.Name
shA.Range("B4").Copy
shB.Activate
shB.Range("C4").PasteSpecial xlPasteValues
shA.Activate
shA.Range("C4").Copy
shB.Activate
shB.Range("C5").PasteSpecial xlPasteValues
shA.Activate
shA.Range("D4").Copy
shB.Activate
shB.Range("C6").PasteSpecial xlPasteValues: Exit For
Else
ReDim Preserve arr(1 To UBound(arr) + 1)
arr(UBound(arr)) = shA.Name
MsgBox ("Такого листа нет в БРЗ")
End If
End If
Next
Next
End Sub
И не могу понять, почему итерации второго и третьего листов появляется msgbox, ведь листы называются так же.
Даже, когда цикл видит, что Лист "Признак 2" из одной книги равен "Признак 2" из другой, все равно он исполняет "Иначе".
Если часть кода закомментрировать, то цикл работает, но вариант с "Иначе" работает неправильно:
Код
Sub Перенос_данных_в_БРЗ()
'Заключаем данную книгу в переменную
Dim tWB As Workbook
Set tWB = ThisWorkbook
'Указываем путь в файлу БРЗ
Dim nWB As Variant
Set nWB = Workbooks.Open(Filename:="D:\VB\Перенос значений\БРЗ.xlsx")
'Организовываем цикл по листам со сверкой их названий (лист присутствует в обеих книгах)
Dim shA As Worksheet
Dim shB As Worksheet
Dim arr
For Each shA In tWB.Sheets 'лист в Сверке
For Each shB In nWB.Sheets 'лист в БРЗ
If shA.Name = shB.Name Then
'If Not IsArray(arr) Then
'ReDim arr(1 To 1): arr(1) = shA.Name
shA.Range("B4").Copy
shB.Activate
shB.Range("C4").PasteSpecial xlPasteValues
shA.Activate
shA.Range("C4").Copy
shB.Activate
shB.Range("C5").PasteSpecial xlPasteValues
shA.Activate
shA.Range("D4").Copy
shB.Activate
shB.Range("C6").PasteSpecial xlPasteValues ': Exit For
Else
'ReDim Preserve arr(1 To UBound(arr) + 1)
'arr(UBound(arr)) = shA.Name
MsgBox ("Такого листа нет в БРЗ") 'ПОЯВЛЯЕТСЯ КАЖДЫЙ РАЗ ПРИ СОПОСТОВЛЕНИИ РАЗНЫХ ЛИСТОВ. НАДО ЧТОБЫ ПОЯВЛЯЛСЯ, КОГДА ЛИСТА НЕТ В КНИГЕ
End If
'End If
Next
Next
End Sub
Hugo,в книге есть не только рабочие листы. Пока пытаюсь написать так, чтобы после того, как цикл найдет лист, копировались значения с этого листа на лист с таким же названием во второй книге в соответствующую ячейку.
Sub Перенос_данных_в_БРЗ()
'Заключаем данную книгу в переменную
Dim tWB As Workbook
Set tWB = ThisWorkbook
Dim nWB As Variant
'Указываем путь в файлу БРЗ
Set nWB = Workbooks.Open(Filename:="D:\VB\Перенос значений\БРЗ.xlsx")
'Организовываем цикл по листам со сверкой их названий (лист присутствует в обеих книгах)
Dim shA As Worksheet
Dim shB As Worksheet
Dim arr() As String
For Each shA In tWB
For Each shB In nWB
If shA.Name = shB.Name Then
If Not IsArray(arr) Then
ReDim arr(1 To 1): arr(1) = shA.Name: Exit For
Else
ReDim Preserve arr(1 To UBound(arr) + 1)
arr(UBound(arr)) = shA.Name: Exit For
End If
End If
Next
Next
End Sub
Sub Перенос_данных_в_БРЗ()
'Заключаем данную книгу в переменную
Dim tWB As Workbook
Set tWB = ThisWorkbook
Dim nWB As Range
'Указываем путь в файлу БРЗ
Set nWB = Worksheets("ПЕРЕНОС в БРЗ").Range("C2")
'Открываем файл с БРЗ
Workbooks.Open Filename:=nWB
'Организовываем цикл по листам со сверкой их названий (лист присутствует в обеих книгах)
Dim shA As Worksheet
Dim shB As Worksheet
Dim arr() As String
For Each shA In tWB
For Each shB In nWB
If shA.Name = shB.Name Then
If Not IsArray(arr) Then
ReDim arr(1 To 1): arr(1) = shA.Name: Exit For
Else
ReDim Preserve arr(1 To UBound(arr) + 1)
arr(UBound(arr)) = shA.Name: Exit For
End If
End If
Next
Next
End Sub
Добрый день. На работе появился процесс, который хочется автоматизировать, но не знаю как. Есть 2 книги Excel. Первая с исходной информацией (Сверка), второй - конечный файл (БРЗ). В данных книгах большое количество листов - около 200. Названия этих листов в первой книге такое же как и во второй. В книге "Сверка" есть лист "Перенос в БРЗ". На данной листе указываются технические параметры для работы будущего макроса, а именно: 1. Путь к файлу, в который необходимо перенести данные; 2. Список листов, которые нужно найти в книге "БРЗ". В книге "Сверка" листы называются точно так же. Их количество может увеличиваться или уменьшаться. Порядок так же может меняться; 3. Адреса данных, которые нужно перенести в книгу "БРЗ"; 4. Месяц. От Выбора месяца (будет выпадающий список) будет зависеть столбец в файле "БРЗ", в который будут перенесены значения. Другие столбцы должны будут остаться без изменений; 5. Строки в файле "БРЗ", в которых находятся ячейки, в которые нужно вставить данные.
Задача организовать процесс переноса данных из одной книги в другую в строго определенные ячейки. Прочитал несколько похожих тем, но решить проблему самостоятельно пока не получается.
Использовать связи в данном случае нельзя. Оба файла прикрепляю.
Пока смог написать только такое:
Код
Option Explicit
Sub Перенос_данных_в_БРЗ()
Dim oRange As Range
'Указывает путь в файлу БРЗ
Set oRange = Worksheets("ПЕРЕНОС в БРЗ").Range("C2")
'Открываем файл с БРЗ
Workbooks.Open Filename:=oRange
Dim sh As Worksheet
Dim lists As Range
Set lists = Workbooks("Сверка.xlsb").Worksheets("ПЕРЕНОС в БРЗ").Range("C5")
For Each sh In Worksheets
If sh.Name = lists Then Exit For
MsgBox ("Good!")
Next
If sh Is Nothing Then MsgBox "Лист " & lists & " не найден": Exit Sub
End Sub
Добрый день. Нужно из ячейки, в которой написаны суммы и их расшифровка, например -10 000 тыс руб. - Отклонение 1; -15 000 тыс руб. - Отклонение 2, вытащить суммы 10 тысяч и 15 тысяч. Суммы могут быть разными, поэтому ЛЕВСИМВ не работает.
Добрый день. Прошу помощи в решении двух вопросов. Имеется таблица excel с анализом затрат - было-стало-отклонение-комментарии. Необходимо в колонке "Комментарии" сделать так, чтобы в одну ячейку консолидировались комментарии из заданных ячеек. Важно чтобы каждый комментарий в консолидирующей ячейке начинался с новой строки, а так же чтобы не создавался пустой абзац в случае, если ячейка, из которой берется комментарий пустая.
Нашел способ через ЛЕВСИМВ. Все номера договоров начинаются на цифру 7. Я через ПОИСК определил порядковый номер этой 7. А потом через ПСТР извлёк нужное количество знаков после 7
Может я что то не понял, но по вашей формуле знаки считаются с начала строки, а этот вариант не подходит, т.к. в каждой строке разное количество знаков до начала номера договора. Нужно считать знаки от "/" влево.
Добрый день. Стоит задача из большого массива наименования договоров вытащить только его номер и отсечь остальной текст. Номер договора всегда имеет такой вид: 1234567/8910. Но слева и справа всегда есть какой то текст и он всегда разный, поэтому ЛЕВСИМВ применить не получается. У меня получилось через функцию ПОИСК посчитать каким по счету в ячейке является знак "/" и потом уже через ПСТР взять нужные ме четыре знака после "/". Но нужно ещё взять 7 знаков до "/", а вот это уже не получается. Может кто подскажет. Файл приложить не могу, т.к. пишу с телефона. Спасибо.
AndreTM,вот именно, юзер может применить и другие формулы или вообще их не применять, а в ручную ответ подогнать. Но хотелось бы чтобы проверка отлавливала это.
Добрый день. Кто умеет, подскажите, как можно реализовать такую идею. Хочу создать некий простой курс для новичков в Excel у сотрудников нашей компании. Появилась идея сделать книгу с заданиями и с кнопкой моментальной проверки решения и выводом результата в ячейки - успех или неудача. Сами задания придумать несложно, а вот реализовать механизм проверки сложнее. Прошу помощи. Книгу с одним примером прикрепляю.
Добрый день! Мне нужно решить такую задачу: В книге Excel есть 3 листа: Массив1, Массив2, Исходники. На первый двух листах в столбце А куча значений наподобие - Выручка, затраты, НДПИ, ВГО и много-много других. Тоже самое и на втором листе, только статьи другие. На листе "Исходники" так же есть перечень иногда с совпадающими значениями со значениями на листах "Массив 1" и "Массив2", а иногда уникальные. Задача такая, нужно на листе "Исходники" в отдельном столбце показать - какие из значений на листе "исходники" встречаются на листах "массив1" и "массив2". Эту проблему я решил формулой:
Проблема в том, что например, на листе "Массив1" есть значение "Выручка, тыс.руб", а на листе "Исходники" просто "Выручка". Мне нужно чтобы в таких случаях формула показывала что есть значение "Выручка" на листе "массив1", пусть даже совпадение не идеальное. Я попытался решить эту задачу такой формулой, через определенное количество совпадающих знаков слева,но что то не так:
А если такая ситуация: Допустим разом мы отправляем 10 писем на один адрес [.to], но в копию 1 [.Cc] и копию 2 [.Cc] нужно чтобы улетело только первое письмо. Как быть в такой ситуации? Спасибо за ответ.
Код
Private Sub Send()
Dim objOutlookApp As Object, objMail As Object
Dim sTo As String, sSubject As String, sBody As String, sAttachment As String
Dim lr As Long, lLastR As Long
Application.ScreenUpdating = False
On Error Resume Next
Set objOutlookApp = GetObject(, "Outlook.Application")
Err.Clear
If objOutlookApp Is Nothing Then
Set objOutlookApp = CreateObject("Outlook.Application")
End If
If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
objOutlookApp.Session.Logon
lLastR = Cells(Rows.Count, 1).End(xlUp).Row
For lr = 2 To lLastR
Set objMail = objOutlookApp.CreateItem(0)
With objMail
.to = Cells(1, 8).Value
.Cc = Cells(2, 8).Value
.Cc = Cells(3, 8).Value
.Subject = Cells(4, 8).Value
.Body = Cells(5, 8).Value
.Attachments.Add Cells(lr, 2).Value
.Send
End With
Next lr
Set objOutlookApp = Nothing: Set objMail = Nothing
Application.ScreenUpdating = True
End Sub
1. Обычно создается третий файл в который в столбец А вставляются скопированный названия статей из старого файла, а рядом в столбец В вставляются названия статей из нового файла. а потом в столбец С пишется формула, например =А1=В1, и протягивается до конца вниз. Где значения "ЛОЖЬ", значит что то не так. 2. По разному. В основном в ячейке, на которую я завязываюсь формула сложения например.
Здравствуйте! На работе для практически всех форм отчетности используются таблицы Excel. Есть форматы, которые приходят из Компании к нам в фирму.Это огромные таблицы -около 1000 строк, а то и больше. А также есть наши рабочие формы, созданные нашим отделом, в которые из первых мы берем связями только те значения, которые нам нужны, а потом уже работаем с этими значениями - ставим нужные нам формулы расчета и тп. Время от времени в те таблицы, которых приходят из компании вносятся изменения - добавляются или удаляются строки. В свою очередь, это сказывается на наших таблицах - нам приходится перезавязываться, либо изменять ссылку на ячейку через "найти/заменить", что тоже не самый быстрый вариант, если строк много.
Задача упростить этот процесс. В теории я это вижу таким образом: После того, как в очередной раз пришла измененная форма (добавлены/удалены некоторые строки), например добавлено 2 строки вначале таблицы. Получается, что все что ниже сместилось на 2 строки. Через функцию "найти/заменить" я смогу изменять ссылки на ячейки только построчно (например, была ссылка на 5 строчку, я ее заменяю на 7 строчку).Это долго. Хотелось бы, чтобы я я выделил диапазон в своей таблице, где необходимо сместить ссылки на 2 строчки вниз, указал что именно на 2 (в случае если надо сместить на другое количество, это можно было сделать), и нажатием какой-нибудь кнопки, например, "Сместить" - произошло чудо. Потом вдруг в исходной таблице на какой-нибудь строке 500 удалят 5 строк. Надо чтобы я смог указать смещение в выделенном диапазоне на 5 строк вверх.
Также надо чтобы относительные/абсолютные ссылки оставались после таких манипуляций.
Также прикрепляю образец: Листы: Файл 1 - это мой файл, в котором связи на лист 2 - старый, уже адаптированный под таблицу из листа 1, и файл 3 - новый, код который нужно придумать быстрый способ адаптации ссылок.
Таблички маленькие, созданные только чтобы показать суть и может если есть такие формулы, написать их в этом файле. Надеюсь написал понятно.
Цель - реализовать то, что написано выше, сверх цель, чтобы это работало и со столбцами. Например, по свежеприсланной таблице интересующие меня значения не в столбце "С", как было раньше, а в столбце "D".
Vik_tor написал: В доптабличке такого вида (содержания) нет логики, если собрались отбирать затраты по направлениям, то так их и обозначьте, ВПР допстолбец направление затрат, а дальше как у вас. Или сводная.
Столбец В должен быть именно таким. Он для других форм нужен именно в таком виде.
Добрый день! Есть необходимость вытащить по определенным условиям затраты из себестоимости. В прикрепленном файле на листе "Производственная программа" в столбце А проставлены МВЗ. Справа есть табличка - расшифровка этих МВЗ. На следующем листе "Свод бюджетов" нужно поставить такую формулу, вместо той, которая стоит сейчас, которая бы собирала значения с первого листа по условию МВЗ относящиеся только лишь на Нефть и на Газ и условию названия статьи. А в ячейку В8 на листе "Свод бюджетов" собиралось бы все остальное.