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

Страницы: 1
Запрос ajax на интернет сайт через vba, Извлечение данных из интернет страницы, в которой используются java скрипты
 
Всем привет! Пытаюсь на коленке сделать простенький парсер из Экселя под Электронный магазин Ленинградской области. К примеру, вот адрес страницы закупки https://zakupki.lenreg.ru/ProductRequestGroup/Index/111526 . Нетрудно догадаться, что последние шесть цифр - это по сути номер закупки. Далее встроенным в Эксель MS Query (Не PowerQuery, я все еще на Excel 2007) произвожу загрузку через <Получить внешние данные из Веба>. В целом большую часть информации в таком запросе удается получить, даже с учетом того, что Эксель подключается к сайту через устаревший IE. Но не везде так везет, в других магазинах без поддержки JAVA страница отказывается грузится. Но здесь пока прокатывает. Итак, выяснилось что  MS Query не цепляет два важных для меня поля: <Адрес поставки> и <Ответственное лицо>. При чем в окне предварительного просмотра перед загрузкой IE эти поля отображает, но в выгрузке они отсутствую. В итоге загрузил HTML код страницы в текстовм формете. И вот что обнаружил, информация в этих полях генерируется при загрузке страницы через  ajax запрос. Вот куски HTML кода этих полей:
Скрипт для генерирования <Адрес поставки>, где видно что в нечто похожее на переменную (a) записывается результат запроса ajax, и при некоем ответе на запрос в переменную записывается значение: либо извлеченный из какой то закрытой базы данных Адрес поставки, либо, если там пусто записывается значение  'Адрес не указан' :
Код
<script>
        $.ajax({
            cache: false,
            type: "Get",
            url: "/ProductRequestGroup/GetDeliveryAddress",
            data:  {
                 idGroup: "111526"
            },
            success: function (a) {
                if (a == null || a == "") {
                    $('#DeliveryAddress').val('Адрес не указан');
                }
                else {
                    $('#DeliveryAddress').val(a);
                }
            }
        });
    </script>
И ниже второй скрипт для генерирования поля <Ответственное лицо>. Все построено по логике описаной выше
   
Код
<script>
        $.ajax({
            cache: false,
            type: "Get",
            url: "/ProductRequestGroup/GetResponcibleUser",
            data:  {
                 idGroup: "111526"
            },
            success: function (a) {
                if (a == null || a == "" || a.Data == null || a.Data == "") {
                    $('#ResponcibleUser').val('Ответственное лицо не указано');
                }
                else {
                    $('#ResponcibleUser').val(a.Data);
                }
            }
        });
    </script>
В переменную (a)  записывается ответ на запрос ajax с выгрузкой результата - 'Конкретное ФИО' либо 'Ответственное лицо не указано'. Видно также, что для индексации запрос ajax использует все тот же шестизначный номер <idGroup: "111526">, что указан в гиперссылке - последние 6 цифр. Собственно стоит задача сделать макрос на формирование  запроса и получением результата текстовая строка с записью в переменную, например для адреса доставки - DeliveryAddress, для ФИО - ResponcibleUser. Пытался найти какое нибудь похожее решение в интернете, нашел вот такой пример тыц . Но ничего там не понял, кроме того что используется Get. Прошу помощи уважаемые форумчане!
Извлечение гиперссылки с недопустимыми символами
 
Всем привет! Столкнулся с такой проблемой. На листе есть https гиперссылки, в адресе которых включен символ #. Так вот, при попытке извлечь адрес в текстовую строку с помощью vba извлекается только часть до символа #, все остальное отсекается. Например в ячейке A1 содержится значение с привязанной гиперссылкой: https://internet.site/#/567875. Создаю процедуру
Скрытый текст

по итогам свойство .Address извлекает только https://internet.site/ остальное не видит. Пробовал через Replace(HL.Address, "#" ,"") не помогает,т.к. .Address упирается в символ # и не пускает для обработки дальше. Нагуглил что символ # не редкость и нужен для навигации по странице, однако получается, что не всю кодировку url понимает .Address. Подскажите пожалуйста, как извлечь всю строку с учётом всех символов в ссылке?
Заливка цветом строк по частичному совпадению текста через УФ
 
Здравствуйте товарищи! Есть задача с помощью УФ выделять цветом строки в таблице с условием частичного совпадения текста. Примеры, которые находил работают исключительно с точным совпадением текста. Для меня же требуется, чтобы под условие подподали текстовые значения с маской
"*Солн*" по столбцу G. Однако при попытке изменить формулу условного форматирования  

=$G3="Скид: 0 - ООО ""Солнышко"""

в такой вид =$G3="*Солн*"

заливка не работает. Помогите кто знает, как прикрутить маску в условное форматриование.

Изменено: Excelman - 10.09.2023 15:11:40
Совместная работа функций "Ячейка" и "Адрес"
 

Всем привет! На Листе1 в строке 3 забита формула поиска номера столбца через функцию ПОИСКПОЗ на соответствие по текстовым заголовкам столбцов на Листе 2. Найденые номера столбцов используются как аргументы в функции «Адрес».

Стоит задача на Листе 1 формулой через функции «Ячейка» и «Адрес» вернуть значение соответствующей ячейки из Листа 2.

Не могу добиться от функции «Ячейка» «значение» корректной работы ссылки полученной через функцию «Адрес». Прошу помощи. Использование функций Ячейка» и «Адрес» не принципиальны, просто это мой вариант попытки решить задачу.

Заранее спасибо. Пример прикладываю

Настройка вертикального скрола в UserForm через Свойство ScrollBars, Отключение скролла у встроенных кнопок в пользовательской форме
 
Всем привет! Создал пользовательскую форму (UserForm) в VBA. Форма Нужна для работы в Word. Понимаю, что форум по Excell, но общие приёмы, которые используется в VBA Excell подходят и для VBA Word. Суть проблемы. Форма содержит большое количество объектов TextBox расположенных вертикально в стобец. Объектов много и на форме не помещаются. Помогла ветка форума из архива с помощью Свойства ScrollBars форму можно скролить и разместить нужное количество объектов. Все хорошо, одно "НО". В форме есть группа кнопок по нижней границе и они скроляться со всеми объектами формы. Коврялся в свойствам этих кнопок хотел отключить их от общего скролла, но не нашел. Задача стоит, чтобы кнопки всегда находились поверх формы и нескролились.Подскажите люди добрые как поставить запрет на скролл моим кнопкам?  
Поиск соответствия всех значений, используя столбец, содержащий дубликаты.
 
Здравствуйте уважаемые обитатели форума. Помогите решить задачу. Файл с примером прилагается.

По столбцу «A» идут наименования товаров, в Столбце «B» содержаться соответствующие уникальные номера товаров. Условно данные по столбцам «A» и «B» являются базой данных, эталоном.   В столбец «D» вносятся наименования товаров, а в столбце «Е» формула должна находить соответствие по базе данных и возвращать уникальный код (из столбца «B»). Самое очевидное решение использовать ВПР. Но ВПР ищет только первое вхождение значения-дубликата ячейки игнорируя последующие. Решением могло бы быть использование ВПР с конкатенацией значений по столбцам «A» и «B»,  «D» и «E». Но в том-то и дело, по столбцу «E» значение заранее не известно, его нужно найти по базе данных. Другими словами, помогите создать универсальную формулу, результатом которой будет возвращение соответствующего значения из столбца «B» и в случае, если будут встречаться дубликаты (в примере яблоки, бананы, киви), то возвращать значение уникального кода первого дубликата, второго, третьего и т.д. в том порядке как они размещены в эталонной базе. Предполагается, что по столбцу «D» количество дубликатов будет равно количеству дубликатов базы данных (столбец «A») либо меньше, что должно предотвратить возникновение ошибки в случае переполнения дублирующих значений по столбцу «D».

