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

Страницы: 1 2 След.
Условие If ... Then и "дата". Помогите разобратся.
 
Ребят помогите разобраться как работает условие If...Then.
Вот допусти строчка кода:
Код
If Date > "01.01.2024" Then Exit Sub
По моей логике: системная дата > "01.01.2024" = ложь; значит идем по строчкам кода дальше.
Но на практике это вырождение запускает Exit Sub.
Then ведь выполняется при True.
ПС. Забыл сказать что Date это не моя переменная.
Изменено: Сергей020487 - 10.10.2023 08:07:00
VBA. Поиск и копирование в разных книгах
 
Доброго дня всем. Помогите пожалуйста доделать небольшой скрипт. Задача: открыть книгу где находится макрос, указать на листе "источник" слово или фразу в ячейке А2. Запустить макрос. Диалоговое окно в каких книгах искать - указываем, макрос стартует. Макрос ищет в столбцах C и D искомое слово или фразу (мне в голову кроме for each...Like ничего не пришло). Если находит совпадение, то копирует полностью строку на лист "Результат" книги откуда запущен макрос (Find). Перебором идем к следующей строке...следующей книге.
Изначальные мои хотелки которые я пытался наваять в модуле: Хотел чтоб если я прогнал один раз макрос и он собрал какой то массив на листе результат, иметь возможность на листе "источник" заменить искомую конструкцию и стартануть макрос еще раз, и он, при наличии результата продолжил бы тот массив который был собран в первый раз.

Небольшое пояснение. Почему искать в  C и D, а не просто в C. Потому что те книги где мы ищем совпадения, результат работы файнридера. Иногда файнридер разбивает колонку A  или B, тогда колонка с наименованиями попросту съезжает на одну.
Логическая задача по вхождению диапазона дат в другой диапазон дат по условию
 
Доброго дня. Есть задача. Нужно просчитать штрафы. ЧТо имеем:
1) Диапазоны дат и ставка штрафа, эти данные постоянны.
2) Есть дата уплаты и сумма, эти данные меняются.
Я в файле все условия расписал, но небольшое описание задачи оставлю сдесь.
Ход решения как бы я делал это руками:
1) Смотрю на первую дату уплаты денег, допустим 25.04.2019 я заплатил. Чтоб рассчитать за какие конкретно дни штрафуюсь, я смотрю на следующую дату уплаты, допустим 25.05.2019. Вычитанием понимаю количество дней за которые меня штрафуют и конечную дату фиксирую так же рядом (чтоб использовать ее в формуле). Это 30 дней (но нужно всегда прибавлять 1 день, на самом деле я не знаю нахрена, но нужно).
Сравниваем наш получившийся диапазон дат с диапазонами дат из константных данных, находим нашу строчку и берем оттуда ставку. Умножаем ставку на деньги и делим на 300.
Кажется что это не сложно. Однако часто получившийся диапазон дат попадает в два константных диапазона и тут у меня начинаются проблемы.
Посмотрите пожалуйста файл, я там расписал все. и ход ручного решения.
 
VBA удаление столбцов и дубликатов строк без остаточных следов
 
Проблема следующая.
Кодом удаляю столбцы а потом в единственном оставшемся столбце удаляю дубликаты. Затем мне нужно перевести в csv. Когда перевожу в csv, понимаю, что удаленные столбцы и строки оставили следы их присутствия, наверное тип ячеек (но я не уверен).
Вот эти кодом обрабатываю структуру:
Код
   Set wb = Application.Workbooks.Open(sFolder & sFiles)
        
   Columns("B:S").Delete
   Rows("1:3").Delete
   Columns("A:A").Replace What:="~(Годен*", Replacement:=""
   Columns("A:A").Replace What:="~(Без*", Replacement:=""
   Range("A:A").RemoveDuplicates 1
      
   wb.Close True
Вот такое получается после перевода в ксв:
Код
 
 
  ЛЕЙКОПЛАСТЫРЬ ПЕРЦОВЫЙ 6Х10 /НОВОСИБХИМФАРМ/ ,,,,,,,,,,,
 
 
  СПЛАТ ЗУБ.ЩЕТКА BLACKWOOD СРЕДНЯЯ [SPLAT]  ,,,,,,,,,,,
 
 
  ,,,,,,,,,,,
 
 
  ,,,,,,,,,,,
 
 
  ,,,,,,,,,,,
 
Вот эти запятые снизу вообще не нужны, да и спарва в принципе тоже. Помогите поправить код.
Изменено: Сергей020487 - 28.07.2023 09:30:32
VBA сложное удаление части текста в ячейке
 
