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

Страницы: 1 2 След.
VBA - копирование и вставка видимых столбцов и строк
 
Спасибо.
Изменено: aie_project - 01.03.2025 11:07:53
VBA - копирование и вставка видимых столбцов и строк
 
MikeVol,
Run-time error '1004'
Приложению microsoft excel не удается вставить данные.
VBA - копирование и вставка видимых столбцов и строк
 
Всем привет.
Подскажите пожалуйста.
Код
objXls5.Sheets("Реестр").Range("A6:BE" & llastr).SpecialCells(12).Copy
objXls6.Sheets("Форма").Paste objXls6.Sheets("Форма").Range("B5")
Копирую только видимые ячейки и вставляю.
В указанном диапазоне есть скрытые строки и столбцы.
Но при вставке скрытые строки не вставляются, а вот скрытые столбцы вставляются.
Как этого избежать?
VBA - сравнение двух столбцов на уникальность ячеек
 
6 секунд формировался массив 8-0

Всем спасибо, буду дальше возиться )
VBA - сравнение двух столбцов на уникальность ячеек
 
Hugo, спасибо, добрый и внимательный человек )
VBA - сравнение двух столбцов на уникальность ячеек
 
Дмитрий(The_Prist) Щербаков, с одной ошибки перешли на другую )

object required на
Код
If arr(счетчик, сводная_материал).Value = "Материал" Then
VBA - сравнение двух столбцов на уникальность ячеек
 
МатросНаЗебре, спасибо за отзывчивость.
Поплыл на:
Код
arr = objXls_Сводная.Sheets(лист_Сводная).Cells(1, 1).Resize(objXls_Сводная.UsedRange.Row + objXls_Сводная.UsedRange.Rows.Count - 1, objXls_Сводная.UsedRange.Column + objXls_Сводная.UsedRange.Columns.Count - 1).Value
run time error 438
object doesn't support this property or method

Полагаю возможно потому что макросы пишу в Outlook.
Цитата
написал:
Вы каждое значение из одного массива ищете по всему второму массиву?
Видимо к сожалению, да. Про словари учту. Если сейчас не оптимизируется нормально, то буду переделывать на словари и разбираться с ними.

Msi2102, пока что pq отложил бы на второй план. Я правильно понимаю, что с помощью него не смогу в имеющийся таблице изменять имеющиеся значения, своего рода ВПР по всем позициям? Просто мельком почитал до этого, сложилось мнение, что происходит формирование именно новой таблицы после запроса, что мне не подходит.
VBA - сравнение двух столбцов на уникальность ячеек
 
Aлeкceй,
Код
i = 1
    тест_тайм = Time
    Dim массив_Сводная() As String
    ReDim массив_Сводная(1 To 18, 1 To i)
    For счетчик = начало_сводной To конец_сводной
        If objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_материал).Value = "Материал" Then
            массив_Сводная(1, i) = счетчик
            массив_Сводная(2, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_пид).Value
            массив_Сводная(3, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_номер_накладной).Value
            массив_Сводная(4, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_раздел).Value
            массив_Сводная(5, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_тэг).Value
            массив_Сводная(6, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_айдэнт).Value
            массив_Сводная(7, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_код_титула).Value
            массив_Сводная(8, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_наименование_объекта).Value
            массив_Сводная(9, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_шифр_рд).Value
            массив_Сводная(10, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_кратк_номенкл).Value
            массив_Сводная(11, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_проектн_наимен_мтр).Value
            массив_Сводная(12, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_гост_ту).Value
            массив_Сводная(13, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_ед_изм).Value
            массив_Сводная(14, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_количество).Value
            массив_Сводная(15, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_примеч).Value
            массив_Сводная(16, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_инф_по_сводн).Value
            массив_Сводная(17, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_отв).Value
            массив_Сводная(18, i) = objXls_Сводная.Sheets(лист_Сводная).Cells(счетчик, сводная_группа).Value
            i = i + 1
            ReDim Preserve массив_Сводная(1 To 18, 1 To i)
        End If
    Next счетчик
    тест_тайм2 = Time
    MsgBox Format(тест_тайм2 - тест_тайм, "hh:mm:ss")
В данном экселе 52358 строк, из них 36205 строк подошли условию "Материал".
Итого затрачено времени на формирование массива 24 мин. 45 сек.
VBA - сравнение двух столбцов на уникальность ячеек
 
Aлeкceй, я бы с радостью дал примеры, но файлы рабочие, и боюсь, содержат ту информацию, которую не желательно распространять, поэтому только так могу описывать всё.
Сейчас сделал заполнение массива по всем столбцам одного файла, вот в процессе вишу.
Как закончу пришлю код и результат по времени.
Изменено: aie_project - 09.01.2025 17:07:48
VBA - сравнение двух столбцов на уникальность ячеек
 
Всем доброго дня.
Я в продолжении темы снова за советом.
Когда столкнулся с длительным временем на выполнение кода, решил разделить поэтапно.
2 эксель файла. В каждом много столбцов и очень много строк.
Оказалось, что задача не только в добавлении новых позиций, которые появились в первом файле и должны появиться после работы макроса во втором, что я сделал по вашим советам, только без словаря, а через массивы. Оказалось нужно отслеживать изменения по всему первому файлу и вносить изменения во второй файл.
Уже начал читать, в сторону power query, но так как важно не только спарсить информацию с одного файла в другой, а еще и оставить старую не совпадающую с первым файлом, вернулся к макросам.
Изначально я создал массив второго экселя с уник. номерами, массив первого экслея содержал также уник. номера и номера строк в экселе тех позиций, которые новые. И добавлялись новые строки во второй эксель. Важно, что столбцов 17 штук, которые нужно переносить, из этих соображений в массивы их не добавлял, а потом по известным номерам строк присваивал эксель к экселю, так как даже 1 и 2 столбца занимали время:
00:02:48 - затраченное время на создание массива 1.
00:01:24 - затраченное время на создание массива 2.
Сравнение каждого уник. номера одного массива с другим и добавление новых строк (примерно по тестам делал штук 30) занимало примерно 1-1,5 минуты.
Это всё меня устраивало.
Но когда выяснилось, что нужно сравнивать все 17 столбцов по всем позициям, начал думать.
1 вариант у меня был, также искать совпадения с массивов по уник. номерам и равнять по всем 17 столбцам все значения, всё равно перенос данных, зачем сверять, подумал я. Взял в тест 700 строк, на поиск и обновление заняло 4 минуты, а строк у меня только в одном примере в 51 раз больше, то есть почти 3,5 часа займет.
2 вариант поиск также по уник. номерам, а дальше просмотр есть ли изменения в нужных мне столбцах по строкам и если есть изменения, то напрямую равняю эксель к экселю по этой строке по столбцам. Тот же тест - расчетное время примерно 2 часа. Уже лучше, но всё равно, долго.
3 вариант, который еще не протестировал, это в оба массива добавить все строки по всем 17 столбцам (от чего отказался я поначалу).
Как считаете 3 вариант наилучший или можно еще что-то придумать?
Просто даже заполнять два массива по 17 столбцов в каждом (а некоторые из них имеют достаточно длинные текстовки) и строк по тысяч 40, это думаю сильно мне увеличит время формирования массивов, хоть возможно и ускорит мне сравнение и потом уже точечное внесение изменений в эксель.
Изменено: aie_project - 09.01.2025 16:23:30
VBA - сравнение двух столбцов на уникальность ячеек
 
Отлично, спасибо за идею. Попробую.
VBA - сравнение двух столбцов на уникальность ячеек
 
Доброго дня, прошу дать совет.
Есть эксель файлы с большими количествами информации.
В каждом из них есть столбец с уникальным номером позиции.
В одном сводном экселе под 100 тысяч строк, в других количество строк тоже исчисляется тысячами и таких экслей 12 штук .
Задача состоит в том, чтобы проверять по 12 экселям добавление новых уникальных номеров и добавлять в сводный эксель.
На текущий момент нашел выход только прогонять циклом каждую уникальную позицию из 12 экселей методом .Find в сводном экселе и если данной позиции в сводном нет, то добавить ее.
Это прям достаточно долгий процесс, хоть и рабочий. Может кто подскажет, как можно реализовать это быстрее?
VBA. Обойти ограничение на длину пути к файлу в 255 символов
 
Пока что по получившейся длине я укладываюсь в рамки.
Выявился небольшой нюанс, что после перезагрузки виртуальный диск пропадает, можно в ручную каждый день создавать, но захотелось программно.
Может кому будет полезно. Сделал вот так:
Код
команда = "SUBST X: ""\\lan\Архив новый\"""

Shell "C:\Windows\System32\cmd.exe /c " & команда
VBA. Обойти ограничение на длину пути к файлу в 255 символов
 
Спасибо всем за ответы.
AlexDen, отдельное большое спасибо, это решило мою проблему. Теперь в реестре появляются те позиции с длинным путем к файлу.
БМВ, попробовал в начале SUBST на локальный путь - сформировался по виду прям, как отдельный диск в "Этот компьютер", удалил его, создал на сетевое расположение, тоже сработало, хоть и выглядит не много по другому - раздел не "Устройства и диски", а "Сетевые расположения", и назвался "Отключенное сетевое устройство", но по факту по клику проходит в то место, куда я указал, и по коду тоже отрабатывает нормально, переименовал, как мне надо и красота.
VBA. Обойти ограничение на длину пути к файлу в 255 символов
 
