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

Страницы: 1 2 3 След.
Ответить на диалоговое окно при сохранении книги Excel., Можно ли ответить Да или Нет на системное сообщение при сохранение книги Excel?
 
Здравствуйте, уважаемые эксперты.
При сохранении или при закрытии книги Excel часто возникают различные сообщения, типа: "Книга содержит персональные данные ...". Могут быть и другие сообщения.
Обычно в таких случаях рекомендуют использовать Application.DisplayAlerts = False перед сохранением и Application.DisplayAlerts = True после.
А можно ли обработать данное событие, не отключая предупреждения? Можно ли, просто, ответить "Да" или "Нет"?
vba автофильтр, Как с помощью VBA в автофильтре "поставить несколько галочек" (выбрать несколько позиций)?
 
Большое спасибо. Всё работает.
vba автофильтр, Как с помощью VBA в автофильтре "поставить несколько галочек" (выбрать несколько позиций)?
 
Здравствуйте. Помогите, пожалуйста, решить проблему.
Есть диапазон Range(Cells(1,1),Cells(10,10))  на листе Excel (обычный диапазон) с заголовками. В столбце Cells(1,1) перечень продуктов: Молоко, Кефир, Колбаса. Нужно с помощью автофильтра отобразить только Молоко и Колбасу. Важно, чтобы Молоко и Колбаса задавались переменными.
Чего-то не получается совсем.
Заранее большое спасибо за помощь.
Код
Dim a as String, b as String
Dim arrArray() as Variant

a = "Молоко"
b = "Колбаса"
Redim arrArray(0 to 1)
arrArray(0) = a
arrArray(1) = b

Range(Cells(1,1),Cells(10,10).AutoFilter Field:=1, Criteria1:= arrArray
'При этом отображается только 1 элемент массива - Молоко, а колбаса не отображается. Возможно, я какой-то параметр не указываю.
VBA. Аналог формулы ВПР(Excel) для работы с большими массивами., Способы реализации сопоставления данных в 2-х массивах с большим количеством "строк" (данных в 1-ой размерности).
 
Связал диапазоны. Получил номер позиции. Загрузил данные в массив. Так всё работает. Всем большое спасибо за помощь.
VBA. Аналог формулы ВПР(Excel) для работы с большими массивами., Способы реализации сопоставления данных в 2-х массивах с большим количеством "строк" (данных в 1-ой размерности).
 
Цитата
написал:
А где изначально находятся эти таблицы, если они насчитывают 2 млн. строк? Не на листе же Excel.
Данные из ряда листов Excel консолидируются в массив (Array). Далее обрабатываются.
Как я понимаю, мне надо изучать Python и базы данных для обработки таких массивов. )))
VBA. Аналог формулы ВПР(Excel) для работы с большими массивами., Способы реализации сопоставления данных в 2-х массивах с большим количеством "строк" (данных в 1-ой размерности).
 
Цитата
написал:
экселевским функциям лучше скармливать ссылку на диапазон, а не массив.
Это ясно. Но объём данных слишком большой для диапазона.  
VBA. Аналог формулы ВПР(Excel) для работы с большими массивами., Способы реализации сопоставления данных в 2-х массивах с большим количеством "строк" (данных в 1-ой размерности).
 
Чего-то у меня совсем непонятное происходит при работе функции Application.Match. Через несколько тысяч связываний (итераций цикла при переборе массива) возникает ошибка. Происходит это каждый раз на разных "строках" (от 1200 до 2500). Последнее время на 1020 -1025.
Ошибка: Run-time error 1004: Application-defined or object-defined error.
При некоторых запусках программы выполнение её само прерывается (Breack) - ставится на паузу. При этом жёлтым подсвечивается "Next" (конец цикла). Если продолжить выполнение программы, то сначала чернеет экран монитора, а потом, через секунд 5, экран восстанавливается и Excel вылетает.
При некоторых запусках программы (чаще всего) происходит, просто потемнение экрана и вылет Excel.
Я вообще не могу найти закономерность происходящего. Если есть идеи, в чём причина, подскажите, пожалуйста.
Ошибка возникает в этом месте кода:
Код
varPositionNum = Application.Match(strUnicClientInAllBrends, arrBrendSheetForMatch, 0)
VBA. Аналог формулы ВПР(Excel) для работы с большими массивами., Способы реализации сопоставления данных в 2-х массивах с большим количеством "строк" (данных в 1-ой размерности).
 