Заранее спасибо всем откликнувшимся!

Изменено: vikttur - 15.09.2021 20:39:05
Импорт данных из Word в Excel макросом
 
Здравствуйте. Есть задача импортировать данные из word файла (.doc) на активный лист текущей рабочей книги. Вообще думал что реализовать автоматизацию можно через Query запрос, но оказывается в этом режиме Еxcel не умеет распознавать форматированный текст и "засасывает" целиком все данные, в том числе и служебные данные xml и как итог - на лист вываливается "каша" из символов. Прихожу к выводу (возможно ошибочному) что форматированный текст word импортировать в excel можно только используя буфер обмена. Нарыл здесь образец макроса, который запускает приложение Word. Методом тыка, т.к. слабо представляю как работает этот код  заменил строку
Код
Set objWrdDoc = objWrdApp.Documents.Open("C:\Doc1.doc")
на эту
Код
Set objWrdDoc = objWrdApp.Dialogs(80).Show
Добившись тем самым вызов диалогового окна открытия файла. В сети встречал варианты где минуя операции выделения (Ctrl+A) и копирования данные сразу переносятся с документа Word на лист Excel типа Range("A1").Value = WordDocument.Range. У меня нечего не получилось. Почему то при запуске процедуры управление передается в приложение Word и макрос далее не может вернуться в Excel и вставить данные. Пришлось делать еще один макрос для запуска процедуры импорта. Тогда управление (фокус) c Excel не уходит и данные успешно импортируются. В итоге родилось вот это
Код
Sub Zapusk_Word_iz_Excel()
    Dim objWrdApp As Object
    Dim objWrdDoc As Object
    On Error Resume Next
    Set objWrdApp = GetObject(, "Word.Application")
        If objWrdApp Is Nothing Then
            Set objWrdApp = CreateObject("Word.Application")
            Set objWrdDoc = objWrdApp.Dialogs(80).Show
            ' здесь в случае Отмены нужно что-то типа If objWrdDoc is Nothing then Exit Sub
            objWrdApp.Visible = True
        End If

    Set objWrdDoc = objWrdApp.Selection.WholeStory
    Set objWrdDoc = objWrdApp.Selection.Copy
    Set objWrdApp = Nothing
End Sub

Sub Vstavka()
Zapusk_Word_iz_Excel
    If Application.ClipboardFormats(1) = -1 Then
        MsgBox "Буфер обмена пуст"
        Exit Sub
    Else
        Range("A5").Activate
        ActiveSheet.Paste
    End If
    
End Sub
Что в итоге? Хотелось бы реализовать код в одном макросе и минуя операции выделения-копирования в word'e. Также хотелось бы добавить реакцию на нажатие кнопки "Отмена" в диалоге открытия файла - то есть word не должен запускаться как сейчас. Прошу помощи
Изменено: Excelman - 22.03.2019 14:16:43
Как задать перебор ячеек циклом по столбцу внутри заданного диапазона
 
Всем привет. Прошу помощи. Сделал простейший макрос перебора ячеек в заданном диапазоне.
Код
Sub ResultatDiapzn2()
Dim Resultat As Range
Dim iKod As Range
    
Set Resultat = Sheets("Resultat").Range("A4", Sheets("Resultat").Cells(Rows.Count, 3).End(xlUp))
    For Each iKod In Resultat.Columns(1)
        MsgBox iKod
        'MsgBox iKod.Address
    Next iKod
End Sub
Если задать перебор так For Each iKod In Resultat, то перебираются все  ячейки диапазона. Но мне нужен перебор только в первом столбце в  заданном диапазоне, поэтому задаю перебор For Each iKod In Resultat.Columns(1). И тут компилятор выдает ошибку по строке MsgBox iKod. Для наглядности я поменял вывод на
MsgBox iKod.Address. Обнаружилось что переменная iKod почему-то приняло значение целиком всего диапазона Resultat.Columns(1) и стало быть быть перебора не происходит. Подскажите что надо поправить чтобы перебор ячеек был внутри диапазона Resultat.Columns(1).
Заранее спасибо
Переменная в макросе Excell при импорте внешних данных через запрос (Microsoft Query) к базе данных MS Access., Изменение макросомиз под Excell запроса Microsoft Query
 

Здравствуйте уважаемые! Есть задача импорта данных в таблицу Excell 2003 из БД MS Access 2003. Зам запрос я создал стандартным способом: Данные→Импорт внешних данных →Создать запрос. При этом запускается программа-посредник  Microsoft Query. В итоге запрос сделал успешно. Для автоматизации этого запроса записал макрос макрорекодером. «Тело» запроса постоянно, за исключением одного параметра, который можно в ручную изменить через Изменить запрос(Excell)→Microsoft Query→Создание запроса: отбор данных→Столбцы для отбора→Столбец <kod_cl>→условие <равно>→значение <изменяемые вручную данные какие мне нужны>. После того как записал макрос ввел в него переменную, которую хотел использовать в «теле» запроса вместо параметра значение.

Итоговый макрос:

Код
Sub ZAPROS()
Dim vX As Variant ' переменная для параметра <значение> в запросе Microsoft Query
Set vX = Range("K8") ' записываю в переменную данные из ячейки <K8>, в которую _
                    вручную вношу нужное мне <значение> для запроса
Range("A1").Select ' без предварительного выделения ячейки <A1>, макрос почему-то ругается.
    With Selection.QueryTable ' это <тело> запроса
        .Connection = Array(Array( _
        "ODBC;DSN=База данных MS Access;DBQ=\\FS\Progr$\АО\реальная\5\PROGR_390.mde;DefaultDir=\\FS\Progr$\АО\реальная\5;DriverId=25;FIL=MS A" _
        ), Array("ccess;MaxBufferSize=2048;PageTimeout=5;"))
        .CommandText = Array( _
        "SELECT All_dog2.kod_cl, All_dog2.naimen_full, All_dog2.n_dog, All_dog2.data_dog, All_dog2.n_szeta, All_dog2.data_sz, All_dog2.data_naz, All_dog2.data_okon, All_dog2.sum_szeta" & Chr(13) & "" & Chr(10) & "FROM All_dog2 All_dog2" & Chr(13) & "" & Chr(10) & "" _
        , "WHERE (All_dog2.kod_cl=1904)")
        .Refresh BackgroundQuery:=False ' если в запись "WHERE (All_dog2.kod_cl=1904)" вместо значения 1904 вписать переменную vX, _
        то в этой строке ошибка Run Time error '1004': Общая ошибка OBDC
    End With
End Sub

То есть, если в строке 12 в записи "WHERE (All_dog2.kod_cl=1904)" вместо значения 1904 прописать переменную vХ (в которой уже находится значение из ячейки "K8" ) то макрос останавливается на следующей строке (13) .Refresh BackgroundQuery:=False и выдается сообщение - Run Time error ‘1004’: Общая ошибка OBD.Если вместо vX прописать конкретное значение макрос снова работает.
Пожалуйста помогите "победить ошибку".
Изменено: Excelman - 24.05.2018 08:46:58
Вывод макросом в одну ячейку всех уникальных значений видимого диапазона
 
Здравствуйте господа. Возникла необходимость найти все уникальные значения в диапазоне и вывести все эти значения в одну ячейку текстовой строкой. Нашел на одном из сайтов небольшой макрос для поиска уникальных значений. Вот тело макроса:

