45

VBA Excel - выбор документа для обработки

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

VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост

В listbox выводится список открытых документов или можно открыть файл через стандартный диалог открытия.

К сожалению, эксель не экспортирует формы в текстовом виде (во всяком случае, 2007 точно нет), поэтому будут скрины контролов и их свойств.

VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост
VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост
VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост
VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост
VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост

Как вы видите, я не заморачивался с названиями.

Код:

Public SrcName

Private Sub CommandButton1_Click()

SrcName= ""

If ListBox1.ListIndex >= 0 Then

SrcName= ListBox1.List(ListBox1.ListIndex)

UserForm1.Hide

End If

End Sub

Private Sub CommandButton2_Click()

SrcName= ""

UserForm1.Hide

End Sub

Private Sub OpnButton_Click()

iOpen = Application.Dialogs(xlDialogOpen).Show

If iOpen = True Then

SrcName= ActiveWorkbook.Name

UserForm1.Hide

Else

MsgBox "отмена", vbCritical, ""

Exit Sub

End If

End Sub

Private Sub UserForm_Activate()

SrcName= ""

ListBox1.Clear

NoShow = ThisWorkbook.Windows(1).Caption

For i = 1 To Application.Windows.Count

If Application.Windows(i).Caption <> NoShow Then ListBox1.AddItem (Application.Windows(i).Caption)

Next ' enum windows

End Sub

Пикабу сожрал все отступы, это не я!

Пример использования:

Dim SrcWB As Worksheet
UserForm1.Show
If UserForm1.SrcName= "" Then Exit Sub
Windows(UserForm1.SrcName).Activate
Set SrcWB = ActiveWorkbook

P.S. Баянометр считает, что эксель на 41% похож на клубничку. Мне кажется, что он недалёк от истины.

Найдены дубликаты

+1

Чота сложно, вот вариант без кнопок, на одном листбоксе.

https://pastebin.com/TQr7t5pz

По классике код не проверял, но должно работать ¯\_(ツ)_/¯

Иллюстрация к комментарию
раскрыть ветку 3
-1

Даблкликом хотел сделать ещё потом, но стало лениво. А кнопка открытия всё равно нужна иногда бывает.

раскрыть ветку 2
0

В любом случае, так хватать книгу за "активбук" не стоит.

Используй лучше filedialog, он более гибкий, и открывай выбранную книгу в ручную.

Да и показывать сообщение об отмене, сразу после того как мы нажали точно такую же кнопку, явно лишнее.

раскрыть ветку 1
+1

Ну так выложи архив со всеми формами и модулями.

раскрыть ветку 2
+2

У файлообменников есть очень вредная привычка удалять файлы. Но! Есть старый как мир способ - UUE