Доброго дня. Задача во множестве файлов удалить колонки, строки, и часть теста в ячейках. После всего удалить дубликаты.
В принципе со все понятно, кроме удаления части текста. У меня сложная ситуация с условиями удаления, которые я описал в прилагаемом файле.
Сам код таков:
Код
Sub Get_All_File_from_Folder()
    Dim sFolder As String, sFiles As String
    Dim wb As Workbook
    On Error Resume Next
    
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    
    Application.ScreenUpdating = False
     
    lLastRowThis = ThisWorkbook.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    Библиотека = ThisWorkbook.ActiveSheet.Range("A1:B" & lLastRowThis)
    sFiles = Dir(sFolder & "*.xls*")
    Do While sFiles <> ""
        
        Set wb = Application.Workbooks.Open(sFolder & sFiles)
        
   
   Columns("B:S").Delete
   Rows("1:3").Delete


        lLastRowOpen = wb.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
        lLastColOpen = wb.ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column
        OpenFile = wb.ActiveSheet.Range("A1:A" & lLastRowOpen)
         
        Columns("А1:А").Replace What:="~(*~)", Replacement:="" 'тут я столкнулся со сложностью
 
       Range("A1:A").RemoveDuplicates 1, xlNo
     

    wb.Close true 
        sFiles = Dir
    Loop
    
    Application.ScreenUpdating = True
End Sub
Проблема с преобразованием в csv
 
Здравствуйте. Столкнулся с проблемой. Есть большой массив файлов эксель. Мне нужно массово их прогнать в csv с дальнейшим ипортом.
Пользуюсь прекрасным макросом который нашел на этом форуме. (прикрепляю)
Но появились проблемы:
Например в ячейке число 6 456,25. Формат ячейки числовой, галка разделителя установлена. Результат после макроса: "6,456,25" (с кавычками).
Если я перед применением макроса снима галку "Разделитель групп разрядов" то результат такой: 6456,25 (без кавычек).
Тоесть при формировании ксв учитывается не только значение ячейки но и ее свойство, если я правильно понимаю.
Дальнейший импорт уходит в ошибку из-за такого значение: "6,456,25".
Скажите пожалуйста, можно ли как-то это поправить?

ПС. В указанных файлах жестко установлен тип ячеек. Там где цифры числовой, там где слова текстовый. Общего формата нет.
Изменено: Сергей020487 - 20.07.2023 07:46:26
PQ: Оптимизация кода
 