Код
Sub ОтборУникальных()
 
'Объявляем переменные
'myRange - диапазон ячеек, заполненный исходным списком элементов
'myCell - отдельная ячейка диапазона
'myCollection - коллекция
'myElement - элемент коллекции (должен быть типа "Variant")
Dim myRange As Range, myCell As Range, myCollection As New Collection, _
myElement As Variant, i As Long
 
'присваиваем переменной myRange диапазон ячеек с исходным списком элементов
Set myRange = Range("B2:B29")
 
'заполняем новую коллекцию уникальными элементами
On Error Resume Next
For Each myCell In myRange
myCollection.Add CStr(myCell.Value), CStr(myCell.Value)
Next myCell
On Error GoTo 0 

На этом же листе в ячейку A1 требуется вписать строковое выражение - что-то по типу
Range ("A1"). Value = "Найдены следующие договоры:" &"№"& myElement "," + 1
То есть требуется из коллекции myCollection взять (перебрать) все уникальные значения myElement и поместить их в текстовую строку в ячейку A1 по шаблону указанному выше.
Прошу оказать посильную помощь в доработке макроса.
Как получить имя фйала при импорте листов из из разных Книг через метод GetOpenFilename
 

Здравствуйте уважаемые программисты. Прошу оказать помощь по «допилке» макроса. За основу был взять макрос Николая Павлова отсюда https://www.planetaexcel.ru/techniques/12/49/ . Этот макрос импортирует листы из других книг в одну книгу (активную). Стоит такая задача, чтобы макрос помимо импорта листов возвращал бы имя импортируемого файла (книги) в ячейку U1 Листа 1. В инете много описаний как с помощью метода .GetOpenFilename этого добиться. На одном из сторонних форумов нашел кусок кода под авторством Казанского, но внедрить его в макрос не получается - происходит останов с ошибкой.

Код макроса с моими изменениями:

Код
Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer
    Dim i As String ' переменная которую ввел для кода -получить имя файла
    Dim Name As String ' переменная которую ввел для кода -получить имя файла  
 
    Application.ScreenUpdating = False  'отключаем обновление экрана для скорости
    
    'вызываем диалог выбора файлов для импорта
    FilesToOpen = Application.GetOpenFilename _
      (FileFilter:="Файлы Excel 97-2003,*.xls", _
      MultiSelect:=True, Title:="Files to Merge")
   
   
'--------------------Пытаюсь получить имя файла--------------------------------

'Этот кусок кода приведен полностью как есть с одного из сторонних форумов (автор Казанский)
'FullPath = Application.GetOpenFilename
'i = InStrRev(FullPath, "\") 'позиция последнего \
'Name = Mid(FullPath, i + 1)
'Folder = Left(FullPath, i - 1)
'MsgBox FullPath & vbLf & Name & vbLf & Folder