Цитата
написал:
Возьмите код  asesja , который называется Cycle, он правильно построенЕще ускорить можно в нем, во время работы макроса добавить приоритет экселя "реального времени", ну и стандартный набор скринапдейтинг и т.д., где то 2 секунды выиграете (8 против 6 с. на миллион строк)
Большое спасибо. Буду пробовать.
VBA. Аналог формулы ВПР(Excel) для работы с большими массивами., Способы реализации сопоставления данных в 2-х массивах с большим количеством "строк" (данных в 1-ой размерности).
 
Цитата
написал:
А где изначально находятся эти таблицы, если они насчитывают 2 млн. строк? Не на листе же Excel.Как мне кажется, тут справится Power Query обычным джойном.
Возможно и справится. Но нужно на VBA.
VBA. Аналог формулы ВПР(Excel) для работы с большими массивами., Способы реализации сопоставления данных в 2-х массивах с большим количеством "строк" (данных в 1-ой размерности).
 
Цитата
написал:
Neurosurgeon , попробуйте ещё эти 2 варианта с массивами на большом объеме.
Большое спасибо. Это должно помочь. Я искал встроенную функцию, но не нашёл. Теперь благодаря вам узнал. Это новая для меня тема. Буду пробовать. Отпишусь о результате.
VBA. Аналог формулы ВПР(Excel) для работы с большими массивами., Способы реализации сопоставления данных в 2-х массивах с большим количеством "строк" (данных в 1-ой размерности).
 
Цитата
написал:
Если в каждой таблице уникальные клиенты, попробуйте все-таки через библиотеку в таком варианте
Большое спасибо за ваш ответ. Попробую, но думаю, что ускорение, всё-таки будет не достаточным. К сожалению, этот вариант подразумевает перебор всех уникальных клиентов, к тому же через цикл For i. Если в 2-х массивах по 2 млн. строк то потребуется менее 4*10^12 итераций (с учётом Exit For).  
VBA. Аналог формулы ВПР(Excel) для работы с большими массивами., Способы реализации сопоставления данных в 2-х массивах с большим количеством "строк" (данных в 1-ой размерности).
 
Здравствуйте, уважаемые специалисты. Решение данной проблемы, скорей всего, не должно проводиться с использованием VBA - вероятно, лучше Python или другие языки. Но я, хоть как-то, могу работать только с VBA. Я попытаюсь объяснить суть проблемы. Если кто-нибудь сможет подсказать, в каком направлении думать, буду очень благодарен. Моих знаний, к сожалению, не хватает.
Убедительно прошу сильно не ругаться. Объясняю, как могу. Буду благодарен за любые идеи.

Задача. Есть 2 двумерных массива по 2 млн. "строк" и 4 "столбца". В массиве 1 содержатся клиенты, для которых нужно найти план, содержащийся в массиве 2. Модель в приложенном файле.
Каждый клиент уникален и повторяется к каждом массиве только 1 раз.
Таким образом, чтобы подтянуть план из 2-ого массива в 1-ый в Excel можно было бы использовать, например, ВПР. Реализация подобного в VBA возможна с помощью циклов "For i". Но программа работает очень долго, так как очень большое кол-во данных. Также можно усложнить и реализовать перебор массивов через For each, но, всё-равно, долго.
Единственный выход, который я вижу, это искать совпадения не во всём массиве 2, а в кусочке данных, относящихся к конкретному субрегиону. Вот, как это реализовать?
Я пытался вкладывать словари в словари по типу (это бы решило проблему):

dicSubregion.Add Key:= "Название уникального субрегиона", Item:= dicClientsOfTheSubregion(Клиенты, относящиеся к данному субрегиону)
dicClientsOfTheSubregion.Add Key:= "Название уникального клиента", Item:= "Номер строки в массиве"

К сожалению, вложенный словарь dicClientsOfTheSubregion содержит не только клиентов, относящиеся к конкретному субрегиону, а содержит вообще всех клиентов.
Основное препятствие реализации данного метода отражено в коде ниже.
Код
dicDicReg.Item("Проверка") = "Результат положительный" 'Заполняем словарь для вкладывания.
Set dicDic.Item("Словарь") = dicDicReg 'Вкладываем словарь с новым ключом.