Доброго дня. С миру по нитки я собрал некую функцию. С ее помощью мне нужно обработать 2000 файлов экседь (около 21 Гига). Функция не легкая, ну и не сложная (как народ тут выкладывает). У меня на компе 16 Г ОЗУ (свободно 14). Тк вот когда я применяю данную функцию к папке где хранится 1/10 часть всех файлов, PQ выжирает абсолютно всю оперативку уже на 6м файле и гдето на 10 начинает уходить в ошибку из-за нехватки оперативки.
Я прошу не то чтоб оптимизировать код, а просто глянуть, может гдето есть фатальная ошибка выжирающие все ресурсы.
Код
(z)=>
let
    Источник = Excel.Workbook(File.Contents(z), null, true),
    Лист1_Sheet = Источник{[Item="Лист1",Kind="Sheet"]}[Data],
    #"Удаленные столбцы" = Table.RemoveColumns(Лист1_Sheet,{"Column2", "Column3", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16", "Column17", "Column18", "Column19"}),
    #"Удаленные верхние строки" = Table.Skip(#"Удаленные столбцы",3),
    #"Текст в верхнем регистре" = Table.TransformColumns(#"Удаленные верхние строки",{{"Column1", Text.Upper, type text}}),
    пробелы = Table.TransformColumns( #"Текст в верхнем регистре",{"Column1", Text.Trim, type text}),
//тут я заменяю короткие строчки, если нашлись более длинные с таким же началом
    descr = List.Buffer(List.Distinct(пробелы[Column1])),
    full_descr =   
        Table.AddColumn(
            пробелы, 
            "description",
            (x) => List.Select(descr, (w) => Text.Contains(w, x[Column1]) and w <> x[Column1]){0}? ?? x[Column1]),
    #"Переупорядоченные столбцы" = Table.ReorderColumns(full_descr,{"Column1", "description", "Column4"}),
    #"Удаленные столбцы1" = Table.RemoveColumns(#"Переупорядоченные столбцы",{"Column1"}),
//тут я обращаюсь к другому запрошенному файлу
lst = List.Buffer(искомое[Столбец2]),
found = Table.AddColumn(#"Удаленные столбцы1", "позиция", (x) => List.Select(lst, (w) => Text.Contains(x[description], w)){0}?),
    #"Разделить столбец по разделителю" = Table.SplitColumn(found, "description", Splitter.SplitTextByAnyDelimiter({" тбл", " 0", " 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", " /", "№", ". ", " [", " (Год", " (Без"}, QuoteStyle.None, false), {"Column1.1", "Column1.2"}),
    #"Удаленные столбцы2" = Table.RemoveColumns(#"Разделить столбец по разделителю",{"Column1.2"}),
    #"Объединенные столбцы" = Table.CombineColumns(#"Удаленные столбцы2",{"Column1.1", "позиция"},Combiner.CombineTextByDelimiter(" ", QuoteStyle.None),"Сведено")
in
    #"Объединенные столбцы"
ПС, в данном запросе/функции есть ссылка на другой запрос. В нем список из около 1000 строк с наименованиями производителей. Длинна названий не большая.

Вот пока писал пост, PQ переключился на следующий файл и оперативка освободилась, сейчас занято 4,6 Гига. Не совсем понятен алгоритм. Тоесть при переходе на обработку следующего файла оперативка освобождается путем переноса буфера на жесткий диск?
Изменено: Сергей020487 - 16.07.2023 17:07:55
PQ: Обращение в запросе к другому запросу
 
Ребят, помогите обратится в запросе к другому запросу.
Создал запрос на обработку таблицы (Товарищ Alien Sphinx, мне сильно в этом помог). В данной таблице пришлось обратится к другой, в которой по сути просто находится один столбец. Значения этого столбца я хочу прикрутить к основной своей таблице. Но вот обратится к ней у меня не хватает знаний. Проблемы с последних двух строчек.
Думаю проблема в команде "Excel.CurrentWorkbook(){[Name="искомое"]}" у переменной "искомое"
Код
let
    Источник = Excel.Workbook(БЛА БЛА), null, true),
    Лист1_Sheet = Источник{[Item="Лист1",Kind="Sheet"]}[Data],
    #"Удаленные столбцы" = Table.RemoveColumns(Лист1_Sheet,{"Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16", "Column17", "Column18", "Column19"}),
    #"Удаленные верхние строки" = Table.Skip(#"Удаленные столбцы",3),
    #"Сортированные строки" = Table.Sort(#"Удаленные верхние строки",{{"Column1", Order.Ascending}}),
    #"Разделить столбец по разделителю" = Table.SplitColumn(#"Сортированные строки", "Column1", Splitter.SplitTextByEachDelimiter({"(Годен"}, QuoteStyle.Csv, false), {"Column1.1", "Column1.2"}),
    #"Измененный тип" = Table.TransformColumnTypes(#"Разделить столбец по разделителю",{{"Column1.1", type text}, {"Column1.2", type text}}),
    #"Удаленные столбцы1" = Table.RemoveColumns(#"Измененный тип",{"Column1.2"}),
    объект = Table.AddColumn(#"Удаленные столбцы1", "Column3", each Text.Trim([Column1.1])),


   
    descr = List.Buffer(List.Distinct(объект[Column3])),
    full_descr =   
        Table.AddColumn(
            объект, 
            "description",
            (x) => List.Select(descr, (w) => Text.Contains(w, x[Column3]) and w <> x[Column3]){0}? ?? x[Column3]),//до этого места все прекрасно работает

    искомое = List.Buffer(Excel.CurrentWorkbook(){[Name="искомое"]}[Content][Столбец2]), //тут я незнаю как обратится к другому подключению
    found = Table.AddColumn(full_descr, "позиция", (x) => List.Select(искомое, (w) => Text.Contains(x[description], w)){0}?)
in
    found
Изменено: Сергей020487 - 15.07.2023 16:52:41
PQ: Поиск более длинного варианта текста
 
Доброго дня. Ситуация следующая. Есть список-текстовый, некоторые значения, в силу ПО раньше обрезались после определенного количества символов. Сейчас же такого не происходит в 1С и все записи отображаются в полном наименовании. Можно ли создавая пользовательский столбец в запросе, перебором пройтись по всему списку и найти более длинный вариант? И чтоб в пользовательском столбце был список без обрезанных вариантов (конечно если нашлась пара).
извлечение HTML таблиц
 
Приветствую. Прошу помощи. Не могу разобраться. мне нужно извлечь информацию из HTML таблиц. Но не могу разобраться как это сделать.
К сожалению ссылку выкладывать нет смысла, так как на сайт можно зайти только из под сети. Постараюсь все подробно описать.
Что я делаю на данном ресурсе: указываю ИНН, период. По данному запросу вываливаются документы.
Когда я указываю ИНН и период в HTML коде не чего не меняется и выглядит он так:
Код
<html lang="ru"> <head>    <meta charset="utf-8"/>    <title>БЛА БЛА</title>    <base href="/бла/"/>
     <meta name="viewport" content="width=device-width, initial-scale=1"/> 
  <link type="image/png" sizes="32x32" rel="icon" href="./favicon-32.png"/> 
<link rel="stylesheet" href="styles.c3ce6e3af0134bf988bb.css"></head> 
<body>    <div class="index-content">      <div class="common-bkg"></div>   
  <app-root></app-root>    </div>  <script
src="runtime.a01c58b958d6cdc5bdab.js" defer></script><script
src="polyfills.377cf92b86fbe9bfd4c7.js" defer></script><script
src="scripts.9a69fe6b98afaed077f5.js" defer></script><script
src="main.9d941841bd24e3e4beaf.js" defer></script></body></html>
Я не разбираюсь в HTML, но потыкав понял, что тут нечего интересного. И вот когда я ввожу ИНН и период, ВСПЛЫВАЮЩИМ окном всплывает вкладочка, где перечисляются документы, а в коде появляется заветная для меня и непонятное продолжение
Код
<div class="cdk-overlay-container"></div>
а если ткнуть в любой документ, он визуально раскроется табличкой, а у указанной строчки кода появится вначале треугольник говорящий, что теперь этот контейнер можно развернуть и посмотреть, а там и будет <table
Скажите пожалуйста как обратится к указанному контейнеру?

Самым простым способом:
Код
Public Sub test()
Dim xhr As New XMLHTTP60
xhr.Open "GET",
"https://блабла",
False
xhr.send
Debug.Print xhr.responseText

End Sub
я не вижу указанного контейнера.

ПС Ребят, забыл сказать, что указанный ресурс работает исключительно на хроме.
Изменено: Сергей020487 - 01.06.2023 11:08:40
PQ: Поиск в текстовом списке совпадения из другого списка
 
Приветствую всех. в PQ есть рабочий список состоящий из нескольких слов. И есть второй список который содержит слова (именно отдельные слова) которые могут содержатся в первом списке. Хочу пробежаться по первому списку и найти какие позиции совпали, а какие нет. Короче как будто бы использовать фильтр в экселе, только искать не одно слово/фразу, а сразу много.

Если бы я искал одно слово или фразу в списке, то использовал бы:
= try if Text.Contains( [Column1], "нужное слово" ) then [Column2] else null otherwise null
Но вместо "нужное слово", мне нужно вставить список, это возможно используя Text.Contains?
PQ: Извлечение части текста
 
Ребят привет. Есть некий список с наименованием товара (Приложение пример-несколько строчек). Мне нужно извлечь из него название средства. Извлекаю я его следующим способом:
Код
a =
Table.SplitColumn(#"Измененный тип1", "Column1",
Splitter.SplitTextByAnyDelimiter({" 0", " 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", " /", " №", ". ", " [", " ("},
QuoteStyle.None, false), {"Column1.1", "Column1.2"}),
Тупо срезаю все что после знаков.
Но появилось новое требование: отдельно вычленить производителя который отражается как правило в середине или в конце текста. Согласно их программному обеспечению и настроек, производитель должен всегда быть заключен в "/" с обеих сторон. Но по факту иногда слеш открывается и не закрывается. А еще таким же слешем могут разделятся какието сокращения не имеющие отношения к названию производителя, например: П/П/О /МЕРК/, где мерк производитель, а все до него меня не интересует., а может быть вот так: П/П/О /МЕРК
В примере привел все возможные варианты события.
Как бы вы срезали данную инфу в PQ?
Парсинг.
 
Добрый день. Ребят скажите в личку во сколько встанет код для парсинга  одного  сайта, либо на vba либо на PQ.
НО! На сам сайт вам не зайти с глобалки, сайт закрыт. Я буду делать скрины и и копировать нужный код страницы.

ТЗ:
1) Вводимая информация ИНН, дата начала периода и дата конца периода.
2) На листе эксель создается заголовок.
3) При превышении лимита страницы экселя (1млн строк) создавать еще один лист, ну или предупреждать и останавливать цикл (буду уменьшать период)