'Вот моя попытка внедрить этот код в тело макроса
i = InStrRev(FilesToOpen, "\") ' Выдаёт ошибку - <Run-time error '13': Type mismatch>
Name = Mid(FilesToOpen, i + 1)
Worksheets(1).Range("U1") = Name
'--------------------------------------------------------------------------------
      
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбрано ни одного файла!"
        Exit Sub
    End If
    
    'проходим по всем выбранным файлам
    x = 1
    While x <= UBound(FilesToOpen)
        Set importWB = Workbooks.Open(FileName:=FilesToOpen(x))
        Sheets().Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        importWB.Close savechanges:=False
        x = x + 1
    Wend

    Application.ScreenUpdating = True
    ThisWorkbook.Sheets("Control").Activate
End Sub
Для меня казалось очевидным - достаточно переменную FullPath из образца заменить на FilesToOpen чтобы получить имя файла. Результат - ошибка <Run-time error '13': Type mismatch>. Прошу помощи исправить данную ошибку.
Как в макросе задать границы поиска для метода Find
 
Здравствуйте коллеги. Помогите допилить макрос. Имеется таблица, в котором макросом необходимо обнаружить формулу итогов, которая соответсвует определенной  Фамилии. Макрос который я "слепил" в принципе работает. Однако впоследствии выяснилось, что он работает не совсем правильно.
Итак, есть диапазон (A1:I 30). По столбцу "А" идут Фамилии. По столбцу "H" и "I" подсчитывается итог по каждой Фамилии. В столбцах "F" и "G" подсчитывается общий итог.
Задача макроса найти определенную фамилию, затем найти ячейку с соответствующей этой фамилии формулой (через маску) и сообщить что формула нашлась и имеет такой то адрес. Для простоты ограничимся поиском формулы по Фамилии Петров. Я использовал для этого Find с параметром поиска формул по столбцам. Для задания границ  поиска только по столбцу "H" указал:
Код
Set PetrovFormula1 = Diapazon.Find(What:="=SUM(F*:F*)", After:=Petrov.Columns(8), LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext)
то есть искать формулу после переменной Petrov в столбце 8 ( то есть столбец "H"). Ожидалось что поиск будет проводится только по столбцу "H" и если формула не найдется, то сообщается через  Msgbox "формула не найдена". Как уже говорил макрос работает, однако случайность показала, что если формулы в столбце "H" нет, то макрос безпрепятственно продолжает искать маску формулы по всему диапазону и находит похожую в столбце "F" и "радостно" рапортует, что формулу он нашел.

Вот тело всего макроса
Код
Sub CheckFormulaPetrov()
Dim Diapazon As Range
Dim PetrovFormula1 As Range
Dim Petrov As Range

Set Diapazon = Range("A1:I30")

Set Petrov = Diapazon.Columns(1).Find(What:="Петров", LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext)
            If Not Petrov Is Nothing Then
                MsgBox "Фамилия ""Петров"" получила адрес: " & Petrov.Address
                Else
                MsgBox "Фамилия ""Петров"" не найдена, адрес не задан"
            End If
Set PetrovFormula1 = Diapazon.Find(What:="=SUM(F*:F*)", After:=Petrov.Columns(8), LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext)
            If Not PetrovFormula1 Is Nothing Then
                MsgBox "Формула Петрова найдена по адресу" & vbCrLf & PetrovFormula1.Address
                Else
                MsgBox "Формула Петрова не найдена"
            End If
End Sub
Как все же правильно ограничить диапазон поиска в моем случае, то есть указать что искать надо только по столбцу "H" и в случае неудачи прекратить поиск формулы, а не искать дальше по всей таблице?
Коллеги прошу помощи.!

Пример прилагаю.  Для демонстрации корявости макроса в примере удалите формулу из ячейки H16.
Изменено: Excelman - 15.07.2017 09:38:30
Проверка на наличие данных в скрытых строках (ячейках) кодом VBA с выводом обнаруженных данных
 

Проверка на наличие данных в скрытых ячейках кодом VBA с выводом обнаруженных данных. Здравствуйте коллеги. Прошу помочь решить следующий вопрос:

Есть таблица с данными, в которой, к сожалению, встречаются скрытые строки. Смог сообразить макрос - через метод SpecialCells. Работает так - если в таблице есть скрытые строки, то просто выводится сообщение. Однако, если в скрытых строках ничего нет - меня они в общем не интересует, хуже когда там какие то данные все таки спрятаны, и это может ошибочно повлиять на итоговый результат вычислений, из-за этого нужно раскрывать и проверять, это очень не удобно. Знаний не хватает настроить макрос, чтобы он при наличии скрытых строк проверял бы их на присутствие каких -либо данных. В Экселе есть функция  ISBLANK, не знаю может ли она выполняться в VBA или это чисто экселевская функция,  если да, то как её настроить на проверку именно по скрытым строкам? Вот тело моего макроса

Код
Sub macros()
Dim A As Integer
Dim B As Integer
Dim Diapazon As Range


A = Range("N1:N27").SpecialCells(xlVisible).Count
B = Range("N1:N27").Count

If A <> B Then
    MsgBox "Обнаружены скрытые строки"
    Else
    MsgBox "Cкрытых строк нет"
End If
    'Тут дальше только логика процесса, потому как правильно сделать код не могу.
        'If ISBLANK Diapazon.Rows.Hidden - если в скрытых строках ничего нет (пусто), то выводим сообщение такое
        'MsgBox "В скрытых строках данных нет"
        'Else Иначе (то есть, если хоть какие то данные есть) выводим такое сообщение
        'Msgbox "В скрытых строках обнаружены данные.
        'Строка 3:----'Федоров'--'30''40'-------"
        'End If
End Sub

Коллеги, если с вашей помощью удастся научить макрос хотя бы сигнализировать о том, что в скрытых строках есть данных и на этом будет огромнейшее СПАСИБО. Но признаюсь честно, что очень хотелось чтобы в Msgbox'е с предупреждением отражались бы обнаруженные данные. По типу Строка 3: ----'Федоров'--'30''40'-------". В скрытых строках с обнаруженными данными интересует диапазон ячеек со столбца "B" по "Q" и если проверяемая скрытая ячейка не содержит ничего тогда в сообщении маркируется " -", обнаруженные данные заключаются в одинарные кавычки (в примере 'Федоров"). Заранее спасибо всем, кого заинтересует данная тема. Файл со своим макрос приложил.
Изменено: Excelman - 13.07.2017 14:32:44
Как получить средствами VBA из ячейки адреса других ячеек (букву столбца или (и) номер строки), которые заявлены в формуле как аргументы
 
Желаю всем здравствовать. Прошу оказать помощь в следующем. На листе есть таблица (переменная z). Для наглядности пусть в ячейке C13 будет формула = СУММ (I5:I13)/2. Этой ячейке присваивается переменная "r".  В столбце N содержаться формулы c маской СУММ (I*: I*), которые периодически повторяются вниз по столбцу через n-ое количество строк. Моей целью является поиск ячейки по столбцу N с формулой СУММ (I5:I13) , то есть Макросом требуется найти  ячейку в столбце N по маске ="SUM(I*: I*) но я не знаю как в маске вместо символа подстановки * указать, что номер строки должен браться у аргументов формулы, которая "зашита" в переменную "r" , то есть для первой буквы "I" это строка 5, а для второй "I" - 13 соответственно.  Как мне изменить маску поиска для переменной d ?  
Код
Sub macro1
Dim z As Range
Dim r As Range
Dim d As Range

Set z = Range("A1:Q40")
Set r = Range("C13")

Set d = z.columns(14).Find(What:="SUM(I*:I*)", LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext)

End Sub
Помогите пожалуйста!
Как правильно задать границы обработки диапазона для функции COUNTIF, если диапазон задан через переменную, правильный синтаксис для COUNTIF при использовании переменной вместо адреса диапазона.
 
Здравствуйте коллеги. Прошу помощи. Имею следующий макрос:
Код
Sub Check()
Dim dat As Range
Set dat = Range("A4:Q28")
MsgBox Application.WorksheetFunction.CountIf(dat, "груша")
End Sub

Понятно, что результатом будет вывод окна итоговой цифрой (количество ячеек, в которых есть слово груша). Однако мне необходимо сузить диапазон подсчета ячеек, то есть нужно чтобы COUNTIF обрабатывал в диапазоне "dat" только столбец "3". Но как это реализовать правильно не знаю. Обычно для таких целей я прописывал такую цепочку: Worksheets(1).dat.Columns(3). и дальше например .find(.......) и это срабатывало. Здесь так не получается. Вроде как по логике код строки с COUNTIF должен выглядеть так:

Код
MsgBox Application.WorksheetFunction.CountIf(dat.columns(3), "груша")
Однако VBE выдает ошибку компиляции.
Подскажите решение, пожалуйста.

Изменено: Excelman - 20.04.2017 16:01:14
Проверка на присутствие заданных значений в диапазоне, которому присвоена переменная, без перебора (цикла) и метода Find
 
Здравствуйте форумчане! Пожалуйста помогите в решении следующего вопроса.
Есть некий диапазон, например, (A49:Q71). В ячейках есть различные значения. Стоит задача макросом определять присутствуют ли одновременно в указанном диапазоне заданные значения (например, яблоки, груши, бананы) по типу - Если да, то действие 1, иначе действие 2 (If... Then...Else). В интернете есть примеры таких макросов, но в основном они построены по типу перебора, т.е. циклов. К сожалению, я так и не смог осилить логику их работы с их счетчиками, входами, выходами. "Книжонки" по VBA не помогают. По крайней мере я так и не нашел  толковую для уровня "чайник".Только пустые обещания, что мол VBA это просто, а на деле дальше макрорекордера с такими "самоучителями" не продвинешься. В принципе через метод Find и конструкцию If...Then  я такую задачу решал многократно дублируя код под каждое искомое значение. И вот в интернете попался макрос, где без цикла и метода Find проверяется наличие значений. Я переделал его под свою задачу и вот "кусок" от него:
Код
If [or(A49:Q71="яблоки")] And _
   [or(A49:Q71="груши")] And _
   [or(A49:Q71="бананы")] Then  
   MsgBox "Диапазон содержит заданные значения"
Else
   MsgBox "Диапазон не содержит заданные значения"      
End If
На моё удивление макрос заработал. Но когда я решил присвоить переменную Data для диапазона и работать с диапазоном через переменную, то в этой части макроса  вышла ошибка: Run-Time error '13': Type mismatch
Код
Dim Data As Range
Set Data = Range ("A49:Q71")
If [or Data="яблоки")] And _
   [or(A49:Q71="груши")] And _
   [or Data="бананы")] Then 
   MsgBox "Диапазон содержит заданные значения"
Else   
   MsgBox "Диапазон не содержит заданные значения"      
End If
Из справки к ошибке понял что это как то связано с неправильным свойством объекта. В итоге пробывал писать так
Код
If [or Data.Range="яблоки")]
и так
Код
If [or Data.Cells="яблоки")]
и  всё равно ошибка. Прошу помогите разобраться. Что тут не так?

P.S. Кстати, если кому пригодиться Find как раз умеет  искать в диапазоне, который задан через переменную.  
Изменено: Excelman - 14.04.2017 17:45:04
Пошаговое "раскрытие" скрытых строк сверху вниз при внесении данных в таблицу., "Расширение" таблицы путем отображения скрытых строк с заданным шагом
 

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

В таблице есть 4 блока товаров. Каждый блок состоит из 30 строк. Для компактности внутри блока пустые строки скрыты, кроме первых двух и последней с итогом. Сконструировал простейший макрос. Работает так - при внесении данных в первую строку по столбцу "F" (Ячейка  Cells(5, 6)) "раскрывается" (через Hidden = True) вторая по счёту строка. И наоборот, если целевая ячейка пуста, то вторая по счёту строка скрывается. Весь макрос "сшит" из кусков по типу:

Код
If Cells(5,6).Value = 0 Then
     Rows(7).Hidden = True
   Else Rows(7).Hidden = False
End If 

просто последовательно менял номера строк. "Хватило" меня только на один блок. А нужно чтобы все четыре блока так работали.  Понимаю, что конструкция примитивная и кроме того макрос привязан к модулю листа через Worksheet_SelectionChange, что серьезно "грузит" систему, стоит только на листе в любом месте ткнуть мышью как идет пересчет ячеек по всему листу.  Очень хочется получить цикл с меньшим количеством строк и по возможности привязать к другому менее требовательному к ресурсам "событию". Файлик с макросом прилагаю. Целевой столбец выделен желтым цветом.

Изменено: Excelman - 09.04.2017 10:44:37
Импорт данных из динамического массива с автоматической подстройкой формул вычислений и диалоговыми сообщениями.
 

Доброго всем времени суток! Много раз меня выручал этот форум. Потому прибываю в неоплатном долгу перед всеми кто мне помогал. Не смею рассчитывать на то, что кто то снова будет тратить свое время на меня за "Спасибо". Однако, если кто из консультантов решит, что те вопросы которые я ставлю на обсуждение достаточно трудозатратны и требуют денежного вознаграждения, я не исключаю и такой вариант. Задача которую мне предстоит описать для знатоков VBA не сложна, но для того что бы понять чего я ожидаю от неравнодушного сообщества мне необходим много слов. Возлагаю надежды на лояльность модераторов, чтобы сия тема была все таки допущена на форум.

Итак, на моей "славной" работе руководство, видимо посчитав, что я за зря ем "хлеб" фирмы поручило мне наряду с моей непосредственной работой (вообще я специалист договорных отношений, т.е. юрист) в нагрузку одно довольно "геморройное" занятие. А именно - теперь я еще должен проверять (контролировать) сдачу графиков посещений нашего обслуживающего персонала среди Клиентов компании. Всё это дело ведется в Эксель 2003. Обилие ручной работы при этом контроле меня "убивает". Естественно никого не заботит как я это буду делать, хотя по хорошему здесь нужен толковый "прог" на уровне  VBA. Но это не реально, ему же надо платить зарплату, а мне можно не платить. Ну вот, пожалился... вроде полегчало...

Итак суть. Есть обслуживающий персонал - специалисты. У каждого спеца есть свои Клиенты. Спецы обязаны еженедельно заполнять в Эксель График посещений Клиентов. То есть, книга (файл) содержит листы. Один из листов содержит Плановый график, а другие листы - текущие графики. Моя задача проверить достоверность всех графиков (Плановый и текущие). Я додумался создать некий шаблон с правилами, и при импорте данных из графика специалиста в мой шаблон правила "подсветят" косяки, если таковые имеются. Прилагаю свой подопытный образец. Первый лист "План" - это и есть проект шаблона (по сути лист Получатель данных). Далее листы содержащие графики специалистов (листы Источники данных). График представляет собой две таблицы (верхняя и нижняя). Условно верхняя таблица называется "Плановый на март", нижняя - "Дополнительные визиты". Обе таблицы разделены на 5 дней недели. Здесь по тексту я решил, что диапазон строк и столбцов в таблице в границах одного рабочего дня назвать микромассивом. То есть, в каждой таблице есть 5 микромассивов: понедельник, вторник, среда, четверг, пятница. Скажем так, верхняя таблица (Плановый на март) является Первичной, нижняя таблица (Дополнительные визиты) - вторична и задействуется для обработки макросом только при условии наличия обоюдных связей в формулах по столбцу "Н". Пример итогового результата - кнопка Пятница. Если связи нет, то макрос обрабатывает только верхнюю таблицу Пример итогового результата - Все кнопки с понедельника по четверг. Я уже сделал кучу кнопок с макросами для импорта данных из листа Источника в лист Получатель. Разумеется пользовал макро рекодер  В результате макросы примитивны и корректно работают только при фиксированном и неизменном размере массивов на листе Источнике, а это невозможно. Более того не исключено и небрежное форматирование таблицы самим специалистом (где то есть пустые строки, или разрыв формул). Предполагается, что массив на листе Источнике будет динамичным, т.е. количество строк внутри дня недели не лимитируется и м.б большего либо меньше чем в примере. Нужен умный "макрос" чтобы он умел выделять на листе Источнике только тот диапазон массива (микромассив), который относится к конкретному дню недели. Очевидно, что необходимо задать границы микромассива на листе Источник по некоторым условиям. Для наглядности конечного результата можно понажимать мои кнопки. Так кнопки "понедельник", "вторник" и т.д. на листе Источник выделяют нужные микромассивы и копируют их в заданные диапазоны на лист Получатель. Замечу, что для простоты на листе Получателе предполагается, что размер микромассивов (диапазон строк и их количество) фиксирован и число строк постоянно (26 строк на один день, микромассив).  Это избыточно, но зато, на мой взгляд, упрощает импорт данных и не нужно беспокоиться о размере микромассива на листе Источнике. Вряд ли будет ситуация, где количество строк в источнике на один день превысит значение 26.

Кнопка DeleteData - очищает мой шаблон (лист Получатель) от старых данных. Кнопка "Все рабочие дни" запускает поочередно все макросы начиная с понедельника по пятницу.

По умолчанию на листе Получатель в столбце "H" в каждой первой ячейке микромассива указывается значение "8:45" - это отправная точка отсчета времени. Начиная с каждой второй ячейки микромассива и по последнюю строку (понедельник H6:H30, вторник H32:H56, среда H58:H82, четверг H84:H108, пятница H110: H134) забита формула на прирост рабочего времени. В самом простом случае предполагается, что формулы по столбцу "H" на листе Получателе недолжны изменяться, то есть макрос их "не трогает".  Для наглядности: в результате работы макроса на листе Источник должны быть корректно выделены и скопированы 5 микромассивов с несмежными диапазонами из верхней таблицы. В примере получается, что несмежные диапазоны понедельника - C5:G12 и I5:J12, вторника -  C16:G28 и I16:G28, среды - C29:G40 и I29:J40, четверга -  C41:G50 и I41:J50, пятницы - C51:G61 и I51:J61.

Я определил два основных условия определения границ микромассива и одно дополнительное условие для определения относимости данных (какие данные можно отнести к понедельнику, вторнику, среде, четвергу и пятнице):

1. Условие. Думаю, что в моем примере верхней границей микромассива на листе Источник должна быть каждая строка, где в столбце "Н" содержится значение времени "8:45". Именно это значение указывают все специалисты вначале своего дня. К другим критериям привязаться проблематично. Например, столбец "А" содержит текстовые значения - понедельник, вторник, среда, четверг, пятница по всему своему диапазону (в пределах обеих таблиц, конечно) и логичнее было бы привязать верхнюю границу к ячейке с текстом понедельник, вторник и т.д.. Однако, в результате небрежного форматирования, ячейка с днем недели может быть выше или ниже строки со значением "8:45" по столбцу "H"  (начало рабочего дня), что приведет к неправильному определению верхней границы микромассива. Обратите внимание на лист Источник, в верхней таблице - вторник (пример небрежного форматирования). В тоже время нужно чтобы макрос определял верхнюю границу микромассива именно по первому встретившемуся значению "8:45", которое вводится вручную. На примере образца на листе Источник в четверг первым значением "8:45" макрос должен считать ячейку "H41", а не ячейку "H42". Не знаю имеет ли это значение для дела, но предполагается, что в графиках в столбце "H" в первой строке микромассива (это начало дня) всегда значение равное "8:45" специалист выставляет вручную, это не результат вычислений формулы. В итоге значение "8:45" введенное вручную в столбце "H" - это верхняя граница каждого микромассива.