Цитата
написал:
SUBST
Про это почитаю.
Про архиватор из-за того, что сеть и большие объемы файлов могут быть, проблематично может быть.
VBA. Обойти ограничение на длину пути к файлу в 255 символов
 
БМВ, создание сетевого диска было бы идеальным решением, после совета выше всё перерыл, но администраторами сети ограничен данный функционал.

С robocopy раньше не сталкивался, сейчас почитал, что это особый вид копирования файлов.

У меня просто в данной структуре примерно 3 тысячи файлов, а многие весят и больше 50 Мб (пдф).

В текущем исполнении, находя их, вся нужная информация о них мне доступна с названия файла, части пути к нему и времени их размещения.

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

Читал, что ограничение в 255/260 символов строки можно обойти, как-то их объединяя. В другом макросе формирую список получателей письма, там очень много, что VBA в определенный момент не дает присвоить больше получателей, так я там делаю следующим способом:
Код
копия = "много получателей";
копия = копия + "еще кучка получателей";
Item.CC = копия
И так вроде бы нормально работает, но тут строку формирую я сам, а в моем примере по данной статье, древо папок формируется циклом, и я подумал, может как-то можно тут применить подобный подход.
VBA. Обойти ограничение на длину пути к файлу в 255 символов
 
Цитата
написал:
запрещено политикой мапирование?
БМВ, права администратора требуются, которых нет.
VBA. Обойти ограничение на длину пути к файлу в 255 символов
 
Sanja, ну да, и правда, танцы... :)
VBA. Обойти ограничение на длину пути к файлу в 255 символов
 
irabel, на рабочем ПК, к сожалению, не могу создавать сетевые диски, тоже читал об этом способе.

Может еще идеи есть?
VBA. Обойти ограничение на длину пути к файлу в 255 символов
 
Всем привет.
Прошу подсказать.
Формирую реестр информации в эксель на основе файлов на сетевом ресурсе.
Вроде бы всё не плохо - перебирает макрос папки, находит нужные файлы и добавляет информацию о них в реестр, кроме момента, что до файлов, которые имеют адрес длиной выше 255 символов, как случайно заметил, добраться не могу, то есть информации нет в реестре. Потом уже понял в чём дело.
Архив на сетевом ресурсе, перемещать, переименовывать ни папки, ни файлы не могу.
Как можно решить проблемку?
Код:
Код
Sub Реестр()
    SourceFolder = "\\lan\Архив\"
    Set fso = CreateObject("scripting.filesystemobject")
    Set curfold = fso.GetFolder(SourceFolder)
    
    If Not curfold Is Nothing Then
        For Each sfol_1 In curfold.SubFolders
            If sfol_1.Name Like "*Линия*" Then
                For Each sfol_2 In sfol_1.SubFolders
                    If sfol_2.Name Like "L*" Then
                        For Each sfol_3 In sfol_2.SubFolders
                             If sfol_3.Name Like "*-D-*" Then
                                 For Each sfol_4 In sfol_3.SubFolders
                                     If sfol_4.Name Like "*утвержден*" Then
                                         For Each fil In sfol_4.Files
                                            If fil.Name Like "*-D-*" Then
                                                
                                                'добавление информации в реестр на основе найденного файла
                                                
                                             End If
                                         Next
                                     End If
                                 Next
                             End If
                        Next
                    End If
                Next
            End If
        Next
    End If
    Set fil = Nothing: Set curfold = Nothing: Set fso = Nothing

End Sub
Изменено: Sanja - 03.12.2024 16:01:19 (Исправил название Темы. Учтите на будущее)
[ Закрыто] Условное форматирование
 
Всем привет.
Подскажите пожалуйста.
Делаю условное форматирование по формуле, к одной строке хорошо применяется (на скриншоте).
А если мне так к ста строкам нужно сделать, мне не сто правил ведь нужно создавать?
Можно ли как-то сделать проверку построчно одним правилом?
Вставка из буфера обмена
 
Игорь, к сожалению, ругается.