От стартовой страницы до нужной (где я вижу необходимую информацию) 3 или 4 ссылочных перехода (если это важно)
Информация НЕ табличной формы. Имеют Div контейнеры (я не вижу в коде ту информацию которая отображается на страцце сайта).

 
Вычислить ставки по которым отпускается товар
 
Народ, всю голову сломал. Задача наверное больше математическая.
Есть файл в нем перечислен отпущенный товар со своей конечной ценой. Все товары можно условно разделить на чеки. Тоесть в одном чеке три товара, в другом чеке 5 товаров и так далее. В отношении каждого товара применяется одна из двух налоговых ставок - 10 или 20 %.
В этой таблице еще есть две колонки: НДС 10% и НДС 20%. НО! (тут мне сложно объяснить) Ставка (или ставкИ) посчитана в отношении всего чека, и эта ставка указывается напротив каждого товара. А мне нужно знать какая ставка была применена в отношении каждого товара а не всего чека в целом.
В примере все понятно.
Я даже не могу прикинуть решение этой задачи... может какой-то перебор существует?  
VBA. Убрать запрос о сохранения информации в буфере
 
Добрый день форумчане. Есть макрос, довольно известный по сбору таблиц из разных книг/листов от
Код
Sub Consolidated_Range_of_Books_and_Sheets()
    Dim iBeginRange As Range, rCopy As Range, lCalc As Long, lCol As Long
    Dim oAwb As String, sCopyAddress As String, sSheetName As String
    Dim lLastrow As Long, lLastRowMyBook As Long, li As Long, iLastColumn As Integer
    Dim wsSh As Worksheet, wsDataSheet As Worksheet, bPolyBooks As Boolean, avFiles
    Dim wbAct As Workbook
    Dim bPasteValues As Boolean, IsPasteSheetName As Boolean
 
    On Error Resume Next
    'Выбираем диапазон выборки с книг
    Set iBeginRange = Application.InputBox("Выберите диапазон сбора данных." & vbCrLf & _
                                           "1. При выборе только одной ячейки данные будут собраны со всех листов начиная с этой ячейки. " & _
                                           vbCrLf & "2. При выделении нескольких ячеек данные будут собраны только с указанного диапазона всех листов.", Type:=8)
    'для указания диапазона без диалогового окна:
    'Set iBeginRange = Range("A1:A10") 'диапазон указывается нужный
    'Если диапазон не выбран - завершаем процедуру
    If iBeginRange Is Nothing Then
        Exit Sub
    End If
    'Указываем имя листа
    'Допустимо указывать в имени листа символы подставки ? и *.
    'Если указать только * то данные будут собираться со всех листов
    sSheetName = InputBox("Введите имя листа, с которого собирать данные(если не указан, то данные собираются со всех листов)", "Параметр")
    'Если имя листа не указано - данные будут собраны со вех листов
    If sSheetName = "" Then
        sSheetName = "*"
    End If
    'добавлять ли имя листа в начало таблицы
    IsPasteSheetName = (MsgBox("Вставлять имя листа первым столбцом?", vbQuestion + vbYesNo, "www.wxcel-vba.ru") = vbYes)
    On Error GoTo 0
    'Запрос - вставлять на результирующий лист все данные
    'или только значения ячеек (без формул и форматов)
    bPasteValues = (MsgBox("Вставлять только значения?", vbQuestion + vbYesNo, "www.wxcel-vba.ru") = vbYes)
    'Запрос сбора данных с книг(если Нет - то сбор идет с активной книги)
    If MsgBox("Собрать данные с нескольких книг?", vbInformation + vbYesNo, "www.wxcel-vba.ru") = vbYes Then
        avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True)
        If VarType(avFiles) = vbBoolean Then Exit Sub
        bPolyBooks = True
        lCol = 1
    Else
        avFiles = Array(ThisWorkbook.FullName)
    End If
    If IsPasteSheetName Then
        lCol = lCol + 1
    End If
    'отключаем обновление экрана, автопересчет формул и отслеживание событий
    'для скорости выполнения кода и для избежания ошибок, если в книгах есть иные коды
    With Application
        lCalc = .Calculation
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlManual
    End With
    'создаем новый лист в книге для сбора
    Set wsDataSheet = ActiveWorkbook.Sheets.Add(After:=Sheets(Sheets.Count))
    'если нужно сделать сбор данных на новый лист книги с кодом
    'Set wsDataSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    'цикл по книгам
    For li = LBound(avFiles) To UBound(avFiles)
        If bPolyBooks Then
            Set wbAct = Workbooks.Open(Filename:=avFiles(li))
        Else
            Set wbAct = ThisWorkbook
        End If
        oAwb = wbAct.Name
        'цикл по листам
        For Each wsSh In wbAct.Sheets
            If wsSh.Name Like sSheetName Then
                'Если имя листа совпадает с именем листа, в который собираем данные
                'и сбор идет только с активной книги - то переходим к следующему листу
                If wsSh.Name = wsDataSheet.Name And bPolyBooks = False Then GoTo NEXT_
                With wsSh
                    Select Case iBeginRange.Count
                    Case 1 'собираем данные начиная с указанной ячейки и до конца данных
                        lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).Row
                        iLastColumn = .Cells.SpecialCells(xlLastCell).Column
                        sCopyAddress = .Range(.Cells(iBeginRange.Row, iBeginRange.Column), .Cells(lLastrow, iLastColumn)).Address
                    Case Else 'собираем данные с фиксированного диапазона
                        sCopyAddress = iBeginRange.Address
                    End Select
                    lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).Row + 1
                    'определяем для копирования диапазон только заполненных данных на листе
                    Set rCopy = Intersect(.Range(sCopyAddress).Parent.UsedRange, .Range(sCopyAddress))
                    'вставляем имя книги, с которой собраны данные
                    If lCol > 0 Then
                        If bPolyBooks Then
                            wsDataSheet.Cells(lLastRowMyBook, 1).Resize(rCopy.Rows.Count).Value = oAwb
                        End If
                        If IsPasteSheetName Then
                            wsDataSheet.Cells(lLastRowMyBook, lCol).Resize(rCopy.Rows.Count).Value = .Name
                        End If
                    End If
                    'если вставляем только значения
                    If bPasteValues Then
                        rCopy.Copy
                        wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol).PasteSpecial xlPasteValues
                        wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol).PasteSpecial xlPasteFormats
                    Else 'если вставляем все данные ячеек(формулы, форматы и т.д.)
                        rCopy.Copy wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol)
                    End If
                End With
            End If