'К сожалению, если очистить словарь dicDicReg, то он очистится и, будучи вложенным, в словаре dicDic.
dicDicReg.RemoveAll
'Выдаст ошибку.
a = dicDic.Item("Словарь").Item("Проверка")
'Можно ли как-то сделать так, чтобы словарь dicDicReg, будучи вложенным в dicDic, не менялся??? Это бы решило мою проблему.
VBA. Новая строка в теле письма Outlook, взятом из ячейки Excel., Как добиться новой строки в теле письма Outlook, взятом из ячейки Excel.
 
Дмитрий, большое спасибо. Вся информация, действительно, есть.
VBA. Новая строка в теле письма Outlook, взятом из ячейки Excel., Как добиться новой строки в теле письма Outlook, взятом из ячейки Excel.
 
Цитата
написал:
Тут смотрели?
Конечно, смотрел. Первым делом.
VBA. Новая строка в теле письма Outlook, взятом из ячейки Excel., Как добиться новой строки в теле письма Outlook, взятом из ячейки Excel.
 
Здравствуйте. Помогите, пожалуйста. Я, вероятно, не учитываю какой-то нюанс.
Есть VBA код в Excel (early binding), рассылающий письма по разным адресам. Адреса, темы, тела писем берутся из таблицы Excel.
В ячейку Excel, в которую пишется тело письма, я записываю текст. Новые строки в данном тексте я делаю с помощью Ctrl+Enter (это очень удобно).
К сожалению, мне не удаётся сделать так, чтобы новые строки в ячейке Excel становились новыми строками в теле письма OutLook.
Ниже мой вариант кода.
Код
'Получаем переформатированное тело письма из массива arrLetterSpecific, так чтобы воспринимались новые строки.
'strMailBody - это переменная в которую попадает значение ячейки типа String, содержащей текст тела письма.

 strMailBody = arrLetterSpecific(dicRegRowNum.Item(varKeyInDicRegionsList), intStartColNum + 5) 'Теперь в переменной текст тела письма.
 strMailBody = Replace(strMailBody, Chr(13), " <br> ") 'Меняем символ "возврат каретки" на " <br> ".
 strMailBody = strApealing & " <br> " & strMailBody 'Соединяем обращение и тело письма.

'Г. Создаём письма.
 Set olEmail = olApp.CreateItem(olMailItem)
 With olEmail
    .BodyFormat = olFormatHTML
    .Display
    .HTMLBody = "<HTML><BODY><p align=;left >" & strMailBody & "</p></BODY></HTML>" & .HTMLBody & " <br> "
    .To = strMainAddresses
    .CC = strExtraAddresses
    .BCC = ""
    .Subject = strSubject
    .Attachments.Add strRegFullName                  
End With
Обфускация vba кода, Посоветуйте, пожалуйста, решение для обфускации кода vba.
 
Цитата
написал:
Раздел - Invisible Basic
Спасибо. Буду смотреть.
Обфускация vba кода, Посоветуйте, пожалуйста, решение для обфускации кода vba.
 
 1
Обфускация vba кода, Посоветуйте, пожалуйста, решение для обфускации кода vba.
 
Здравствуйте. Нужно защитить проект vba от копирования. Пароли поставлю, модули скрою. Есть ли какое-либо решение для обфускации кода?
Получение номеров строк из несвязанного диапазона., Через Application.InputBox получаем несвязанный диапазон Rage. Нужно получить номера всех строк.
 
Цитата
написал:
а зачем еще куда-то собирать, если строки уже и так собраны в rngRange.Rows?
И то верно. Наверное, так даже проще будет.
Получение номеров строк из несвязанного диапазона., Через Application.InputBox получаем несвязанный диапазон Rage. Нужно получить номера всех строк.
 
Цитата
написал:
определить куда?
Спасибо.
Полученные номера строк я сохраню в коллекции или в словаре. Затем программа будет обрабатывать только данные строки таблицы, игнорируя остальные. Это нужно для "ручной" доработки отчёта, когда весь отчёт уже готов и менять можно только отдельные строки.
Получение номеров строк из несвязанного диапазона., Через Application.InputBox получаем несвязанный диапазон Rage. Нужно получить номера всех строк.
 
Спасибо!
Решил задачу так:
Код
'Определение номеров строк невязанного диапазона.
Dim rngRange As Range
Dim lngStartRowNum As Long, lngLastRowNum As Long
Dim varItemInRange As Variant