2. Условие. Нижняя граница микромассива должна определяться строкой, которая содержит группу формул. Например, в понедельник эта группа формул содержится в строке 12 (диапазон N12:Q12). Опять же, если это имеет значение для дела, то указанная группа формул (суммы по столбцам) в каждом микромассиве повторяется и, конечно, при изменении числа строк внутри микромассива динамически изменяется диапазон вычислений внутри этих формул.

3. Условие.  Соответствие дня недели Источника и Получателя. Иногда рабочая неделя состоит из трех дней.  На примере образца - лист 3. Необходимо чтобы макрос на листе Источник скопировал данные по оставшимся микромассивам (у нас это среда, четверг, пятница) и результат помещался на листе п

Получатель в соответствующий диапазон. В нашем примере с листа Источника данные со среды должны перейти на лист получатель также в среду, четверг в четверг ну и пятница в пятницу. Полагаю, что здесь каким то образом необходима проверка условия на наличие текстового значения в диапазоне столбца "A". То есть, макрос должен проверить - какое текстовое значение он найдет в диапазоне микромассива (между верхней строкой и нижней строкой) по столбцу "А".  Если в заданных диапазонах по столбцу "A" он найдет "понедельник", то весь микромассив, в границах которого нашлось это слово он должен скопировать соответственно в лист Получатель, в начало диапазона Понедельник. И так далее. В случае если на листе Источнике обнаружится микромассив, который не имеет в столбце "А" текста "понедельник", "вторник", "среда", "четверг", "пятница", то необходимо чтобы макрос выдал сообщение что-то типа: "Не могу определить вторник". А в случае, если специалист ошибочно по столбцу "А" в пределах одного дня указал два и более текстовых значения (например, понедельник и вторник) то необходимо сообщение что то типа "Не правильно задан день недели".

Написано очень много, даже страшно продолжать. Но если у кого-то хватило терпения, мне остается только благодарить этого человека и надеяться, что будут предложены варианты. Итак я уже делал оговорку, что в самом простом случае макрос обрабатывает только верхнюю таблицу. В более сложном варианте (посмотрите Пятницу) предполагается, что макрос должен определить по связям в формулах (если такое вообще возможно)  по столбцу "Н" наличие дополнительных данных в нижней таблице "Дополнительные визиты" и также аккуратно выделить обнаруженный диапазон и скопировать его в лист Получатель тоже в нижнюю таблицу. При этом макрос должен внести соответствующие изменения на листе Получатель в те формулы, о которых я раньше говорил, что они  не должны изменяться макросам в простых случаях. Если нажмете на кнопку "Пятница" то вы сможете увидеть, что из-за несогласованности формул результат вычислений по времени в столбце "Н" на листе Получателе не верный. То есть при переносе данных он (макрос) должен на листе Получателе (План) привести в соответствие формулу с той же логикой вычислений как на самом листе Источнике данных. Опасаюсь, что мой трактат "трещит" по швам. Дополнительные текстовые пояснения содержатся непосредственно в самом файле на первом листе (Получатель). Друзья понимаю, что многого хочу, но надеюсь, что возможно проект удастся воплотить в жизнь, если Вы примите свое участие хотя бы по кусочку. Возможно вместо одного большого макроса можно сделать много маленьких. Например был бы рад маленькому макросу как определить и выделить микромассив "понедельник" для последующего копирования на лист Получатель. По аналогии сделаю макросы для других дней, если одним макросом сразу на все дни сделать сложно.

В любом случае спасибо всем, кто потратил своем время и дочитал до конца. Уповаю на Вас и внемлю  .

Изменено: Excelman - 26.03.2017 18:01:51
Автоматическое заполнение ячейки через список Combobox, использование Combobox с сохранением выпадающего списка
 
Здравствуйте дорогие форумчане. Давно не посещал форум. Возник вопрос и вот я тут)))
Решил создать своеобразный калькулятор рациона питания. Помагает при составлении диеты.
Итак, в рабочей книги три листа: NewРацион; Табл Ккал; BMR.
Для моей задачи интерес представляют только листы NewРацион и Табл Ккал.
На листе NewРацион содержатся практически все формулы и макросы. На листе Табл Ккал
по сути только данные по конкретным продуктам питания (наименование, жиры, белки, углеводы, ккал).
На листе NewРацион есть шесть почти одинаковых строковых блоков,
которые через макросы можно скрыть или открыть. В каждом блоке в столбце "B" создан выпадающий
список продуктов, с привязкой к листу Табл Ккал.
Помогите пожалуйста создать макрос используя Combobox. Не буду скрывать для меня почти
любой макрос, который нельзя написать с помощью макрорекодера очень и очень сложно сделать.
Я бы очень хотел внедрить макрос, с помощью которого при выделении ячейки
в столбце "B" (в пределах диапозана строк конретного блока) появляется комбобокс, по мере набора символов
список комбобокса сокращается, потом кликаем по нужной позиции и нужный продукт заносится в ячейку.
Я совсем не знаком с функцией Combobox, поэтому не хотелось бы выглядеть глупее чем на самом деле,
но было бы здорово, если подбираемый список продуктов формировался бы с учетом любого вхождения
в строку наименования продуктов, например, при наборе слова банан хотелось бы видеть, что в списке есть
все позиции, где встречается это слово, например:

банан,
чипсы банановые,
мороженое ванильно-банановое,
...
и т.д

Очень бы хотелось при этом сохранить выпадающий спиок на случай, если придется искать
наименование продукта вручную.

Заранее благодарен за любую оказанную помощь. Файл прилагается (Excel 2003).
Переменная рабочей книги для запуска связанных с именем книги макросов
 
Здравствуйте уважаемые специалисты. Вновь обращаюсь к Вам за помощью. Надеюсь не обделите вниманием. В общем суть вопроса. Есть некий файл (рабочая книга) созданный  в Excel 2003. В рабочей книге есть два листа "Конструктор" и "Результат" . На первом листе "Конструктор" над рабочим диапазонов расположены кнопки "Закрыть" и "Раскрыть" с привязкой к макросам, при нажатии которых соответственно диапазон либо скрывается либо отображается. На втором листе "Результат" есть одна кнопка "Перенос" тоже с макросом, при нажатии на которую копируется заданный диапазон на листе "Результат", затем становится активным лист "Конструктор", нажимается конопка "Раскрыть" (то бишь запускается вторичный макрос, привязанный к кнопке "Раскрыть";), вставляются скопированные данные в заданный диапазон и на этом работа макроса "Перенос" останавливается. То есть в теле макроса "Перенос" лежит команда запуска вторичного макроса "Раскрыть".   Понятно, что в реальности у меня может быть более длинная цепочка вторичных макросов. Для простоты примера я выложил более простую схему. В целом конструкция работает как надо, но столкнулся с одной неприятной "печалькой". Оказалось, что в теле первичного макроса в коде запуска вторичного макроса прописывается абсолютное имя рабочей книги и имя второчиного макроса. Это приводит к тому, что если я изменю название рабочей книги и не произведу коррекцию этого названия в теле макроса, то при попытке его запустить (первичный макрос), Excel выдаст ошибку

Run-Time Error '1004': Не удалось найти "такой то файл". Проверьте задание имени и местоположения файла.

Согласитесь, что это очень геморойно и жестко привязывает тебя к тому чтобы имя файла не менялось, в противном случае нужно делать корректировку во всех макросах где есть код содержащий имя книги.
Очевидно, что здесь уместнее ввести переменную и присвить её к имени книги. Тогда можно будет менять имя файла и не беспокоится что макрос перестанет запускаться. Думаю, что в модуль ЭтаКнига нужно засунуть объект ThisWorKBook. Однако ж ничего у меня не получилось. Пожалуйста посмотрите выложенный мною файл и подскажите какой макрос воткнуть в модуль  ЭтаКнига  и что подправить в первичном макросе "Перенос", что бы в коде запуска вторичного макроса была указана переменная вместо абсолютного имени рабочей книги.