NEXT_:
        Next wsSh
        If bPolyBooks Then
            wbAct.Close False
        End If
    Next li
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = lCalc
    End With
End Sub
я на скорую руку поудалял лишние строки кода, в части опроса пользователя (из 4 опросов оставил только первый про диапазоны). Проблема в следующем, когда макрос работал еще без изменений, то при сборе из разных книг, если ему говориш что копировать ТОЛЬКО ЗНАЧЕНИЕ, то экесель закалебывал спрашивать про буфер, а если НЕ соглашаться с копированием только значения, эксель не спрашивает.
Вот я поудалял лишние строки и теперь не могу ни как избавится от этого запроса экселя.
Вот что у меня получилось (вставил только первую часть кода):
Код
Sub Consolidated_Range_of_Books_and_Sheets()
    Dim iBeginRange As Range, rCopy As Range, lCalc As Long, lCol As Long
    Dim oAwb As String, sCopyAddress As String, sSheetName As String
    Dim lLastrow As Long, lLastRowMyBook As Long, li As Long, iLastColumn As Integer
    Dim wsSh As Worksheet, wsDataSheet As Worksheet, bPolyBooks As Boolean, avFiles
    Dim wbAct As Workbook
    Dim bPasteValues As Boolean, IsPasteSheetName As Boolean
 
    On Error Resume Next
    'Выбираем диапазон выборки с книг
    Set iBeginRange = Application.InputBox("Выберите диапазон сбора данных." & vbCrLf & _
                                           "Указатьт ячейку на листе, с какого места начинать сбор ", Type:=8)
    'для указания диапазона без диалогового окна:
    'Set iBeginRange = Range("A1:A10") 'диапазон указывается нужный
    'Если диапазон не выбран - завершаем процедуру
    If iBeginRange Is Nothing Then
        Exit Sub
    End If
    
    
        sSheetName = "*"
  
    'добавлять ли имя листа в начало таблицы
    IsPasteSheetName = vbNo
    On Error GoTo 0
    'Запрос - вставлять на результирующий лист все данные
    'или только значения ячеек (без формул и форматов)
    bPasteValues = vbNo
    'Запрос сбора данных с книг(если Нет - то сбор идет с активной книги)
    
        avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True)
        
        bPolyBooks = True
        lCol = 1
    
    If IsPasteSheetName Then
        lCol = lCol + 1
    End If