Set rngRange = Application.InputBox(prompt:="Выделите диапазон обработки.", Type:=8)
For Each varItemInRange In rngRange.Rows
    Debug.Print varItemInRange.Row
Next varItemInRange
Получение номеров строк из несвязанного диапазона., Через Application.InputBox получаем несвязанный диапазон Rage. Нужно получить номера всех строк.
 
Здравствуйте, уважаемые специалисты. Сразу извините, если не понимаю базовых вещей. Задача такая.
Пользователь получает окно Application.InputBox, выбирает мышкой несвязанный диапазон ячеек.
Нужно определить номера всех строк в это диапазоне.
Для связанного диапазона, вроде, всё просто, а как быть с не связанным ($A$2; $A$4:$A$5)?
Код
'Определение номеров строк связанного диапазона.
Dim rngRange As Range
Dim lngStartRowNum As Long, lngLastRowNum As Long

Set rngRange = Application.InputBox(prompt:="Выделите диапазон обработки.", Type:=8)
lngStartRowNum = rngRange.Row
lngLastRowNum = lngStartRowNum + rngRange.Rows.Count - 1
Не определяется "FileFormat:=xlOpenXMLWorkbook" при сохранении книги., По какой-то причине Exel выдаёт ошибку при попытке сохранить книгу без макросов.
 
Большое спасибо. Проблема решена.
Ошибка была допущена по невнимательности, за что я поплатился 3-мя часами поисков решения.
Не определяется "FileFormat:=xlOpenXMLWorkbook" при сохранении книги., По какой-то причине Exel выдаёт ошибку при попытке сохранить книгу без макросов.
 
Здравствуйте. Помогите, пожалуйста, разобраться. Самостоятельно найти решение никак не получается.
VBA код находится в книге 1. Код запускает обработку Книги2 (.xlsm), которая содержит макросы. В конце код книги1 должен сохранить Книгу2 под новым именем и без макросов.
Код
strWbName = strDirForReg & "\" & strWbName & "_" & varKeyInDic & ".xlsx"
wbBookForPreparing.SaveCopyAs Filename:=strWbName, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Программа выдаёт ошибку, ссылаясь на FileFormat. Я не могу понять, почему. Раньше такая строка кода работала в других программах.
Ошибка: "Compile Error: Named argument not found."
Заранее большое спасибо за помощь.
Функция определения координат значения String в двумерном Array., В двумерный массив занесена таблица Excel c заголовками. Нужно сделать функцию поиска координат любого заголовка по значению String.
 
Вроде как, разобрался. Не было "Set".
Может есть более оптимальное решение?
Функция определения координат значения String в двумерном Array., В двумерный массив занесена таблица Excel c заголовками. Нужно сделать функцию поиска координат любого заголовка по значению String.
 
Здравствуйте. Помогите, пожалуйста.
Есть двумерный массив, содержащий таблицу Excel c заголовками. Нужно создать функцию, которая будет перебирать массив и выдавать позиции искомого заголовка (String) в 1-ом и 2-ом измерении. Как сделать это без функции, я понимаю. Проблема с функцией для меня в том, что я не могу добиться, чтобы функция выдавала 2 значения одновременно.
Ниже представлено решение, которое я разрабатываю. Возможно, Вы можете предложить более разумное решение. Заранее огромное спасибо.
Код
'Модуль, из которого вызывается функция.
Dim colWordAddress As New Collection
Dim arrForFunc() As Variant, strNameToFindInFunc As String 'Переменные для функции

    strNameToFindInFunc = "Субрегион" 'Значение String, координаты которого должна найти функция.
    arrForFunc = arrSheetDatas
    colWordAddress = fNameDetectionInArray(arrForFunc, strNameToFindInFunc) 'Вот здесь возникает ошибка. Не знаю почему.

' _____________________________________________________________
'Сама функция.
Function fNameDetectionInArray(arrForFunc As Variant, strNameToFindInFunc As String) As Collection
'Данная функция возвращает координаты 2-размерного массива, где содержится значение strNameToFindInFunc.
'Обязательно нужно передать в функцию массив "arrForFunc" и искомый текст "strNameToFindInFunc".