Укажу код который я пытался использовать и который не сработал.
В модуле ЭтаКнига пытался задать перменную, что бы она задавалась при открытии книги
Код
Sub Wbook()
    ' Задание переменной
        Set B = ThisWorkbook
End Sub
В стандартном модуле вместо абсолютного имени рабочей книги вставил переменную "B"
Код
Sub Perenos()
' Perenos Макрос
' Макрос записан 05.03.2015 (user)
    Range("B3:C12").Select
    Selection.Copy
    Sheets("Констурктор").Select
    Application.Run "'B'!Raskryt"
    Range("B3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("B3").Select
End Sub
Но как уже говорил ничего не сработало, поэтому в выложенном файле я эти макросы не использовал. Более того для наглядности ошибки запуска вторичного макроса я изменил имя файла, не изменив при этом тело макроса. Достаточно переименовать файл (убрать из имени цифру 2) и всё будет работать. Думаю суть проблеммы понятна. Помогите пожалуйста люди добрые!
Автоматическая вставка полного текстового значения при вводе в ячейку его условного сокращения, Создание макроса ускоряющего ввод длинного заданного текстового значения
 
Прежде всего хочу поблагодарить за помощи в создании макросов таких специалистов как  Kuzmich , Leanna и  
Юрий М. Вы здорово мне помогли!!! Спасибо Вам не устаю Вас благодарить. Большая часть вопросов для своей формы автоматического расчета предложений была решена с помощью Вас.

Однако для юзабилити (так что ли говорят) хотелось еще кое что добавить. Сначала поясню суть вопроса более широко. В таблице расчета используется в столбце наименование товара длинные текстовые названия. Типа: Телевизор Toshiba 42 дюйма LCD PG452S. Подобные длинные названия берутся из прейскуранта. Очевидно, что это очень, извиняюсь за выражение, геморройно писать это все вручную. Но никуда не денешься, требуется указывать именно полное наименование как в прайсе. Я частично решил этот вопрос задав в нужном столбце определенного диапазона ячеек проверку данных и привязал её к списку из прайса. Вуаля, обрадовался я. Щелкаю на треуголник рядом с ячейкой и выбираю из списка наименование товара с его полным длинным названием. Пощелкав так продолжительное время я убедился что этот спсобо хоть и облегчает ввод данных но не является саммым оптимальным. Оказалос, что когда в прейскуранте товаров мало (до 10 и меньше) то этот способ с выпадающим списком более или менее приемлем. А вот когда их больше и даже за 100... Глаза сломаешь пока до щелкаешь по ползунку до нужного названия. И здесь по времени затраты на ввод данных ощутимо возрастают. Что же делать. И у меня возникло предположение, что в Excel можно составить определенный список-словарь условных сокращений наименования с соответствием их полному наименованию и желательно даже несколько видов сокращений на случай, если забуду какое-либо из них.  Типа

сокр1          сокр2           полное наименование
TVT42   = ТВТОШ42 = Toshiba 42 дюйма LCD PG452S
TVS39   = ТВСОН39 = Sony 39 дюйма LCD 45DERT
TVSA40 = ТВСАМ40 = Samsung 40 дюймов PDP 452IKS
И так далее. Думаю смысл понятен. Далее в столбце в определенном диапазоне ячеек при вводе в одну из ячеек какого либо условного сокращения и нажатии на клавишу Enter вместо "TVT42" вставлялось бы сразу  "Toshiba 42 дюйма LCD PG452S". То есть макрос должен произвести поиск условного сокращения в созданном нами словаре, найти соответствие по полному наименованию и вернуть его (полное наименование) в редактируемую ячейку.
В Excel нечто похожее реализовано на уровне интерфейса. Например, когда в столбце в непрерывном порядке вносишь текстовые значения, то в следующей ячейке если какая либо из первых символов совпадает с начальным символом значений ранее внесенных, он предлагает вставить повторяющееся слово. Но в моем случае, как вы понимаете, в столбце не будет содержаться этого ранее набранного списка.

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

На эту мысль меня подтолкнула обучающая статья Николая Павлова Пометка элементов списка. Только там привязывается макрос к событю "количество щелчком мышью"
Вот текст его макроса без изменений как есть
Код
'Ставим флажок, если был одиночный щелчок по ячейке
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub
        If Not Intersect(Target, Range("A2:A100")) Is Nothing Then
            Application.EnableEvents = False
            Target.Font.Name = "Marlett"
            Target = "a"
            Application.EnableEvents = True
        End If
End Sub
 
'Снимаем флажок, если был двойной щелчок по ячейке
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Range("A2:A100")) Is Nothing Then
        Application.EnableEvents = False
        Cancel = True
        Target.ClearContents
        Application.EnableEvents = True
    End If
End Sub 
Соответственно подскажите, что в этом макросе поменять чтобы он отслеживал изменения в текущем листе в диапазоне ячеек C3:C302 и в случае внесения в него условного сокращения из словаря вставлял бы полное наименование товара. Сам словарь соответствий условного сокращения и полного наименования товара хотелось бы разместить в теле данного макроса, а  не в виде отдельной таблицы на каком нибудь листе книги.
Для образца словаря  соответствий прошу взять эту основу

сокр1          сокр2           полное наименование
TVT42   = ТВТОШ42 = Toshiba 42 дюйма LCD PG452S
TVS39   = ТВСОН39 = Sony 39 дюйма LCD 45DERT
TVSA40 = ТВСАМ40 = Samsung 40 дюймов PDP 452IKS
Для меня так будет понятней
Вот в общем описание моей задачи. Как всегда прошу Вас помочь, Профи !
Вставка "счетчика" в строки содержащие одинаковые текстовые значения, вставка значения счетчика после текста, макрос
 