проблема с формой в макросе
 
Народ, есть макрос, очень большой, 20 форм, 10 модулей, разобраться в нем очень сложно. Один блок сбоит, пока что я только понял, что баг уходит если таблицу - источник уменьшить в размере (количество строк). Ругается я так понимаю на диалоговую форму.
Ругается на эту строчку -  Call UserForm10.DrawShema
Забыл добавить, что этот блок находится на Листе, а не в модуле если это важно.
Код
Private Sub Worksheet_Activate()
     Load UserForm10
     UserForm10.Show
     If ThisWorkbook.Sheets("Схема").Cells(2, 37) <> 0 And
ThisWorkbook.Sheets("Схема").Cells(3, 37) <> 0 Then
         UserForm10.Left = ThisWorkbook.Sheets("Схема").Cells(2, 37)
         UserForm10.Top = ThisWorkbook.Sheets("Схема").Cells(3, 37)
     Else
         UserForm10.Left = 900
         UserForm10.Top = 100
     End If
     If ThisWorkbook.Sheets("Схема").Cells(4, 37) = 1 Then
         ThisWorkbook.Sheets("Схема").Cells(4, 37) = 0
         Call UserForm10.DrawShema
     End If
End Sub

Private Sub Worksheet_Deactivate()
'   ThisWorkbook.Sheets("Схема").Cells(2, 37) = UserForm10.Left
'   ThisWorkbook.Sheets("Схема").Cells(3, 37) = UserForm10.Top
     UserForm10.Hide
     Unload UserForm10