Dim lngArrayRowIndex As Long, lngArrayColIndex As Long
Dim strNameWasFound As String

    Set fNameDetectionInArray = New Collection
     'А. Перебираем массив для поиска значения strNameToFindInFunc.
       
        For lngArrayRowIndex = LBound(arrForFunc, 1) To LBound(arrForFunc, 1) + 10 Step 1
            For lngArrayColIndex = LBound(arrForFunc, 2) To UBound(arrForFunc, 2) Step 1
                strNameWasFound = arrForFunc(lngArrayRowIndex, lngArrayColIndex) 'Найденное значение, записанное в массиве.
                If UCase(strNameWasFound) Like UCase(strNameToFindInFunc) Then
                    fNameDetectionInArray.Add lngArrayRowIndex
                    fNameDetectionInArray.Add lngArrayColIndex
                    Exit For
                End If
            Next lngArrayColIndex
            If fNameDetectionInArray(1) <> 0 Then
                Exit For
            End If
        Next lngArrayRowIndex
End Function
Application.Volatile включён по умолчанию?, UDF (пользовательская функция) почему-то запускается при изменении любых ячеек на листе, а не только связанных.
 
Ясно. Спасибо. Буду искать альтернативное решение через обычные модули.
Application.Volatile включён по умолчанию?, UDF (пользовательская функция) почему-то запускается при изменении любых ячеек на листе, а не только связанных.
 
Здравствуйте. Буду признателен за помощь. Сам разобраться никак не могу. Укажу данные, которые, возможно, имеют значение.
Создал UDF вида "Funkciya($A1;$G8)". Тип данных Variant.
Ячейки "А1" и "G8" не зависят от ячейки с UDF.
"Application.Volatile=True" НЕТ в коде.
Функция вставлена в ячейку обычного диапазона (не Data table).
Другие ячейки строки в своих формулах ссылаются на ячейку с UDF.
На листе множество ячеек с условным форматированием.
По какой-то причине UDF запускается при изменении любой ячейки листа, а не только "А1" и "G8". А запустившись, выполняется 4 раза.
Как такое может быть? Заранее большое спасибо за помощь.
Передача переменных из UserForm в процедуру обычного модуля., Нужно передать переменную из процедуры кнопки UserForm в процедуру обычного модуля для дальнейшего использования этой переменной.
 
Цитата
написал:
Добрый день.
На мой дилетантский взгляд, после обработки кода формы переменная обнуляется (паблик она там, или не паблик). Для того, чтобы она сохраняла значение после работы процедуры, по-моему, существует декларация Static.
Насколько я помню. Вроде бы.
Огромное спасибо. Всё работает.
Передача переменных из UserForm в процедуру обычного модуля., Нужно передать переменную из процедуры кнопки UserForm в процедуру обычного модуля для дальнейшего использования этой переменной.
 
Господа, здравствуйте. Я в тупике. По задумке пользователь вводит в UserForm данные, которые потом должны использоваться в различных процедурах обычных модулей. Очевидно, что для этого нужно передать переменные из UserForm в обычный модуль.
В частности, нужно при нажатии кнопки "Отмена" присвоить переменной pubIfExitSub значение True. И эту переменную передать в обычный модуль и в нём уже обработать. К сожалению, не получается, даже если сделать её глобальной.
Это только пример. Моя UserForm планируется быть значительно сложней. Обрабатывать данные внутри UserForm вообще не вариант.
Спасибо.

Модуль. Процедура 1.
Код
Public pubIfExitSub as Boolean

Sub Test ()
Dim uf1UserSettings As UserForm1

Set uf1UserSettings = VBA.UserForms.Add(UserForm1.Name)
uf1UserSettings.Show vbModal

End Sub

UserForm. При нажатии на кнопку "Отмена" переменной должно присвоиться значение True.

Код
Private Sub CommandButton_Cancel_Click()
    
    pubIfExitSub = True 'При нажатии кнопки "Отменить выполнение программы", данная глобальная переменная становится True, и в 
                         основной процедуре она проверяется и прекращается выполнение программы.

End sub

Модуль. Процедура 2.

Код
Sub Processing_pubIfExitSub ()
        Select Case pubIfExitSub1 'Если в пользовательской форме нажата кнопка "Отменить выполнение программы", нужно выйти из процедуры.
            Case pubIfExitSub1 = True
                Exit Sub
        End Select

End sub
Страницы: 1 2 3 След.
Наверх