Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Фильтр в сводной таблице через переменные (значение ячеек)
 
Всем привет!

Нужна помощь, не могу разобраться с синтаксисом VBA кода, который помог бы мне в автоматическом режиме менять фильтрацию дат на необходимую мне.

Что имеется:
Таблица, в которой фильтр дат выглядит следующим образом
Скрытый текст

То есть, при нажатии на "+" ничего не открывается и выбирается точно такое же значение.

У меня отдельными строками выведены значения, которые автоматически меняются формулой, в зависимости от той даты, которая сегодня.
Фильтры динамичные, меняются от месяца к месяцу по принципу - игнорирует текущий, выбирает 3 предыдущих месяца. Вид значений: 02.2024, 01.2024, 12.2023 и так далее.
Скрытый текст

Макрорекордером записал код, но как подставить к нему переменные так и не смог сообразить
Код
ActiveSheet.PivotTables("Сводная таблица11").PivotFields( _
        "[Date].[MonthNumber, Year].[MonthNumber, Year]").VisibleItemsList = Array( _
        "[Date].[MonthNumber, Year].&[02.2024]", "[Date].[MonthNumber, Year].&[12.2023]")

Прошу помочь с макросом, который бы брал значения из 3х ячеек и фильтровал сводную таблицу по этим критериям.
Файл пример предоставить не могу, т.к. сводная таблица - подключение к БД, отсоединяя которую, файл перестает реагировать на фильтры (

Всем заранее большое спасибо за помощь!
Оптимизация кода - удаление строк, если пустые столбцы
 
Всем привет!

Добрые люди, помогите решить одну проблему
Есть вот такой рабочий код:
Код
'Ищем последнюю ячейку на листе, в которой хранится хоть какое-то значение
    Set rF = ActiveSheet.Range("D1:D1000").Find("*", , xlValues, xlWhole, , xlPrevious)
    If Not rF Is Nothing Then
        lLastRow = rF.Row    'последняя заполненная строка
        lLastCol = rF.Column 'последний заполненный столбец
    End If

Range(rF, rF).Select

Do
    ActiveCell.Offset(-1, 0).Activate
        If ActiveCell = "" Then
            If ActiveCell.Offset(0, -1) = "" Then
                If ActiveCell.Offset(0, -1) = "" Then
                    ActiveCell.EntireRow.Delete
                End If
            End If
        End If
    lLastRow = lLastRow - 1
    
Loop While lLastRow <> 2

Этот код ищет пустые ячейки в столбцах B, C и D и если все строки в столбцах пустые - удаляет строку.
Но этот код очень долго обрабатывает информацию.

Подскажите, как можно данный код оптимизировать, чтобы он работал быстрее
Каждый раз около 50-300 строк обычно. Но бывает меньше и больше.

Пример файла во вложении

Всем спасибо за помощь!
Меню выбора данных в UserForm (без использования Multipage)
 
Всем привет!

Уперся в стену и не могу продвинуться в решении проблемы с полноценным меню в Userform.

Задача: сделать переключение вкладок на вызванной UserForm через нажатие на текст в Label. CommandButton использовать не вариант, т.к. есть обводка вокруг кнопки, которая не выглядит лаконично.

С чем трудности: в одном и том же окне разместить разную информацию и переключаться между через "боковое меню"

Выглядит следующим образом
Скрытый текст


Уперся сначала в моменте, каким образом реализоваться переход между вкладками - решил сделать на каждую вкладку userform, чтобы визуально были одинаковыми, но справа в окошке была своя информация.

Далее уперся в закрытие формы, т.к. из любой вкладки может вызываться любая другая, соответственно, нужно прописать несколько выгрузок активных открытых форм.
Код
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False

'Выгружаем форму
Unload 'Дальше не знаю как продолжить

'Загружаем форму (Главная)
Load FormHome

Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True

Проблема еще и в том, что в данном случае, мне необходимо переключение из-за большого количества кнопок с действиями, которые не помещаются по итогу на полную форму в одной Userform

После выгрузки формы, кстати, не загружается новая, что очень странно. То есть в коде выше, если я укажу выгружаемую форму как она есть, то новая форма не загрузится.

Пытался еще таким вариантом, но ломается на строчке "FormProga.UserForm.Unload"
Код
Dim FormProga As UserForm
    For Each FormProga In ActiveWorkbook.UserForm
             FormProga.UserForm.Unload
    Next

И еще так
Код
Dim FormProga As UserForm
    For Each FormProga In ActiveWorkbook.UserForm
             FormProga.Unload.UserForm
    Next

Файл пример прикрепить не получилось, я закинул по ссылке на файловый хостинг

https://dropmefiles.com/HffER

Буду очень признателен, если толкнете меня в нужное русло или поможете решить такую вот задачку.
Удаление строки по 4м условиям в столбцах этой строки
 
Всем привет!

Нужна помощь знающих людей с задачей, которую пытался решить самостоятельно, но так и не пришел к нужному варианту ее решения

Имеется таблица с данными, кол-во строк может быть около 10, может быть около 1000 (но обычно не больше 150-200)

Необходимо найти последнюю заполненную ячейку на листе и удалить из диапазона (A3:Ex(где x - последняя строка)) все строки по условию:

i = номер проверяемой строки

1. Cells(i, 2) = "#Н/Д"
2. Cells(i, 3) = "#Н/Д"
3. Cells(i, 4) = "#Н/Д"
4. Cells(i, 5) = "#Н/Д"

Если во всех этих строках есть "#Н/Д", удалить строку
Если не во всех ячейках в строке "i" это значение - пропустить и не удалять, перейти к следующей строке
Затем удалить с листа все "#Н/Д" из ячеек, чтобы остались пустые ячейки

Пытался решить несколькими способами, из последнего этот:
Код
Dim ND As String
ND = "#Н/Д"
    
Dim UdalenieStrok As Long
    UdalenieStrok = Cells(Rows.Count, 1).End(xlUp).row
        i = UdalenieStrok
     
Do
    Cells(i, 2).Select
        If ActiveCell = ND Then
            Cells(i, 3).Select
                If ActiveCell = "#Н/Д" Then
                    Cells(i, 4).Select
                        If ActiveCell = "#Н/Д" Then
                            Cells(i, 5).Select
                                If ActiveCell = "#Н/Д" Then
                                    Rows(i).Delete
                                End If
                        Else
                            GoTo Prohod2
                        End If
                Else
                    GoTo Prohod2
                End If
        Else
            GoTo Prohod2
        End If
Prohod2:
    i = i - 1
Loop While i <> 1
Но на строке If ActiveCell = ND Then или, если ее поменять на строку If ActiveCell = "#Н/Д" Then, вылетает ошибка синтаксиса Run Time Error:13

Файл примера во вложении

Прошу помощи в решении задачи

Заранее всем спасибо большое за помощь!
Изменено: x7turist - 27.06.2023 17:19:47
Остановка макроса, внесение изменений в ячейки, продолжение выполнения макроса
 
Всем привет!

Столкнулся с проблемой, из-за которой не получается решить задачу.
Есть таблица, в которой макрос выполняет вычисления и перенос информации.
Скрытый текст

В колонке "А" у меня прописана формула ВПР, которая тянет данные с другого листа по колонке "B". В колонку "В" данные переносятся с другого листа. Иногда случается ситуация, когда ВПР не может подтянуть данные, из-за отсутствия необходимых данных на листе "Список", откуда ВПР тянет данные.

Для достижения цели, необходимо отсортировать все косячные ячейки с текстом #Н/Д (здесь нет проблем)
Скрытый текст

После чего временно остановить макрос, пока не будет нажата кнопка "Продолжить", которую я генерирую самим макросом.
Скрытый текст

После остановки макроса, необходимо внести данные на листе "Список" руками, чтобы ВПР подтянуло все значения, которых не хватает. Далее я нажимаю на кнопку, она удаляется и макрос продолжает свою работу до появления такой же таблицы, где нужно остановить макрос (действия повторяются).

Как я пытался решить:
Скрытый текст

Прочитал на сайте несколько статей, где предлагались разные варианты, включая DoEvents, но т.к. я не очень силен в VBA, привязать к своей задаче решение не смог.

Вопрос в следующем, как реализовать данный механизм, чтобы во время остановки макроса можно было выполнять другие действия, в частности, изменение данных на листе. После выполненных действий производить запуск не с самого начала, а с места, где макрос остановился?
Изменено: Сергей Верухин - 19.06.2023 12:54:33
Разделение текста в ячейке, умножение числа из ячейки и обратный сбор в 1 ячейку
 
Всем добрый день.
Очень тяжелое название темы, поэтому постараюсь объяснить что мне нужно.

Есть некий прайс, который формируется по принципу
Смайлик в юникоде, название игры, -, цена, р

Выглядит так: 📍ATV Drift & Tricks Definitive Edition - 170₽

Что хочу сделать в конечном варианте:
Взять название игры, а цену уменьшить на 25 или 30 % (в формуле *0,75 или *0,7). Далее в новую ячейку записать тоже самое название, но с новой ценой

Т.к. хочу сделать скидку на полный прайс, не хочется каждую строку править вручную. Ниже файл прикрепил, пытался сделать, но загвоздка в лишнем пробеле, который появляется при разделении строчки с названием и ценой. У меня может быть цена 160₽ или 2160₽, но количество знаков всегда 3 или 4 после -.

Формула =ЕСЛИ(ЛЕВСИМВ(Q4;1)=" ";ПРАВСИМВ(Q4;ДЛСТР(Q4)-1);Q4) не удаляет пробелы, из-за этого последующие формулы перестают работать.

Вижу вариант такой, но он мне не подходит:
Написать название игры в А1 ячейку, цену в А2, с наценкой А3, с буквой ₽в ячейку А4 и собрать все по формуле Объединить, но такой вариант не канает, потому что прайс-лист постоянно меняется, и нужно CTRL+C и далее CTRL+V

Надеюсь, понятно объяснил, что хотелось бы видеть. Направьте в нужное русло, чтобы сделать реализацию такой вот штуковины!
Изменено: Сергей Верухин - 24.08.2022 14:21:33
Разделение текста в ячейке на 2 разные ячейки
 
Всем привет!
Нужна помощь с разделением текста в ячейке. Описание ниже из соседней темы, там было обсуждение начато:
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=151352&a...

Цитата
Ігор Гончаренко написал:
Сергей Верухин,
вы не мытарства свои описывайте в попытке найти решение, а описывайте задачу
написали ОДНУ! фразу: Шумоглушитель SHK 160/6
я написал как ее разделить
я не знаю что там у вас еще быввает на сколько частей и как его поделить
это-то понимаете? что я не могу угадать с написанием макроса не имея представления, а что там может быть в данных
Ігор Гончаренко, дело в том, что я попросил сделать разделение только по одному условию, чтобы дальше решить задачу своими силами. Если бы я хотел получить готовое решение моей задачи, я бы описывал все подробно, как в нормальном ТЗ. Но я не хочу получить готовое решение на все, потому что тогда не научусь сам. Вы мне дали направление, я его пытался применить самостоятельно, дополнив некоторыми параметрами и условиями. Я попробовал самостоятельно сделать, у меня не вышло и поэтому я снова обратился к Вам. В этом все и дело (


Хотел еще уточнить по вот этой истории:
Цитата
написал:
Цитата
Сергей Верухин написал:
А1 -  Шумоглушитель SHK 160/6
 
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8  9  10  11  12  13  14      Sub   SplitNoLatino()        Dim   r&, re, ms, s$        Set   re = CreateObject(  "VBScript.RegExp"  )        re.Pattern =   "[А-Яа-яЁё ]+"  :  r = 1        Do   While   Not   IsEmpty(Cells(r, 1))          s = Cells(r, 1)          If   re.test(s)   Then            Set   ms = re.Execute(s)            Cells(r, 3) = Trim(ms(0))            Cells(r, 4) = Right(s, Len(s) - Len(ms(0)))          End   If          r = r + 1        Loop    End   Sub   
 
Этот способ работает отлично, но есть некоторые нюансы, решить которые не могу уже пару часов. Пытался условие дополнительное ввести - не работает. Пытался через переменные, тоже не работает. Мой код ниже.
Пытаюсь сделать исключение, т.к. не все позиции нужно разделять, а если точнее, то вот:
Код
Sub SpliTest()
  Dim r&, re, ms, s$
  Set re = CreateObject("VBScript.RegExp")
  re.Pattern = "[А-Яа-яЁё ]+":  r = 26
  Do While Not IsEmpty(Cells(r, 2))
        If ActiveCell Like "*" & "Установка" & "*" Or ActiveCell Like "*" & "Приточная" & "*" Or ActiveCell Like "*" & "Вытяжная" & "*" _
        Or ActiveCell Like "*" & "id" & "*" Then
            r = r + 1
            GoTo Prodoljit
        End If
    s = Cells(r, 2)
    If re.test(s) Then
      Set ms = re.Execute(s)
      Cells(r, 2) = Trim(ms(0))
      Cells(r, 3) = Right(s, Len(s) - Len(ms(0)))
    End If
Prodoljit:
    r = r + 1
  Loop
End Sub
Собственно, ячейки, в которых есть текст "Установка, Приточная, Вытяжная, id..." разделять не нужно.

Обратный клапан DV-K100 OK нужно делить.
П2 (ОАСС)   id2440491 Приточная установка DV-B05000 R /[P1]-[K1]-[F1]-[SVH-W.3]-[V1.КЦ31С (1.1/3000)]-[H1]-[P1] - не нужно.

Повторяются в неделимых ячейках обычно слова, написанные выше. (для примера)

Оптимизация кода макроса
 
Всем привет!
Написанный макрос выполняет нужные мне действия довольно быстро и это никак не сказывается на моей работе, но есть одно НО.

Из-за того, что я хочу научиться не только писать макросы, но и писать их грамотно и компактно (не могу избавиться от привычки использоваться .select) прошу у вас помощи. Подскажите, пожалуйста, где и как возможно оптимизировать работу макроса из прикрепленного файла.

Прилагаю также файлы, с которыми работает макрос. Файлу Module14.txt надо изменить txt на bas. Загрузить иначе сюда не получилось.
Макрос нужно запускать в книге КП_SV22-065368-02, а также в теле самого макроса прописать путь для открытия файла "ЧЕРНОВИК ДЛЯ....КАНАЛКУ.xlsx"

Код
'Открытие документа для переноса информации
Workbooks.Open Filename:="\\zdt.uwg.local\Обменник\ДПО\Верухин С.А\Макросы\ЧЕРНОВИК ДЛЯ ПЕРЕНОСА СВОК НА КАНАЛКУ.xlsx"
    Set dantex = ActiveWorkbook

Я не пока только учусь, поэтому мне нужна ваша помощь. Спасибо!

Добавить не получилось код для внутреннего макроса "Call SVOK_DANTEX_INDEX1"
Т.к. там около 600 строчек кода, где идет замена одного названия на другого.

Вот что там примерно написано:
Код
'Фильтрующая кассета G3 FLFU
Cells.Replace What:="G3 SFPKU 400?200", Replacement:="G3 DV-M01000 FLFU", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="G3 SFPKU 500?250", Replacement:="G3 DV-M02000 FLFU", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="G3 SFPKU 500?300", Replacement:="G3 DV-M02500 FLFU", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="G3 SFPKU 600?300", Replacement:="G3 DV-M03000 FLFU", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="G3 SFPKU 600?350", Replacement:="G3 DV-M04000 FLFU", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="G3 SFPKU 700?400", Replacement:="G3 DV-M06200 FLFU", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="G3 SFPKU 800?500", Replacement:="G3 DV-M07000 FLFU", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="G3 SFPKU 900?500", Replacement:="G3 DV-M08500 FLFU", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="G3 SFPKU 1000?500", Replacement:="G3 DV-M12000 FLFU", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

Код
Sub MacrosForSVOK_Excel()
Application.ScreenUpdating = False
Application.EnableEvents = False

Call SVOK_DANTEX_INDEX1

'Удаление строк с фразами
    Set MR = Range("A1:H4000")
        For Each cell In MR
            If cell.Value = "Итого (оборудование)" Then cell.EntireRow.Delete
        Next
        For Each cell In MR
            If cell.Value = "Итого (КИПиА)" Then cell.EntireRow.Delete
        Next
        For Each cell In MR
            If cell.Value = "Итого" Then cell.EntireRow.Delete
        Next
        For Each cell In MR
            If cell.Value = "КИПиА" Then cell.EntireRow.Delete
        Next

'Удаление ненужных слов в КП
Cells.Replace What:="SVOK", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="RUB", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="шт", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

'Удаление картинок
ActiveSheet.Pictures.Delete

'Удаление строк с текстом сверху
Do Until Range("A1") = "№"
    Rows("1:1").Delete Shift:=xlUp
Loop

'Удаление неактивных листов и переименовывание активного в "КП ДР"
    ActiveSheet.Name = "КП ДР"
Dim NoKPDR As Worksheet
    Application.DisplayAlerts = False
        For Each NoKPDR In Application.ActiveWorkbook.Worksheets
            If NoKPDR.Name <> "КП ДР" Then
                NoKPDR.Delete
            End If
        Next
    Application.DisplayAlerts = True
    
'Наценка / Скидка / Перевод в EUR

'Наценка и скидка
Dim Nacenka, Skidka As Integer

    Nacenka = Application.InputBox("Укажите наценку на оборудование SVOK")
    Range("I1") = Nacenka / 100 + 1
    
    Skidka = Application.InputBox("Введите нашу скидку, которую дает SVOK:")
    Range("I2") = 1 - Skidka / 100

'Выбор валюты / Eur или Rub + курс на сегодня
Dim eur As Integer
Dim Msg, Style, Title
    Msg = "Если EUR - нажми ДА! ///// Если RUB - нажми НЕТ!"
        Style = vbYesNo + vbInformation + vbDefaultButton2
            Response = MsgBox(Msg, Style)
If Response = vbYes Then
        Dim Euro1 As Double
            Euro1 = Application.InputBox("Укажите курс ЕВРО, по которому мы работаем сегодня!")
    Range("I3") = Euro1 - 2
    eur = 1
    Cells.Find(What:="Итого по предложению с учётом НДС", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
Else
    Cells.Find(What:="Итого по предложению с учётом НДС", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    eur = 0
End If

'Выполнение перевода по формуле для значения цены
ActiveCell.Offset(rowoffset:=-6, columnOffset:=5).Activate
Do
    If ActiveCell.Offset(rowoffset:=0, columnOffset:=-3) = "Цена" Then
        ActiveCell.Offset(rowoffset:=-5, columnOffset:=0).Activate
    End If
    
    If eur = 1 Then
        ActiveCell.Value = ActiveCell.Offset(rowoffset:=0, columnOffset:=-3).Value * Cells(1, 9).Value * Cells(2, 9).Value / Cells(3, 9).Value
    Else
        ActiveCell.Value = ActiveCell.Offset(rowoffset:=0, columnOffset:=-3).Value * Cells(1, 9).Value * Cells(2, 9).Value
    End If
    
ActiveCell.Offset(rowoffset:=-1, columnOffset:=0).Activate
Loop While ActiveCell.Row <> 1

'Добавление названия документа для КП от СВОКа
'Нужно для понимания программой в какое окно ей переключаться

Dim svok, dantex As Excel.Workbook
    Set svok = ActiveWorkbook

'Открытие документа для переноса информации
Workbooks.Open Filename:="\\zdt.uwg.local\Обменник\ДПО\Верухин С.А\Макросы\ЧЕРНОВИК ДЛЯ ПЕРЕНОСА СВОК НА КАНАЛКУ.xlsx"
    Set dantex = ActiveWorkbook

svok.Activate
ActiveWorkbook.Sheets.Add.Name = "КП"

dantex.Activate
Range("J39:A1").Select
Selection.Copy

svok.Activate
ActiveSheet.Cells(1, "A").PasteSpecial Paste:=xlPasteColumnWidths
ActiveSheet.Paste

Range("A1").RowHeight = 45
Range("A2").RowHeight = 31.5


'Удаление из буфера скопированного массива и закрытие черновика, откуда была взята форма КП
Application.CutCopyMode = False
    On Error Resume Next
dantex.Close False

'С этого момента у нас находится 2 листа в активной книге, которые называются КП ДР и КП
'КП - это страница, куда переносится вся информация
'КП ДР - это страница, откуда переносится информация

'Перенос данных из КП ДР в КП
ActiveWorkbook.Worksheets("КП ДР").Activate
Cells.Find(What:="Итого по предложению с учётом НДС", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate

Dim LastRowVKP As Integer
LastRowVKP = ActiveCell.Row

ActiveWorkbook.Worksheets("КП").Activate

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate

ActiveCell.Offset(rowoffset:=-1, columnOffset:=0).Select
    Do While ActiveCell.Offset(rowoffset:=-1, columnOffset:=0) = ""
        ActiveCell.Offset(rowoffset:=-1, columnOffset:=0).Select
        Selection.EntireRow.Delete Shift:=xlUp
    Loop
        ActiveCell.Offset(rowoffset:=1, columnOffset:=0).Select
    Do While LastRowVKP <> 0
        Selection.EntireRow.Insert Shift:=xlShiftDown
        LastRowVKP = LastRowVKP - 1
    Loop

'Приведение таблицы в божеский вид + добавление форматирования ко всей таблице
Dim LastFirstRow, LastRow As Range
    Set LastFirstRow = ActiveCell

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
        
    Set LastRow = ActiveCell

Range(LastRow.Offset(rowoffset:=-1, columnOffset:=2), LastFirstRow.Offset(rowoffset:=0, columnOffset:=-6)).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlContinuous
    Selection.Borders(xlEdgeLeft).Weight = xlThin
    Selection.Borders(xlEdgeTop).LineStyle = xlContinuous
    Selection.Borders(xlEdgeTop).Weight = xlThin
    Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous
    Selection.Borders(xlEdgeBottom).Weight = xlThin
    Selection.Borders(xlEdgeRight).LineStyle = xlContinuous
    Selection.Borders(xlEdgeRight).Weight = xlThin
    Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
    Selection.Borders(xlInsideVertical).Weight = xlThin
    Selection.Borders(xlInsideHorizontal).LineStyle = xlContinuous
    Selection.Borders(xlInsideHorizontal).Weight = xlThin

LastFirstRow.Offset(rowoffset:=0, columnOffset:=-6).Activate
Range(ActiveCell, ActiveCell.Offset(rowoffset:=0, columnOffset:=8)).Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 14277081
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
Range(ActiveCell, ActiveCell.Offset(rowoffset:=0, columnOffset:=8)).Font.Color = 0

Range(LastFirstRow, LastFirstRow).Offset(rowoffset:=0, columnOffset:=-6).Activate
Set LastFirstRow = ActiveCell


'Начало переноса SVOK на нашу форму DANTEX

'Действия в КП (КАНАЛКА)
ActiveWorkbook.Worksheets("КП").Activate
    Range(LastFirstRow, LastFirstRow).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
ActiveCell.Offset(rowoffset:=1, columnOffset:=0).Select
    
    Set LastFirstRow = ActiveCell

Cells(29, 1).EntireRow.Delete

Dim kolichestvo As Integer
kolichestvo = 0

Do While ActiveWorkbook.Worksheets("КП ДР").Range("B1") = "Наименование"

kolichestvo = kolichestvo + 1

'Действия в КП (КАНАЛКА)
ActiveWorkbook.Worksheets("КП").Activate
Range(LastFirstRow, LastFirstRow).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
ActiveCell.Offset(rowoffset:=1, columnOffset:=0).Select

Set LastFirstRow = ActiveCell
    
LastFirstRow.Offset(rowoffset:=-1, columnOffset:=0).Activate
    Range(ActiveCell, ActiveCell.Offset(rowoffset:=0, columnOffset:=8)).Select
        With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .Color = 14277081
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
    Range(ActiveCell, ActiveCell.Offset(rowoffset:=0, columnOffset:=8)).Font.Color = 0
ActiveCell.Value = "Установка "

LastFirstRow.Select

'Действия в КПДР (СВОК)
ActiveWorkbook.Worksheets("КП ДР").Activate
Range("B1").Offset(rowoffset:=1, columnOffset:=0).Select

Dim FirstRowSV, LastRowSV As Range
    Set FirstRowSV = ActiveCell
                If ActiveCell.Offset(rowoffset:=1, columnOffset:=0) = "" Then
                    Set LastRowSV = ActiveCell
                        Range(ActiveCell, "B2").Select
                            Selection.Copy
                                GoTo NextStep2
                End If
        
        ActiveCell.End(xlDown).Select
    Set LastRowSV = ActiveCell
        Range(FirstRowSV, LastRowSV).Select
            Selection.Copy

NextStep2:

'Действия в КП (КАНАЛКА)
ActiveWorkbook.Worksheets("КП").Activate
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Cells(LastFirstRow.Row, "G").Select

'Действия в КПДР (СВОК)
ActiveWorkbook.Worksheets("КП ДР").Activate
    Cells(FirstRowSV.Row, "C").Select
        Set FirstRowSV = ActiveCell
    Cells(LastRowSV.Row, "C").Select
        Set LastRowSV = ActiveCell
    Range(FirstRowSV, LastRowSV).Select
        Selection.Copy

'Действия в КП (КАНАЛКА)
ActiveWorkbook.Worksheets("КП").Activate
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Cells(LastFirstRow.Row, "I").Select

'Действия в КПДР (СВОК)
ActiveWorkbook.Worksheets("КП ДР").Activate
    Cells(FirstRowSV.Row, "G").Select
        Set FirstRowSV = ActiveCell
    Cells(LastRowSV.Row, "G").Select
        Set LastRowSV = ActiveCell
    Range(FirstRowSV, LastRowSV).Select
        Selection.Copy

'Действия в КП (КАНАЛКА)
ActiveWorkbook.Worksheets("КП").Activate
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

LastFirstRow.Offset(rowoffset:=-1, columnOffset:=6).Select
        Selection.ClearContents
    LastFirstRow.Offset(rowoffset:=-1, columnOffset:=8).Select
        Selection.ClearContents

Cells(LastFirstRow.Row, "G").Select
If ActiveCell.Offset(rowoffset:=1, columnOffset:=0) = "" Then
    ActiveCell.Offset(rowoffset:=1, columnOffset:=-5).Select
Else
    ActiveCell.End(xlDown).Select
    ActiveCell.Offset(rowoffset:=1, columnOffset:=-5).Select
End If
Set LastFirstRow = ActiveCell

'Действия в КПДР (СВОК)
ActiveWorkbook.Worksheets("КП ДР").Activate
 
'Удаление установки, которая уже перенесена
    Cells(LastRowSV.Row, "H").Select
    Range(ActiveCell, "A1").Select
    Selection.Delete Shift:=xlUp
    Range("A1").Select
    Selection.EntireRow.Delete Shift:=xlShiftDown
        Selection.EntireRow.Delete Shift:=xlShiftDown
            Selection.EntireRow.Delete Shift:=xlShiftDown
                Selection.EntireRow.Delete Shift:=xlShiftDown

Loop

'Перемножение ячеек I и G, для получения суммы количества установок и цены
ActiveWorkbook.Worksheets("КП").Activate
Cells(LastFirstRow.Row - 1, "J").Select
ActiveCell.FormulaR1C1 = "=RC[-1]*RC[-3]"

Do While ActiveCell.Row > 29
    If ActiveCell.Offset(rowoffset:=0, columnOffset:=-3) = "" Then
        ActiveCell.Offset(rowoffset:=-1, columnOffset:=0).Activate
    Else
        ActiveCell.FormulaR1C1 = "=RC[-1]*RC[-3]"
        ActiveCell.Offset(rowoffset:=-1, columnOffset:=0).Activate
    End If
Loop

'Получения розничных цен за счет умножения стоимости 1 штуки на 2 (розница = цена со скидкой + 76%)
Cells(LastFirstRow.Row, "H").Select
ActiveCell.FormulaR1C1 = "=RC[1]*1,6"

Do While ActiveCell.Row > 29
    If ActiveCell.Offset(rowoffset:=0, columnOffset:=-1) = "" Then
        ActiveCell.Offset(rowoffset:=-1, columnOffset:=0).Activate
    Else
        ActiveCell.FormulaR1C1 = "=RC[1]*2"
        ActiveCell.Offset(rowoffset:=-1, columnOffset:=0).Activate
    End If
Loop

'Удаление ненужных строк в КП

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate

ActiveCell.Offset(rowoffset:=-1, columnOffset:=0).Select

Set LastRow = ActiveCell
Range(LastRow, LastFirstRow).Select
Selection.EntireRow.Delete Shift:=xlUp


'Действия в КП (КАНАЛКА)
ActiveWorkbook.Worksheets("КП").Activate

Dim FP, SP, IT As Range
Cells.Find(What:="Розница, EUR. С НДС", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=1, columnOffset:=0).Select

    Set FP = ActiveCell

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=-1, columnOffset:=0).Select
    
    Set SP = ActiveCell
    
Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=0, columnOffset:=1).Select

    Set IT = ActiveCell

Range(FP, SP).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range(IT, IT).Select
ActiveCell.FormulaR1C1 = "=SUM(R[-1]C[1]:R26C[1])"
Range("A1").Activate

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=-1, columnOffset:=3).Select

If eur = 0 Then
    Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=-1, columnOffset:=2).Select
        Range(ActiveCell, "H27").Select
    'Selection.NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
    Selection.NumberFormat = "0.00"
    Selection.NumberFormat = "#,##0.00"
    
Cells.Replace What:="Розница, EUR. С НДС", Replacement:="Розница, RUB. С НДС", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="Цена со скидкой, EUR", Replacement:="Цена со скидкой, RUB", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="Сумма со скидкой, EUR", Replacement:="Сумма со скидкой, RUB", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="ВНИМАНИЕ! Цены указаны в Евро с НДС", Replacement:="ВНИМАНИЕ! Цены указаны в Рублях с НДС", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=1, columnOffset:=-5).Select
'Selection.NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
    Selection.NumberFormat = "0.00"
    Selection.NumberFormat = "#,##0.00"

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=0, columnOffset:=1).Select
'Selection.NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
    Selection.NumberFormat = "0.00"
    Selection.NumberFormat = "#,##0.00"

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=10, columnOffset:=3).Select
Range(ActiveCell, "T1").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=-1, columnOffset:=-1).Select
        Range(ActiveCell, "J27").VerticalAlignment = xlCenter