End Sub
Изменено: Сергей020487 - 11.04.2023 05:29:07
Ограниченное автозаполнение ячеек
 
Добрый день. Столкнулся с проблемой. Есть таблица, почти все ячейки объеденены. Проблемы бы не было если все ячейки были заполнены. Мне нужно Убрать объединение, после чего значение остается в самой первой строчке, это значение нужно размножить на те ячейки которые были объеденены до этого. В примере все понятно.
В тех столбцах где все объедененные ячейки заполнены все просто, убираем объеденение - выделяем - Ф5-выделить....итд. Но этот способ автоматически заполняет и те поля до разобъединения которых значения и небыло.
Есть один момент к которому можно прицепится, Объеденены всегда 8 ячеек!  
VBA. Обмен иформацией через FTP сервер.
 
Ребят проконсультируйте. Стоит задача, обращение одной книги к другой с целью получения информации если условие выполняется. Все было бы просто если на фтп можно было выкладывать файлы. Но политикой моей организации стоит запрет на хранении файлов с конфидициальной информацией. Скажите, возможно ли наладить связи между книгами через ftp сервер, не прибегая к выкладыванию файлов?
Перенос значения по критерию (дата).
 
Доброго дня. Не могу придумать способ. В примере 2 таблицы. Общим критерием является дата. Переносимым значением является сумма. В примере все понятно.
Дополню, то, что например строк с числом 30.12.2019 неизвестно где  будет больше, в правой или в левой таблице. Я только придумал, чтоб не гадать сколько нужно каждого числа, для того чтоб точно места всем значениям хватило - скопировать у двух таблиц даты и вставить друг за другом - отсортировать. Но как потом перенести каждое значение ТОЛЬКО ОДИН РАЗ не могу понять, впр тупо переносит первое значение. Суммировать мне не нужно. нужен только перенос.
ПС суммы могут быть полностью одинаковы, это не задвоиность, значит и перенести нужно два раза.
Изменено: Сергей020487 - 02.03.2023 06:34:43
VBA. Теоретический вопрос по разделителю в коде
 
Доброго дня. Помогите разобраться с точкой в коде VBA. Читаю паралельно пару учебников, что в одном, что в другом этот момент почему то пропущен.
Я понимаю что точка в коде это разделитель например между объектом, свойством, методом итд. Например:
Код
With Application.FileDialog(msoFileDialogFolderPicker)
Но мне не ясно когда строка начинается с точки:
Код
With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
Пока писал данный вопрос нашел вот это "Чтобы установить значение свойства, введите после ссылки на объект точку, имя свойства, знак равенства (=) и новое значение свойства" Правильно ли говорить, что перед наименованием свойства ВСЕГДА ставится точка?
И что в данном случае она устанавливает? связб между свойством и последним указанным объектом?
PQ: левое соединение
 
Народ не могу понять. При соединении двух списков полным левы соединением, в левом списке появляются дубли тех строк, дубли которых есть в правом. Причем если в правом дублируется три раза, то в левом тоже задублируются три раза. Как соединить так, чтоб левый список не соединялся, а из правого бралось первое найденное значение. как обычный впр.
VBA. Оператор сравнения IF и дата
 
Всем привет.
Подскажите пожалуйста как правильно написать условие. Изначально оно было таким:
Код
 For n = 1 To UBound(Библиотека)
            For x = 1 To UBound(OpenFile)
                If OpenFile(x, 1) Like Библиотека(n, 1) & "*" Then
                    wb.ActiveSheet.Cells(x + 3, lLastColOpen + 1) = Библиотека(n, 2)
                End If
            Next x
        Next n
Но приспичило добавить условие:

Код
If OpenFile(x, 1) Like Библиотека(n, 1) & "*" And OpenFile(x, 15) > "01.01.2019" Then

то вставляем

Код
wb.ActiveSheet.Cells(x + 3, lLastColOpen + 1) = Библиотека(n, 2)

если
Код
If OpenFile(x, 1) Like Библиотека(n, 1) & "*" And OpenFile(x, 15) < "01.01.2019" Then

то вставляем это

Код
wb.ActiveSheet.Cells(x + 3, lLastColOpen + 1) = Библиотека(n, 3)

Как правильно это собрать. Я во первых не могу понять как правильно в коде отразить дату, ну и с логическими конструкциями у меня проблемки.

неявный ВПР в другие книги (VBA)
 