begin 644 tmp.zip
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
2``````(``@"^````"P4`````
`
end
sum -r/size 6313/1503
раскрыть ветку 1
+1
А ты хорош!
0
Мне кажется это таким непостижимым... Кааак вы все это пишете? Браво!!!!
0
P.S. Баянометр считает, что эксель на 41% похож на клубничку. Мне кажется, что он недалёк от истины.

Это ты еще диплом на антиплагиате не проверял. У меня он ругался на скрины моего с нуля написанного приложения

Похожие посты
269

Редизайнер таблиц в Excel

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


Рано или поздно пользователь такой таблицы приходит к мысли, что "пусть будет не так красиво, зато можно работать" и начинает упрощать дизайн своей таблицы, приводя его в соответствие с классическими рекомендациями:

- простая однострочная шапка, где у каждого столбца будет свое уникальное название (имя поля)

- одна строка - одна законченная операция (сделка, продажа, проводка, проект и т.д.)

- без объединенных ячеек

- без разрывов в виде пустых строк и столбцов


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

из такой таблицы

Редизайнер таблиц в Excel Excel, Макрос, Vba, Таблица, Полезное, На заметку, Длиннопост

сделать

Редизайнер таблиц в Excel Excel, Макрос, Vba, Таблица, Полезное, На заметку, Длиннопост

В терминах баз данных нижнюю таблицу обычно называют плоской (flat) - именно по таким таблицам лучше всего строить отчеты сводных таблиц (pivot tables) и проводить аналитику.


Преобразовать двумерную таблицу в плоскую можно при помощи простого макроса. Откройте редактор Visual Basic через вкладку Разработчик - Visual Basic (Developer - Visual Basic Editor) или сочетанием клавиш Alt+F11. Вставьте новый модуль (Insert - Module) и скопируйте туда текст этого макроса:

Sub Redesigner()

Dim i As Long

Dim hc As Integer, hr As Integer

Dim ns As Worksheet

hr = InputBox("Сколько строк с подписями сверху?")

hc = InputBox("Сколько столбцов с подписями слева?")

Application.ScreenUpdating = False

i = 1

Set inpdata = Selection

Set ns = Worksheets.Add

For r = (hr + 1) To inpdata.Rows.Count

For c = (hc + 1) To inpdata.Columns.Count

For j = 1 To hc

ns.Cells(i, j) = inpdata.Cells(r, j)

Next j

For k = 1 To hr

ns.Cells(i, j + k - 1) = inpdata.Cells(k, c)

Next k

ns.Cells(i, j + k - 1) = inpdata.Cells(r, c)

i = i + 1

Next c

Next r

End Sub

После этого можно закрыть редактор VBA и вернуться в Excel. Теперь можно выделить исходную таблицу (полностью, с шапкой и первым столбцом с месяцами) и запустить наш макрос через Разработчик - Макросы (Developer - Macros) или нажав сочетание Alt+F8.


Макрос вставит в книгу новый лист и создаст на нем новый, реконструированный вариант выделенной таблицы. С такой таблицей можно работать "по полной программе", применяя весь арсенал средств Excel для обработки и анализа больших списков.


Также есть второй вариант для работы с большими таблицами

Sub Redesigner()

Dim inpdata As Range, realdata As Range, ns As Worksheet

Dim i&, j&, k&, c&, r&, hc&, hr&

Dim out(), dataArr, hcArr, hrArr

hr = Val(InputBox("Сколько строк с подписями данных сверху?"))

hc = Val(InputBox("Сколько столбцов с подписями данных слева?"))

Set inpdata = Selection

If inpdata.Rows.Count <= hr Or inpdata.Columns.Count <= hc Then Exit Sub

Set realdata = inpdata.Offset(hr, hc).Resize(inpdata.Rows.Count - hr, inpdata.Columns.Count - hc)

dataArr = realdata.Value

If hr Then hrArr = inpdata.Offset(0, hc).Resize(hr, inpdata.Columns.Count - hc).Value

If hc Then hcArr = inpdata.Offset(hr, 0).Resize(inpdata.Rows.Count - hr, hc).Value

ReDim out(1 To Application.CountA(realdata), 1 To hr + hc + 1)

Set ns = Worksheets.Add

For i = 1 To UBound(dataArr, 1)

For j = 1 To UBound(dataArr, 2)

If Not IsEmpty(dataArr(i, j)) Then

k = k + 1

For c = 1 To hc: out(k, c) = hcArr(i, c): Next c

For r = 1 To hr: out(k, c + r - 1) = hrArr(r, j): Next r

out(k, c + r - 1) = dataArr(i, j)

End If

Next j, i

ns.Cells(2, 1).Resize(UBound(out, 1), UBound(out, 2)) = out

End Sub

Редизайн таблиц сэкономит кучу времени, нервов и сил, чтобы в оставшееся время почитать пикабу))

Взято отсюда

Показать полностью
87

VBA Excel - вывести формулы в ячейки

Была задача по переносу вычислений из экселя. Чтобы не лезть и не смотреть формулу в каждой ячейке я написал небольшой макрос, который их выводит.

Ниже выделенного диапазона на 10 строк выводятся все формулы и значения из заполненных ячеек.

Получается вот такая штука, которую гораздо проще разобрать и перенести

VBA Excel - вывести формулы в ячейки Excel, Vba, Макрос

Сам макрос:

Sub DrawFormulas()
For Each Cell In Selection
CellFormula = Cell.Formula
If Left(CellFormula, 1) <> "=" Then CellFormula = "=" + CellFormula
If Trim(CellFormula) <> "=" Then Cell.Offset(Selection.Rows.Count + 10).Value = Cell.Address + CellFormula
Next
End Sub

591

Отслеживание входа пользователей в книгу Excel

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


Этап 1. Создаем "Лог"

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

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Этап 2. Макросы фиксации входа-выхода

Теперь добавим макросы для записи на лист Лог даты-времени и имен пользователей при открытии и закрытии книги. Для этого нужно открыть редактор Visual Basic с помощью сочетания Alt+F11 или с помощью кнопки Visual Basic на вкладке Разработчик (Developer) и найти в левом верхнем углу панель Project (если она не отображается, то включить ее можно сочетанием клавиш Ctrl+R):

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Двойным щелчком откройте модуль ЭтаКнига (ThisWorkbook) и вставьте туда пару наших макросов для обработки событий открытия и закрытия книги:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим дату-время выхода из файла