Было:
Код
objXls5.Sheets("Реестр").Range("A6:D" & llastr).SpecialCells(12).Copy
Sleep (400)
objXls6.Sheets("Форма").Paste objXls6.Sheets("Форма").Range("B" & llastr2)
Стало:
Код
objXls5.Sheets("Реестр").Range("A6:D" & llastr).SpecialCells(12).Copy objXls6.Sheets("Форма").Range("B" & llastr2)
Ошибка:
Runtime error 1004 - Метод Copy из класса Range завершен неверно
Изменено: aie_project - 28.05.2024 11:17:22
Вставка из буфера обмена
 
Всем привет.
Подскажите пожалуйста.
Я копирую значения с одного экселя следующим образом:
Код
objXls5.Sheets("Реестр").Range("W6:X" & llastr).SpecialCells(12).Copy
и вставляю в другой эксель следующим образом:
Код
objXls6.Sheets("Форма").Paste objXls6.Sheets("Форма").Range("H" & llastr2)
В общем смысле это работает, но так как у меня копируемые диапазоны находятся в разных местах Реестра, приходится последовательно их частями копировать и вставлять в Форму.
Раньше всё работало отлично, большой объем отрабатывал нормально, но не давно на рабочем ПК переустановили винду с 10ки на 11ю, офис остался также 2019, но начались проблемы. Иногда макрос может отработать хорошо полностью, а иногда выдает ошибку на методе вставки - Run-time error '1004': Метод Paste  из класса Worksheet завершен неверно.
А так как их много в коде, оно происходит не в одном и том же месте, а рандомно в разные случае запуска макроса.
Раньше когда на 10ке всё было хорошо, на всякий случай чтобы успел отрабатывать буфер обмена использовал своеобразный sleep:
Код
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

Sleep (400)
Так как иногда выдавал ошибки эксель, что у него не получалось как-то вставить информацию из буфера обмена.
Сейчас поставил слип на 1000, в надежде что в этом дело, но всё тщетно.
Как думаете, что может быть и как решить проблему?
Номера строк после фильтра
 
МатросНаЗебре, Jack Famous, спасибо большое, за пример кода и за разъяснения.
Номера строк после фильтра
 
Всем привет.
Подскажите пожалуйста.
Я определяю номер последней не пустой строки в excel следующим образом:
Код
llastr = objXls.Sheets("Реестр").Cells(objXls.Sheets("Реестр").Rows.Count, 1).End(-4162).Row
Мне необходимо поставить фильтр и пробежаться по всем найденным строкам.
llastr равен, к примеру, 585, а перед ним после фильтра строка, к примеру, 535.
Как можно определить номера строк только найденных после фильтра, чтобы в цикле по ним пройтись и по взаимодействовать.
Изменено: aie_project - 24.05.2024 12:15:45
Работа с Excel из Outlook
 
Дмитрий(The_Prist) Щербаков, Вы и .Activate спасли ситуацию ) спасибо )
Работа с Excel из Outlook
 
Тут скорее из рабочего процесса нужно понимание в какую ячейку ставить.
То есть есть 6 ячеек, запуская один из макросов, он определяет какая крайняя и записывает в следующую, просто нужно взглянуть и понять в правильную ли по текущей ситуации внесена запись, а не сделал ли кто-то ещё это уже.
Работа с Excel из Outlook
 
Цитата
написал:
P.S. А зачем Вам вообще нужна активации ячейки?
Визуально, глазами проверить в нужное ли место прописана дата, так как от предыдущих записанных ячеек делается выбор куда сделать запись. К примеру, уже по данному письму была сделана отметка и сейчас излишне был запущен макрос.
Работа с Excel из Outlook
 
Дмитрий(The_Prist) Щербаков, можете подсказать?
Запускаю документ вот так:
Код
    'запуск Excel
    On Error Resume Next
    Set objXls3 = GetObject(, "Excel.Application")
    If objXls3 Is Nothing Then Set objXls3 = CreateObject("Excel.Application")
    Set objXls2 = objXls3.Workbooks(имя_реестра)
    If objXls2 Is Nothing Then Set objXls2 = objXls3.Workbooks.Open(адрес_реестра)
    objXls2.Applicatio
Вот так работает:
Код
objXls2.Sheets("Реестр").Cells(llastr, 51).Select
Но если до этого не был запущен документ, или же запущен и только он, или же запущены два реестра (макрос работает с несколькими), но когда запущены оба уже, обращаюсь только к последнему, но когда уже открыты оба и обращаюсь к первому, выдает ошибку "runtime error 1004: метод select из класса range завершен неверно", при этом до этого Select стоит команда и она успевает выполниться:
Код
objXls2.Sheets("Реестр").Cells(llastr, 51).Value = дата_получения_письма
Изменено: aie_project - 11.03.2024 08:30:18
VBA применить представление в excel
 
БМВ, спасибо.
Страницы: 1 2 След.
Наверх