Привет форумчанам. Помогите пожалуйста.
Стоит задача перенести из файла "Библиотека" значения расположенные во 2 столбце, по критерию наименования - 1 столбец в другие книги.
Значение необходимо перенести в последний свободный столбец. Структура у файлов куда переношу строго одинаковая, таким образом первый свободный столбец всегда - "Т".
Файлов много, поэтому нужно указывать экселю коллекцию файлов через запросник.
И  самое сложное по мне. В файле "библиотека" по сути перечень строк из массы всех тех-же множества файлов (куда я переношу) обрезанных по наименованию до первого символа 0...9,(,№,/,[, итд. и с удаленными дублями. Короче просто сформировал реестр. Получается что в книге "бибилотека" критерий всегда короче чем в остальных файлак, Но его начало совпадает, правда может совпадать только первое слово, может первых два слова, может 3, 4... Тоесть перенос по сути нужен или неявный как PQ или чтоб VBA резал в файах критерий до первого вышеуказанного знака.
В примере все видно.
PQ: Удаление части текста по критерию
 
Доброго дня. Задача:
Есть очень много файлов с наименованием товара. Мне нужно по максимуму удалить все дубликаты. Дело в том, что после наименования товара идет его граммовка/милилитраж/количество в упаковке/итд. Но товар один и тот же. В примере все видно.
В экселе я бы искал и заменял на пустое, например: " *МЛ.*" или *МГ.*". Но так как файлов много, я создаю запросы в PQ и удаляю там дубликаты, но чтоб удалить дубликат например НУРОФЕН 20МГ. и НУРОФЕН 50МГ. мне нужно сначала причесать эти таблица.
Как в PQ прописать: найти " *МЛ." и удалить все что после?

ПС. Конечно это не приведет меня к требуемому результату, так как например есть НУРОФЕН ФОРТЕ 50 МГ и НУРОФЕН ЛАЙТ 70МГ, и удаление грамовки все равно не поможет оставить только лишь НУРОФЕН, но как могу пытаюсь облегчить работу. Если есть предложения как по максимуму сократить перечень, с удовольствием выслушаю.
логическое выражение ЕСЛИ и ЕОШ
 
Ребят, не могу додуматься сам. Есть логическое выражение:
=ЕСЛИ(ИЛИ(И(ЗНАЧЕН(ЛЕВСИМВ(A1;2))=55;ИЛИ(A1=5501;A1=5502));И(ЗНАЧЕН(ЛЕВСИМВ(A1;2))<>55;ДЛСТР(A1)=4));1;0)
она нормально работает если в ячейке цифры. Но если туда затисался текст, то логика уходит в #ЗНАЧ. А меня устраивает ответ только в виде 1 и 0.
Не могу придумать как прикрутить суда ЕОШ (не(еош)).
Моя логика работает на истина это 1, лож это 0.
А логика ЕОШ обратная моей.
В правиле рвется диапазон при вставки строки
 
Добрый день. Проблема такая: в файле установлено правило (их 3, но они одинаковые, диапазоны разные), оно красит ячейку в указанном диапазоне при выполнении условия. Но вот когда я вставляю строку со значениями, в том числе и в этот диапазон, то правило рвет этот диапазон на два диапазона. В примере я вставил строчку и диапазон разорвался. Помогите решить.
Изменено: Сергей020487 - 26.10.2022 07:08:50
Разделение текста по двум столбцам
 
Добрый день. Помогите разделить информацию по двум ячейкам. В первой должность, во второй ФИО. Сейчас все в одной ячейке.
проверка ячейки на правильное отражение даты
 
Товарищи, не могу нечего придумать как проверить дата ли в ячейке. Дело в том, что после работы макроса (если нажать разбор в приложенном файле) в трех столбцах:Q, AI, AK формируется дата, однако формат ячейки остается "Общий". Только после вставки в ячейку курсора она автоматически переводится в формат "Дата". В связи с этим не как не могу подобрать способ как проверить дата ли в ячейке. Мне в принципе без разницы в каком формате останется ячейка, главное, чтоб в указанных столбцах действительно стояла дата в формате дд.мм.гггг
Быстрое протягивание множества столбцов одной кнопкой
 
Добрый день, помогите написать макрос который бы протягивал всю таблицу в выбранном диапазоне (и вывести кнопку) или подскажите способ разом их протягивать.
в приложенном мной файле есть две шапки таблицы, правую шапку я выделил зеленым, вот ее хотелось бы протягивать кнопкой. Данная таблица будет скрыта с формулами будет скрыта на защищенном листе и руками протягивать не выйдет.
Форматнологический контроль 2
 
Два столбца, первый столбец означает код региона, второй столбец означает район региона.
Все регионы кроме 55 мне не интересны, но в этих ячейках должны быть только цифры и в первом столбце 2 цифры, а во тором 4. Ни каких букв и пробелов.
То есть:
Если в первом столбце НЕ 55, то во втором столбце 4 любые цифры. Ни каких букв и пробелов.
Если в первом столбце 55, то во втором столбце может быть только 5501 или 5502 или 5503. Также ни каких букв и пробелов.
Страницы: 1 2 След.
Наверх