End If

If eur = 1 Then
    Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=-1, columnOffset:=2).Select
        Range(ActiveCell, "H27").Select
    'Selection.NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
    Selection.NumberFormat = "0.00"
    Selection.NumberFormat = "#,##0.00"

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=1, columnOffset:=-5).Select
'Selection.NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
    Selection.NumberFormat = "0.00"
    Selection.NumberFormat = "#,##0.00"

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=0, columnOffset:=1).Select
'Selection.NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
    Selection.NumberFormat = "0.00"
    Selection.NumberFormat = "#,##0.00"

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=10, columnOffset:=3).Select
Range(ActiveCell, "T1").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    
Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=-1, columnOffset:=-1).Select
        Range(ActiveCell, "J27").VerticalAlignment = xlCenter
        
End If

Cells(28, 1).EntireRow.Delete
Cells(27, 1).EntireRow.Delete
Cells(26, 1).EntireRow.Delete

Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("КП ДР").Delete
Application.DisplayAlerts = True

ActiveWorkbook.Worksheets("КП").Activate

'Добавление правила условного форматирования. Заливает шапку белым цветом, даже если вставить текст с другим фоном
Range("A1", "T23").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=СУММ($A$1:$T$23)"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorDark1
            .TintAndShade = 0
        End With
    Selection.FormatConditions(1).StopIfTrue = False

Range("A1").Select
'Подсчет количества перенесенных установок
MsgBox "Количество перенесенных установок" & " " & "=" & " " & kolichestvo

'Проверка ячеек в КП с нулевой ценой
Dim Nol As Range
Set Nol = Range("I27:I4000")
    For Each cell In Nol
        If cell.Value = 0 And cell.Value <> "" Then
            cell.Interior.Color = 255
        End If
    Next

Dim Msg4, Style2, Title2
            Msg4 = "Вы будете добавлять нашу автоматику в КП?"
                Style2 = vbYesNo + vbInformation + vbDefaultButton2
                    Response = MsgBox(Msg4, Style2)
        If Response = vbYes Then
            Call AvtomatikaDobavit
        End If

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub
Sub AvtomatikaDobavit()

Dim i As Long
    For i = 1000 To 28 Step -1
        If Cells(i, "B") Like "*" & "Установка" & "*" Then
            For s = 1 To 12
                Rows(i).Insert
            Next s
        End If
    Next


    ActiveSheet.Buttons.Add(968.25, 393, 144, 53.25).Select
    Selection.OnAction = "PERSONAL.XLSB!УдалениеСтрокВКПканалка2"
    Selection.Characters.Text = "Удалить пустые строки в КП после добавления автоматики и эту кнопку!"
        With Selection.Characters(Start:=1, Length:=47).Font
            .Name = "Calibri"
            .FontStyle = "обычный"
            .Size = 11
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .ColorIndex = 1
        End With

End Sub
Sub УдалениеСтрокВКПканалка2()
Application.ScreenUpdating = False

Cells.Find(What:="Итого:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False, SearchFormat:=False).Offset(rowoffset:=-1, columnOffset:=-6).Activate

'Set PustieStroki = Range(ActiveCell, "B28")
    'For Each Cell In PustieStroki
        'If Cell.Value = "" Then Cell.EntireRow.Delete
    'Next

Dim i As Long
    For i = ActiveCell.Row To 28 Step -1
        If Cells(i, "B") = "" Then
                Rows(i).Delete
        End If
    Next

    ActiveSheet.Shapes.Range(Array("Button 1")).Delete

Application.ScreenUpdating = True
End Sub

Изменено: Сергей Верухин - 10.08.2022 09:45:52
Обращение к адресу ячейки через VBA
 
Всем привет.
Помогите найти решение или подсказать направление его решения:

Есть файл Excel, в котором есть позиции (названия) с ценами и количеством
В файле всегда разное количество позиций, всегда разное количество строк, другими словами
Фото прилагаю, как выглядит это в Excel
Скрытый текст

Что я пытаюсь сделать с этими позициями:

Обратиться к ячейке E1, используя Cells.Find (Стоимость) и переместиться в ячейку ниже, используя ActiveCell.Offset
Далее активную ячейку объявляю как переменную Fcell и перемещаюсь вниз, ячейку e3 через .End(xlDown).Activate
Объявляю ее как переменную Scell. Далее вставляю в активную ячейку (в данном случае E3) , вставляю формулу ActiveCell.FormulaR1C1 = "=RC[-1]*RC[-2]"
А после, мне нужно автозаполнить этой формулой все позиции до переменной Fcell .

Далее в ячейку E13 (она может быть E15 или E20, всегда разная для разных листов Excel) записать формулу суммы для ячеек, которые находятся в диапазоне Fcell и Scell

Мой код выглядит так:
Код
Dim Fcell, Scell As Integer
Cells.Find(What:="Стоимость", After:=ActiveCell, LookIn _
        :=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
Fcell = ActiveCell.Row
ActiveCell.End(xlDown).Select
Scell = ActiveCell.Row
ActiveCell.FormulaR1C1 = "=RC[-1]*RC[-2]"

Но такой вариант обращения к автозаполнению для меня не работает:
Код
Selection.AutoFill Destination:=Range(Fcell, Scell), Type:=xlFillDefault

Если нужны какие-то уточнения по заданию, готов дополнить!

Прикрепил файл Excel с рабочей книгой, и файл с макросом. Запустив который, Вы попадете в тот момент, откуда я не знаю как правильно продолжить
Изменено: Сергей Верухин - 20.08.2021 11:23:19
Страницы: 1
Наверх