Здравствуйте специалисты. Этот вопрос больше к знатокам VBA. Не уверен что точно отразил суть вопроса в обозначенной теме, но попробую описать задачу максимально понятным языком.
Итак, есть Книга, назовем её условно Источник. В ней на заданном листе есть рабочий диапазон, в который вносятся наименования товаров и по заложенным в ячейках диапазона формулам рассчитывается стоимость каждого товара. Полученный перечень товаров с рассчитанной стоимостью условно назовем Таблица. Иногда требуется сравнить наглядно несколько вариантов Таблиц, которые отличаются набором товаров (иначе говоря, диапазон строк в диапазоне может меняться).  Для наглядности сравнения вариантов Таблиц требуется копирование Вариантов в другую книгу на один лист друг за другом в вертикальном порядке. То есть в новой книге на первом листе вставляется Таблица, если будет еще вариант, то он будет вставляться ниже после первой Таблицы.  Для этой процедуры у меня есть два  Макроса.
Первый макрос: С активного листа Источника выделяется и копируется определенный диапазон ячеек. Этим же макросом создается книга с названием "Varianty" (это название не условное, а реальное заданное моим макросом) и вставляется скопированный диапазон из Источника на первый лист Книги "Varianty". На этом макрос завершает свою работу. Если возникает необходимость добавить еще один вариант Таблицы в книгу "Varianty", то возвращаюсь в книгу Источник и запускаю второй макрос.
Второй макрос: Выделяется необходимый диапазон ячеек и копируется. Переходим в Книгу "Varianty" и ищем последнюю заполненную строку в Первой таблице смещаемся от нее на 6 строк ниже и вставляем новый вариант Таблицы. На этом макрос заканчивает свою работу.
В итоге если нужны еще варианты, то я просто снова запускаю второй макрос. И так до бесконечности.
Но мне этого показалось мало. Для лучшего визуального оформления я решил добавить в строки кода второго макроса вставку текстового значения Вариант 2. в ячейку (выше на одну строку от первой строки добавленной Таблицы). Смотрибельность улучшилась. Но вот беда. При каждом добавлении нового варианта Таблицы над ними вставляется одно и тоже текстовое значение Вариант 2. Можно конечно потом ручками исправлять Вариант 3, Вариант 4 и т.д. Но это ведь не есть умно. В VBA есть оператор Count. Вроде он работает как счетчик, но как прикрутить его в свою макрос не пойму. Второй макрос, который  вставляет варианты такой:
Код
 Sub VariantyPlus()
    
    'Задаем переменную для поиска последней заполненной строки в новой книге после переноса
    Dim iLastRow As Long
    
    'Выделяем и копируем диапазон для обоснования в источнике
    Range("A2:H307").Select
    Selection.Copy
     
    'Переходим в книгу Varianty 
    Windows("Varianty").Activate
       
   ' Ищем последнюю заполненную строку в столбце A в книге обоснование
   iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    ' Вставляем на 6 строк ниже новый Вариант
    Cells(iLastRow + 6, 1).Activate
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    ActiveSheet.Paste
    
    'Поднимаемся на строку выше над таблице и прописываем текст "Вариант 2"
    Cells(iLastRow + 5, 3).Value = "Вариант 2"
    ' А здесь я удаляю "хвост" содержимое в соседней ячейке справа, которой остался от Таблицы вставленной в книгу раньше, то есть  выше.  
    Cells(iLastRow + 5, 4).Clear
         
End Sub 
То есть хочется, чтобы этот макрос при очередном запуске вставлял в нужное место текст Вариант и порядковый номер - 2, 3 ,4, 5 и т.д. Подозреваю, что здесь может быть проблема в том, что если какую либо таблицу (например, Вариант 3) нужно будет удалить из книги  Varianty" и снова запустить макрос на вставку нового варианта, то  рузультат при замене  может быть таким Вариант 2, Вариант 5, Вариант 4. Поэтому было бы здорово  усложнить код, чтобы в макросе был реализован алгоритм, по которому он вставляет новую Таблицу, а затем пересчитывает все порядковые номера по текстовому значению "Вариант" сверху вниз. В результате  при вставке нового Варианта сохраниться преемственность нумерации по порядку.  
Оба этих варианта мне не по зубам. Рад буду как простому так и более сложному.

Уповаю и взываю к Профи VBA. Прошу Вашей помощи, господа!
Определение размера диапазона с определением нижней границы по формату ячейки, правильное задание имен переменных для адреса строки (ячейки)
 
К сожалению в отличие от многих специалистов посещающих этот форум с VBA я на "ВЫ", а не на "ТЫ". Мало чего понимаю. Макросы в основном создаю макрорекордером. Само-собой результат получается топорный. Уважаемый специалисты подскажите что нужно исправить в моем макросе чтобы решить задачу . Вкратце опишу суть. Работаю в Excel 2003. Есть книга с диапазоном данных с формулами и значениями. К диапазону применен автофильтр. На нижней границе диапазона в заданных столбцах в ячейках содержатся формулы с функцией =ПРОМЕЖУТОЧНЫЕ.ИТОГИ. Копирую заданный диапазон и вставляю на лист в новую книгу. По умолчанию вставляются значения. Однако для обоснования расчетов от меня требуется в новой книге в заданные столбцы перенести формулы и заменить результирующие значения формулой SUM. Для этого я снова возвращаюсь на первую книгу и копирую заданные диапазоны в нужных для меня столбцах, затем в новой книге в соответствующих столбцах вставляю как формулы. Поэтому алгоритму создал макрос. Однако никак не могу решить проблему. Например в результирующей ячейке столбца D где должна быть функция сумм вставляется вышеупомянутая =ПРОМЕЖУТОЧНЫЕ.ИТОГИ. Соответственно возникает ошибка. Я дополнил вручную макрос тем, что бы в результирующей ячейке вставлялась функция сумм. Сделал это так: Сначала активной ставиться ячейка D2. Затем включаю поиск по столбцу D через параметр форматирование. Ищу ячейку с форматом шрифт Calibri полужирный размер 11. Именно такой формат имеет результирующая ячейка. Найденная ячейка становиться активной. Перезаписываю её формулой SUM. Все заработало. Однако все жестко привязано к заданному количеству ячеек (а точнее строк) если их потом будет меньше или больше чем при ситуации когда писался макрос, то итог получается не правильным. Я уже понял что в макрос нужно ввести переменные для определения адреса верхней ячейки и нижней и потом переменные включить в формулу SUM. Но как на практике это сделать ума не приложу. Много вариантов перепробовал, но ничего не получается. Для упрощения приведу кусок макроса отвечающего именно за вставку формулы SUM в результирующую ячейку столбца D

Код
 Sub подсчет() 

Range("D2").Select 
With Application.FindFormat.Font 
.Name = "Calibri" 
.FontStyle = "полужирный" 
.Size = 11 
.Subscript = False 
End With 
Cells.Find(What:="", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ 
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _ 
False, SearchFormat:=True).Activate 
Application.CutCopyMode = False 

Selection.FormulaR1C1 = "=SUM(R[-6]C:R[-1]C)" 

End Sub 
Я думаю, что в строке кода Selection.FormulaR1C1 = "=SUM(R[-6]C:R[-1]C)" вместо 6 нужно взять некую переменную которая получается в результате операции вычитания переменной по первой строке активной ячейки и последней строки что то типа
iRowStart = ActiveCell.Row 'получаем номер строки верхней ячейки диапазона  
iRowEnd = ActiveCell.Row 'получаем номер строки нижней ячейки диапазона    

Здесь на форуме откопал похожую тему (http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=57898&TITLE_SEO=57898-summirovanie-peremennogo-diapazona&MID=483680&tags=&q=sum&FORUM_ID%5B0%5D=1&DATE_CHANGE=0&order=relevance&s=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8#message483680)

По задумке нужно ввести еще одну переменную
типа z =  iRowEnd  -  iRowStart , как раз бы в моем примере получилось бы число 6 , так как   iRowStart  в ячейке D2 равно 2, а в последней ячейке в столбце D найденной по формату равно 8, то есть 8-2=6.
Но ни фига ничего не получилось. Почему-то  Selection.FormulaR1C1 = "=SUM(R[-z]C:R[-1]C)" не переваривает переменную z. Компилятор выдает ошибку когда пытается выполнить код с этой строки.  

Прикладываю файл с примером. В нем два макроса привязаны к кнопкам "книгаobosnovanie" - запускает макрос на создание новой книги с именем  obosnovanie и копирует заданный диапазон данных с AD2 : AO307 из текущей книги в книгу "obosnovanie" с сохранением форматирования и ширины столбцов. Второй макрос (кнопка книга с переносом формул) сначала запускает макрос книгаobosnovanie, а потом переносит в заданные столбцы "D", "G", и "I" не значения, а формулы.
Помогите пожалуйста доработать макрос, чтобы SUM правильно считала по столбцам независимо от размера диапазона.
Файл вылез за 100Кб. Хотя всё удалил что лишнее.. Пропустите А?!

Нет файл не лезет. Запаковал его в zip.
Изменено: Excelman - 12.02.2015 00:18:14
Страницы: 1
Наверх