If lastrow>1 Then Worksheets("Лог").Cells(lastrow, 3) = Now

'сохраняемся перед выходом

ActiveWorkbook.Save

End Sub

Private Sub Workbook_Open()

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим имя пользователя и дату-время входа в файл

Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME")

Worksheets("Лог").Cells(lastrow + 1, 2) = Now

End Sub

Попробуйте открыть-закрыть этот файл пару раз и убедитесь, что на лист Лог попадает ваше имя пользователя (логин входа в Windows) и дата-время:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Этап 3. Улучшаем надежность

Можно было бы скрыть лист Лог и на этом остановиться, но есть одно "но": если у пользователя, который открывает нашу книгу, макросы разрешены по умолчанию либо он сам их разрешает, нажав в окне предупреждения на кнопку Включить содержимое, то все в порядке:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Но что если пользователь не разрешит выполнение макросов или они отключены у него по умолчанию? Тогда наши макросы отслеживания выполняться не будут и фиксации имени и даты не произойдет :( Как же заставить пользователя разрешить использование макросов?

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

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Суть в том, чтобы по умолчанию скрыть в книге все листы кроме этого, а рабочие листы с данными отображать с помощью специального макроса. Если пользователь не разрешил выполнение макросов, то он увидит в книге только один лист с предупреждением. Если же макросы разрешены, то наш макрос обработки события открытия книги скроет лист с предупреждением и отобразит листы с данными. Чтобы пользователь сам не отобразил их - используем суперскрытие вместо обычного скрытия листов (параметр xlSheetVeryHidden вместо обычного False).

Чтобы реализовать все описанное, слегка изменим наши процедуры в модуле ЭтаКнига (ThisWorkbook)

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим дату-время выхода из файла

If lastrow > 1 Then Worksheets("Лог").Cells(lastrow, 3) = Now

'скрываем все листы, кроме листа ПРЕДУПРЕЖДЕНИЕ

Worksheets("Предупреждение").Visible = True

For Each sh In ActiveWorkbook.Worksheets

If sh.Name = "Предупреждение" Then

sh.Visible = True

Else

sh.Visible = xlSheetVeryHidden

End If

Next sh

'сохраняемся перед выходом

ActiveWorkbook.Save

End Sub


Private Sub Workbook_Open()

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим имя пользователя и дату-время входа в файл

Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME")

Worksheets("Лог").Cells(lastrow + 1, 2) = Now

'отображаем все листы

For Each sh In ActiveWorkbook.Worksheets

sh.Visible = True

Next sh

'скрываем листы ПРЕДУПРЕЖДЕНИЕ и ЛОГ

Worksheets("Предупреждение").Visible = xlSheetVeryHidden

Worksheets("Лог").Visible = xlSheetVeryHidden

End Sub

Чтобы просмотреть скрытый Лог откройте редактор VisualBasic (Alt+F11), выделите лист на панели Project и измените его видимость на панели Properties, используя свойство Visible:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Если пользователи настолько продвинутые, что знают про суперскрытые листы и могут их отобразить через редактор Visual Basic или нарушить работу наших макросов, то можно дополнительно поставить пароль на просмотр и изменение макросов. Для этого щелкните правой кнопкой мыши по имени файла в панели Project (строка VBAProject (blackbox.xls)), выберите команду VBA Project Properties и включите флажок Lock project for viewing и задайте пароль на вкладке Protection:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Теперь точно никто не уйдет безнаказанным.


Интересные поправки в макрос из комментария источника:

Вместо поиска последней занятой строки в таких случаях я обычно вставляю новую строку сразу после "шапки". Все предыдущие строки сдвигаются вниз, конечно. В результате немного упрощается код, сортировка получается обратная, "новые сверху", что позволяет быстрее просматривать последние записи, не прокручивая лист. При открытии - вставляется строка, её номер всегда будет 2. При закрытии файла в строку 2 добавляется время. Переполнение этого стека маловероятно, но и проверку такого переполнения проводить не нужно, просто отрезать строки ниже запланированного количества записей, без проверки.

Private Sub Workbook_Open()

Worksheets("Реестр изменений").Rows("2:2").Insert Shift:=xlDown 'вставляем между строками 1 и 2 новую строку

Worksheets("Реестр изменений").Rows("501:501").Delete Shift:=xlUp 'удаляем строку 501 (реестр на 500 строк)

Worksheets("Реестр изменений").Cells(2, 1) = Environ("USERNAME") 'запись в первую ячейку второй строки

Worksheets("Реестр изменений").Cells(2, 2) = Now 'запись во вторую ячейку второй строки

Показать полностью 5
160

Макрос для выделения дубликатов разными цветами

Как известно, чтобы выделить дубликаты цветом в Excel можно воспользоваться специальной опцией в «условном форматировании».

Достаточно выделить диапазон, задать цвет заливки, - и все повторяющиеся (или, наоборот, уникальные) значения будут выделены.

Но иногда требуется, чтобы различные повторяющиеся значения были выделены РАЗНЫМИ ЦВЕТАМИ.

В этом случае, без макросов не обойтись. Нажимаем сочетание клавиш Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer), вставляем новый пустой модуль через меню Insert - Module и копируем туда код этого макроса:

Sub ВыделитьДубликатыРазнымиЦветами()

On Error Resume Next

' массив цветов, используемых для заливки ячеек-дубликатов

Colors = Array(12900829, 15849925, 14408946, 14610923, 15986394, 14281213, 14277081, _

9944516, 14994616, 12040422, 12379352, 15921906, 14336204, 15261367, 14281213)

Dim coll As New Collection, dupes As New Collection, _

cols As New Collection, ra As Range, cell As Range, n&

Err.Clear: Set ra = Intersect(Selection, ActiveSheet.UsedRange)

If Err Then Exit Sub

ra.Interior.ColorIndex = xlColorIndexNone: Application.ScreenUpdating = False

For Each cell In ra.Cells ' запонимаем значение дубликатов в коллекции dupes

Err.Clear: If Len(Trim(cell)) Then coll.Add CStr(cell.Value), CStr(cell.Value)

If Err Then dupes.Add CStr(cell.Value), CStr(cell.Value)

Next cell

For i& = 1 To dupes.Count ' заполняем коллекцию cols цветами для разных дубликатов

n = n Mod (UBound(Colors) + 1): cols.Add Colors(n), dupes(i): n = n + 1

Next

For Each cell In ra.Cells ' окрашиваем ячейки, если для её значения назначен цвет

cell.Interior.color = cols(CStr(cell.Value))

Next cell

Application.ScreenUpdating = True

End Sub

Теперь можно выделить любой диапазон с данными на листе и запустить макрос с помощью сочетания клавиш Alt+F8 или через кнопку Макросы (Macros) на вкладке Разработчик (Developer).

Макрос для выделения дубликатов разными цветами Excel, Макрос, Vba, Полезное, На заметку

Плюсом этого макроса является то, что он не виснет при выделении всего листа (или столбца) целиком и не вылетает с ошибкой, если найдено более 55 дубликатов. Макрос взят здесь

Показать полностью 1
58

VBA Excel - массовая безопасная замена

Решил поделиться ещё одним полезным отрывком кода. Была задача массовой замены в документе одних значений на другие, при этом они могли пересекаться (изменилась нумерация) и обычная последовательная замена приводила к хаосу. В результате получилась вот такая процедурка для замены в 2 прохода.

Sub SafeReplace(TargetRange As Range, ReplaceRules As Range)
' безопасный массовый поиск и замена
' TargetRange: где ищем, ReplaceRules: правила замены, первый столбец - что найти, второй - на что заменить
For i = 1 To ReplaceRules.Rows.Count ' for each
TargetRange.Replace _
What:=ReplaceRules.Cells(i, 1), Replacement:="!SafeReplace" + CStr(i) + "!", _
MatchCase:=False
Next ' замена 1 проход
For i = 1 To ReplaceRules.Rows.Count ' for each
TargetRange.Replace _
What:="!SafeReplace" + CStr(i) + "!", Replacement:=ReplaceRules.Cells(i, 2), _
MatchCase:=True
Next ' замена 2 проход
End Sub
с форматированием - на pastebin.com

Пример использования: на вкладке ReplaceRules есть таблица замены

VBA Excel - массовая безопасная замена Excel, Vba, Замена

Для замены в выделенном фрагменте используем следующий макрос, привязанный на горячую кнопку.

Sub ReplaceSelected()
Application.ScreenUpdating = False
Dim ReplaceRulePos As Range
Set ReplaceRulePos = Worksheets("ReplaceRules").Range("A1").CurrentRegion.Offset(1, 0) ' смещение на 1 строку, без заголовка
Call SafeReplace(Selection, ReplaceRulePos.Resize(ReplaceRulePos.Rows.Count - 1)) ' изменить размер области, чтобы последний пустой ряд не обрабатывался и вызвать автозамену
Application.ScreenUpdating = True
End Sub
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: