Трюки Excel. Скрипты excel


Excel - работаем с макросами

В процессе работы неоднократно приходиться сталкиваться с табличными процессорами типа Excel. И хотя это не совсем САПР, но информацию в рамках BIM контекста хочешь не хочешь, а приходится обрабатывать, либо с помощью Базы Данных, либо в тех самых экселевских табличках. А лучше и так и эдак.

Естественно, как и во всем, что связанно с компьютером эту деятельность тоже можно изрядно упростить с помощью автоматизации. С появлением таких вещей как Pivot Tables и Power Queries — так и вовсе становится не понятно как работали с информацией до этого. Но тут мы поговорим о старых добрых ламповых макросах на VBA.

Excel VBA Macro script

Макросы в экселе пишут на VBA (Visual Basic Advance) — слегка переработанный под нужды офисного пакета старый добрый  Бейсик, со всеми своими достоинствами и недостатоками.  Сами программы по умолчанию являются частью эксель файла. И убедится в этом можно с помощью соответствующей консоли (Microsoft Visual Basic for Application)

Добраться до них можно в любое время нажав сочетание клавишь Alt+F11

Но сначала надо включить вкладку Developers в стандартной ленте экселя.

 

 

Для этого:

  1. Ннаводим курсор на ленту и нажимаем Правую Клавишу Мыши (ПКМ)
  2. В открывшемся списке выбираем — Customize the Ribbon (Настройка Ленты)
  3. Ищем как показано на скриншоте пункт Developer (Разработка) и нажимаем чтобы появилась галочка
  4. Ок.

Путем этих не хитрых манипуляций мы получили доступ к панели разработчика в Excel — не будем особо заострять на ней внимание. Нам там понадобится буквально несколько кнопок

— Visual Basic — собственно уже обусжденная выше консоль для работы со скриптами.

— Macos — список доступных макросов для использования.

— Record Macro — эта кнопка позволяет включить запись ваших  действий с табличным редактором.

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

Однако есть нюанс. Созданный макроскрипт будет по умолчанию доступен только в одном эксель файле. Скопировать его в другой — конечно можно, но довольно заморочно. Есть ли выход из этой ситуации? Конечно!

Создаем собственную библиотеку Excel макросов — Personal.xlsb

Для этого нам нужно создать файл Personal.xlsb. Создается он один раз, и потом автоматически подгружается Экселем, благодаря чему сохраненные в нем Скрипты и функции становятся доступны во всех ваших файлах. Другой плюс — теперь они не сохраняются в самих файлах, и соответственно можно без опаски передавать результаты за пределы компании.

Собственно смотрим на картинку:

1. Необходимо включить макрос на запись.

2. В появившемся окне в выпадающем списке выбрать пункт — Personal Macro Workbook. Если такого файла не существует — он будет создан автоматические (то что нам и нужно)

3. Запускаем скрипт на запись

4. И останавливаем её.

Готово. Теперь у нас есть файл в который наши модули и функции можно закинуть единожды, а доступны они будут сразу во всех эксель файлах. К тому же так они не утекут за пределы компании, вместе с файлами.

 

cadsupport.ru

скрипты

Задача переноса графиков, диаграмм, таблиц из Excel в презентацию PowerPoint осложняется тем, что в последних версиях редактора презентаций (2007, 2010) разработчики убрали возможность записи производимых действий в макрос. Поэтому, для настройки внешнего вида презентации под собственные условия, нужно перерыть документацию по VBA для PowerPoint, либо просмотреть множество специализированных форумов. Ниже приведен код примера создания презентации из диаграмм Excel.

Private Sub export_to_pp() Set pr = CreateObject("PowerPoint.Application") Set mpr = pr.Presentations.Add 'Определение имени создаваемой презентации ppName = "Имя_для_презентации" 'Добавление пустого слайда Set ppSlide = mpr.Slides.Add(mpr.Slides.Count, ppLayoutBlank) 'Цвет фона слайда ppSlide.Master.Background.Fill.ForeColor.RGB = RGB(200, 200, 200) 'Добавление блока (Orientation, Left, Top, Width, Height) 'функция Application.CentimetersToPoints переводит сантиметры в пиксели Set TextShape = ppSlide.Shapes.AddTextbox(1, _ Application.CentimetersToPoints(1.09), _ Application.CentimetersToPoints(1.2), _ Application.CentimetersToPoints(22.86), _ Application.CentimetersToPoints(1.2)) TextShape.TextFrame.TextRange.Text = "Текст надписи" 'Настройка параметров блока с текстом TextShape.TextFrame.TextRange.Font.Name = "Calibri" TextShape.TextFrame.TextRange.Font.Size = 18 TextShape.TextFrame.TextRange.Font.Bold = True 'Отключение автоматического подгона размера блока под текст TextShape.TextFrame.AutoSize = 0 TextShape.Height = Application.CentimetersToPoints(1.2) TextShape.TextFrame.TextRange.Font.Color = vbWhite 'Вертикальное выравнивание текста по центру TextShape.TextFrame.VerticalAnchor = msoAnchorMiddle 'Копируем диаграмму в PowerPoint ListName.ChartObjects("ChartName").Copy Set chart1 = ppSlide.Shapes.PasteSpecial(ppPastePNG) chart1.Left = Application.CentimetersToPoints(1.52) chart1.Top = Application.CentimetersToPoints(3.65) 'Копируем таблицу как OLE object ListName.Range("H51:M60").Copy Set table1 = ppSlide.Shapes.PasteSpecial(ppPasteOLEObject) table1.Left = Application.CentimetersToPoints(1.52) table1.Top = Application.CentimetersToPoints(13.72) 'Копируем таблицу как рисунок ListName.Range("H61:M70").Copy Set table2 = ppSlide.Shapes.PasteSpecial(ppPasteEnhancedMetafile) table2.Left = Application.CentimetersToPoints(13.16) table2.Top = Application.CentimetersToPoints(13.72) Application.CutCopyMode = False 'Сохраняем презентацию в папке с текущей книгой Excel mpr.SaveAs (ThisWorkbook.Path + "\" + ppName) mpr.Close pr.Quit End Sub

Private Sub export_to_pp() Set pr = CreateObject("PowerPoint.Application") Set mpr = pr.Presentations.Add 'Определение имени создаваемой презентации ppName = "Имя_для_презентации" 'Добавление пустого слайда Set ppSlide = mpr.Slides.Add(mpr.Slides.Count, ppLayoutBlank) 'Цвет фона слайда ppSlide.Master.Background.Fill.ForeColor.RGB = RGB(200, 200, 200) 'Добавление блока (Orientation, Left, Top, Width, Height) 'функция Application.CentimetersToPoints переводит сантиметры в пиксели Set TextShape = ppSlide.Shapes.AddTextbox(1, _ Application.CentimetersToPoints(1.09), _ Application.CentimetersToPoints(1.2), _ Application.CentimetersToPoints(22.86), _ Application.CentimetersToPoints(1.2)) TextShape.TextFrame.TextRange.Text = "Текст надписи" 'Настройка параметров блока с текстом TextShape.TextFrame.TextRange.Font.Name = "Calibri" TextShape.TextFrame.TextRange.Font.Size = 18 TextShape.TextFrame.TextRange.Font.Bold = True 'Отключение автоматического подгона размера блока под текст TextShape.TextFrame.AutoSize = 0 TextShape.Height = Application.CentimetersToPoints(1.2) TextShape.TextFrame.TextRange.Font.Color = vbWhite 'Вертикальное выравнивание текста по центру TextShape.TextFrame.VerticalAnchor = msoAnchorMiddle 'Копируем диаграмму в PowerPoint ListName.ChartObjects("ChartName").Copy Set chart1 = ppSlide.Shapes.PasteSpecial(ppPastePNG) chart1.Left = Application.CentimetersToPoints(1.52) chart1.Top = Application.CentimetersToPoints(3.65) 'Копируем таблицу как OLE object ListName.Range("H51:M60").Copy Set table1 = ppSlide.Shapes.PasteSpecial(ppPasteOLEObject) table1.Left = Application.CentimetersToPoints(1.52) table1.Top = Application.CentimetersToPoints(13.72) 'Копируем таблицу как рисунок ListName.Range("H61:M70").Copy Set table2 = ppSlide.Shapes.PasteSpecial(ppPasteEnhancedMetafile) table2.Left = Application.CentimetersToPoints(13.16) table2.Top = Application.CentimetersToPoints(13.72) Application.CutCopyMode = False 'Сохраняем презентацию в папке с текущей книгой Excel mpr.SaveAs (ThisWorkbook.Path + "\" + ppName) mpr.Close pr.Quit End Sub

Продолжить чтение »

opennotes.ru

Vbscript + Active Directory + Excel. Генерируем документ в Excel при помощи скрипта на vbscript.

Возникла необходимость вытянуть данные по пользователям из Active Directory (AD) в таблицу Excel в формате, понятном не только системному администратору :) . Т.к. пользователи приходят/увольняются, то вручную каждый раз переделывать таблицу размером в 2 листа формата А3 мелким шрифтом как-то не по админски, поэтому, будем автоматизировать процесс создания таблицы при помощи VBScript - предоставим серверу выполнение этой задачи, пока мы будем заниматься более полезными вещами.

2) Существует несколько филиалов территориально расположенных вдали друг от друга, каждый филиал сидит в своем OU и имеет свой набор групп пользователей. Все группы пользователей филиалов являются членами одной общей группы филиала. В свою очередь каждая общая группа филиала является членом общей группы предприятия.

Отобразить в определенной таблице Excel всех сотрудников (пользователей) предприятия с данными о принадлежности к определенным группам безопасности.Соответственно по каждому пользователю отобразить дополнительные данные (почтовый ящик и т.д.). В пределах групп будем сортировать пользователей в алфавитном порядке. Уволившихся сотрудников отмечаем красным цветом.

Содержимое скрипта надо сохранить в виде обычного текстового файла (NOTEPAD) и изменить расширение на .vbsНапример:examle.vbs

    Const ADS_SCOPE_SUBTREE = 2     Const E_ADS_PROPERTY_NOT_FOUND  = &h8000500D     'On Error Resume Next ' Не спотыкаться на ошибках

    ' Обьявляем массивы    Dim XLAp     Dim XLWb    Dim XLWs    Dim objADObject, strGroup, objGroupList

    ' Запускаем EXCEL    Set XLAp = CreateObject("Excel.Application")     XLAp.Visible = True    lst = 1    Set XLWb = XLAp.Workbooks.Add    Set XLWs = XLWb.Worksheets(lst)    XLWs.Activate

    ' Настройки листа EXCEL    XLAp.ActiveSheet.PageSetup.Zoom = 60    XLAp.ActiveSheet.PageSetup.PaperSize = 8    XLAp.ActiveSheet.PageSetup.CenterHorizontally = True    XLAp.ActiveSheet.PageSetup.LeftMargin = XLAp.Application.InchesToPoints(0.25)    XLAp.ActiveSheet.PageSetup.RightMargin = XLAp.Application.InchesToPoints(0.25)    XLAp.ActiveSheet.PageSetup.TopMargin = XLAp.Application.InchesToPoints(0.75)    XLAp.ActiveSheet.PageSetup.BottomMargin = XLAp.Application.InchesToPoints(0.75)    XLAp.ActiveSheet.PageSetup.HeaderMargin = XLAp.Application.InchesToPoints(0.3)    XLAp.ActiveSheet.PageSetup.FooterMargin = XLAp.Application.InchesToPoints(0.3)

    ' Выставляем длинну колонок    XLAp.Columns("A:A").ColumnWidth = 0.58    XLAp.Columns("B:C").ColumnWidth = 2.71    XLAp.Columns("D:D").ColumnWidth = 21.86    XLAp.Columns("E:E").ColumnWidth = 29.43    XLAp.Columns("F:F").ColumnWidth = 4.43    XLAp.Columns("G:G").ColumnWidth = 36.86    XLAp.Columns("H:T").ColumnWidth = 5.00    XLAp.Columns("U:U").ColumnWidth = 42.14    XLAp.Columns("V:V").ColumnWidth = 2.43       ' Выставляем параметры столбцов    XLAp.Range("D:D").Select    XLAp.Selection.HorizontalAlignment = -4108    XLAp.Selection.VerticalAlignment = -4108    XLAp.Selection.Font.Bold = True    XLAp.Selection.Font.Name = "Tahoma"    XLAp.Selection.Font.Size = 8       XLAp.Range("H:T").Select    XLAp.Selection.Font.Bold = True    XLAp.Selection.Font.Name = "Tahoma"    XLAp.Selection.Font.Size = 8    XLAp.Selection.HorizontalAlignment = -4108    XLAp.Selection.VerticalAlignment = -4108          ' Выставляем высоту ячеек    XLAp.Rows("1:1").RowHeight = 5.25    XLAp.Rows("2:2").RowHeight = 12.75    XLAp.Rows("3:3").RowHeight = 18.75    XLAp.Rows("7:7").RowHeight = 15.75    XLAp.Rows("4:6").RowHeight = 12.75    XLAp.Rows("10:10").RowHeight = 132.75       ' Задаем шрифт и высоту строк ячеек    XLAp.Rows("13:255").Select    XLAp.Selection.Font.Name = "Tahoma"    XLAp.Selection.Font.Size = 8    XLAp.Selection.RowHeight = 10.00          ' Обьединяем ячейки    XLAp.Range("B7:V7").Merge    XLAp.Range("B10:C10").Merge    XLAp.Range("F9:F10").Merge    XLAp.Range("B9:C10").Merge    XLAp.Range("D9:D10").Merge    XLAp.Range("E9:E10").Merge    XLAp.Range("H9:K9").Merge    XLAp.Range("L9:P9").Merge    XLAp.Range("Q9:Q10").Merge    XLAp.Range("R9:R10").Merge    XLAp.Range("S9:S10").Merge    XLAp.Range("T9:T10").Merge    XLAp.Range("U9:V10").Merge  

    ' Оформляем шапку таблицы       XLAp.Range("U2:U6").Select    With XLAp.Selection.Font        .Name = "Tahoma"        .Size = 10    End With    XLAp.Range("U2:U2").Select    XLAp.ActiveCell.FormulaR1C1 = "УТВЕРЖДАЮ"    XLAp.Range("U3:U3").Select    XLAp.ActiveCell.FormulaR1C1 = "__________________________________________"    XLAp.Range("U4:U4").Select    XLAp.ActiveCell.FormulaR1C1 = "__________________________________________"    XLAp.Range("U5:U5").Select    XLAp.ActiveCell.FormulaR1C1 = "__________________________________________"    XLAp.Range("U6:U6").Select    XLAp.ActiveCell.FormulaR1C1 = "__________________________________________"          ' Красим, заполняем шапку таблицы    XLAp.Range("B7:V7").Select    With XLAp.Selection.Font        .Bold = True        .Name = "Calibri"        .Size = 16    End With    XLAp.Selection.HorizontalAlignment = -4108    XLAp.Selection.VerticalAlignment = -4108    XLAp.ActiveCell.FormulaR1C1 = "Схема распределения прав пользователей в группах домена DOMEN.LOCAL"

    XLAp.Range("B9:V10").Select    XLAp.Selection.HorizontalAlignment = -4108    XLAp.Selection.VerticalAlignment = -4108    With XLAp.Selection.Font        .Bold = True        .Name = "Tahoma"        .Size = 8    End With    With XLAp.Selection.Borders        .LineStyle = 1        .Weight = -4138        End With    With XLAp.Selection.Interior        .ThemeColor = 1        .TintAndShade = -0.149998474074526    End With

    XLAp.Range("B10:C10").Select    XLAp.ActiveCell.FormulaR1C1 = "№"

    XLAp.Range("D9:D10").Select    XLAp.ActiveCell.FormulaR1C1 = "Название группы"

    XLAp.Range("E9:E10").Select    XLAp.Selection.Interior.Color = 14922893    XLAp.ActiveCell.FormulaR1C1 = "Название подгруппы (Англ.)"

    XLAp.Range("F9:F10").Select    XLAp.Selection.Orientation = -90    XLAp.Selection.Interior.Color = 14922893    XLAp.ActiveCell.FormulaR1C1 = " Основное место работы"

    XLAp.Range("G9:G9").Select    XLAp.Selection.Interior.Color = 14922893    XLAp.ActiveCell.FormulaR1C1 = "Название подгруппы (Рус.)"

    XLAp.Range("G10:G10").Select    XLAp.ActiveCell.FormulaR1C1 = "Название ресурса"

    XLAp.Range("H9:K9").Select    XLAp.Selection.Interior.Color = 10147522    XLAp.ActiveCell.FormulaR1C1 = "Project 2007"

    XLAp.Range("L9:P9").Select    XLAp.Selection.Interior.Color = 12106214    XLAp.ActiveCell.FormulaR1C1 = "Сервера"

    XLAp.Range("h20:h20").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Руководитель организации"

    XLAp.Range("I10:I10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Руководитель ресурсов"

    XLAp.Range("J10:J10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Руководитель проектов"

    XLAp.Range("K10:K10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Участник групп"

    XLAp.Range("L10:L10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "1С_User"

    XLAp.Range("M10:M10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Terminal_user"

    XLAp.Range("N10:N10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "VPN Доступ"

    XLAp.Range("O10:O10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Интернет"

    XLAp.Range("P10:P10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Почтовый ящик"

    XLAp.Range("Q9:Q10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Доступ к USB портам"

    XLAp.Range("R9:R10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Доступ к CD-RW"

    XLAp.Range("S9:S10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "Видеонаблюдение"

    XLAp.Range("T9:T10").Select    XLAp.Selection.Orientation = -90    XLAp.ActiveCell.FormulaR1C1 = "ПО `БАРЬЕР`"

    XLAp.Range("U9:V10").Select    XLAp.ActiveCell.FormulaR1C1 = "Примечание"'---------------------------------------------------------------------------------------

'Начинаем заполнять таблицу значениями из ADSet objGroup = GetObject("LDAP://CN=domen_all,OU=domen,DC=rdomen,DC=local")objGroup.GetInfoarrMemberOf = objGroup.GetEx("member")

' Перестановка значений массива    arMem0 = arrMemberOf(0)    arMem1 = arrMemberOf(1)    arMem2 = arrMemberOf(2)    arMem3 = arrMemberOf(3)    arrMemberOf(0) = arMem3    arrMemberOf(1) = arMem0    arrMemberOf(2) = arMem1    arrMemberOf(3) = arMem2

x = 12            ' Номер строки для вывода razdel = 1        ' Счетчик раздела для нумерации разделов в таблице BorderMainX = x ' Счетчик для выделения рамкой общей группы предприятияFor Each strMember in arrMemberOf'Рисуем строку с названием основной группы красным цветом    XLAp.Rows(x).RowHeight = 15.00    XLAp.Range("B"&x &":C"&x).Merge    XLAp.Range("E"&x &":V"&x).Merge    XLAp.Range("B"&x &":V"&x).Select    XLAp.Selection.Font.Bold = True    XLAp.Selection.Font.Name = "Tahoma"    XLAp.Selection.Font.Size = 8    XLAp.Selection.HorizontalAlignment = -4108    XLAp.Selection.VerticalAlignment = -4108    XLAp.Selection.Borders.LineStyle = 1    XLAp.Selection.Borders.Weight = -4138    XLAp.Selection.Interior.Color = 4671487    'Обрезаем лишнее    tmpv = instr(1,strMember,",") - 1    tmpv1 = left(strMember,tmpv)    tmpv2 = right(tmpv1, len(tmpv1) - 3)    DescGr = GetDescript(strMember)    XLAp.Cells(x, 2).Value = razdel    XLAp.Cells(x, 4).Value = tmpv2    XLAp.Cells(x, 5).Value = DescGr               ' Следующий вложенный цикл            Podrazdel1 = 1        ' Счетчик подраздела            Set objGroup2 = GetObject("LDAP://" & strMember)            objGroup2.GetInfo            arrMemberOf2 = objGroup2.GetEx("member")            Call quickSort( arrMemberOf2, 0, UBound( arrMemberOf2 ))                       For Each strMember2 in arrMemberOf2            x = x + 2            tmpv = instr(1,strMember2,",") - 1            tmpv1 = left(strMember2,tmpv)            tmpv2 = right(tmpv1, len(tmpv1) - 3)            ' Рисуем желтую ячейку            XLAp.Range("C"&x &":D"&x).Select            XLAp.Selection.NumberFormat = "@"            XLAp.Selection.Font.Bold = True            XLAp.Selection.HorizontalAlignment = -4108            XLAp.Selection.Borders.LineStyle = 1            XLAp.Selection.Borders.Weight = -4138            XLAp.Selection.Interior.Color = 65535            XLAp.Cells(x, 3).Value = razdel &"." &Podrazdel1                       XLAp.Cells(x, 4).Value = tmpv2                               ' Начинаем следующий вложенный цикл                    BorderPrazdelX = x +1     ' Записываем начальную координату х для рамки раздела                    Podrazdel2 = 1        ' Счетчик подраздела                    Set objGroup3 = GetObject("LDAP://" & strMember2)                    objGroup3.GetInfo                    arrMemberOf3 = objGroup3.GetEx("member")                    Call quickSort( arrMemberOf3, 0, UBound( arrMemberOf3 ))    'Сортировка                    For Each strMember3 in arrMemberOf3                    x = x + 1                    tmpv = instr(1,strMember3,",") - 1                    tmpv1 = left(strMember3,tmpv)                    tmpv2 = right(tmpv1, len(tmpv1) - 3)                    'Рисуем голубую ячейку                    XLAp.Range("D"&x &":U"&x).Select                    XLAp.Selection.NumberFormat = "@"                    XLAp.Selection.Font.Bold = True                    XLAp.Selection.Borders.LineStyle = 1                    XLAp.Selection.Borders.Weight = -4138                    XLAp.Selection.Interior.Color = 14922893                    XLAp.Cells(x, 4).Value = razdel &"." &Podrazdel1 &"." &Podrazdel2                    XLAp.Cells(x, 5).Value = tmpv2                    DescGr3 = GetDescript(strMember3)                    XLAp.Cells(x, 7).Value = DescGr3                    DescGr3 = ""                    'ProjectOrgDir проверка -----------------------------------                        strGp = "ProjectOrgDir"                        Set objADus = GetObject("LDAP://" & strMember3)                        If (IsMember(objADus, strGp) = True) Then                            XLAp.Cells(x, 8).Value = "V"                            End If                    'ProjectResManager проверка -----------------------------                        strGp = "ProjectResManager"                        Set objADus = GetObject("LDAP://" & strMember3)                        If (IsMember(objADus, strGp) = True) Then                            XLAp.Cells(x, 9).Value = "V"                            End If                    'ProjectManProect проверка ------------------------------                        strGp = "ProjectManProect"                        Set objADus = GetObject("LDAP://" & strMember3)                        If (IsMember(objADus, strGp) = True) Then                            XLAp.Cells(x, 10).Value = "V"                            End If                    'ProjectUsers проверка -----------------------------------                        strGp = "ProjectUsers"                        Set objADus = GetObject("LDAP://" & strMember3)                        If (IsMember(objADus, strGp) = True) Then                            XLAp.Cells(x, 11).Value = "V"                            End If                        '1C_user проверка -----------------------------------                        strGp = "1C_user"                        Set objADus = GetObject("LDAP://" & strMember3)                        If (IsMember(objADus, strGp) = True) Then                            XLAp.Cells(x, 12).Value = "V"                            End If                        'Terminal_user проверка------------------------------                        strGp = "Terminal_user"                        Set objADus = GetObject("LDAP://" & strMember3)                        If (IsMember(objADus, strGp) = True) Then                            XLAp.Cells(x, 13).Value = "V"                            End If                        'Inet_User проверка ---------------------------------                        strGp = "internet_user"                        Set objADus = GetObject("LDAP://" & strMember3)                        If (IsMember(objADus, strGp) = True) Then                            XLAp.Cells(x, 15).Value = "V"                            End If

                            ' Начинаем следующий вложенный цикл, который выводит пользователей                            Set objGroup4 = GetObject("LDAP://" & strMember3)                            objGroup4.GetInfo                            On Error Resume Next                            'If Not (IsNull(objGroup4.GetInfo)) then                            arrMemberOf4 = objGroup4.GetEx("member")                            If Err.Number <> E_ADS_PROPERTY_NOT_FOUND Then

                                'XLAp.Cells(x, 25).Value = arrMemberOf4(0)                                Call quickSort( arrMemberOf4, 0, UBound( arrMemberOf4 ))    ' Сортировка                                For Each strMember4 in arrMemberOf4                                x = x + 1                                tmpv = instr(1,strMember4,",") - 1                                tmpv1 = left(strMember4,tmpv)                                tmpv2 = right(tmpv1, len(tmpv1) - 3)                                XLAp.Range("F"&x &":U"&x).Select                                XLAp.Selection.Borders.LineStyle = 1                                XLAp.Range("F"&x &":G"&x).Select                                If DisabledAkk(strMember4) Then                               'Выделяем красным отключенных пользователей                                    XLAp.Selection.Interior.Color = 4671487                                End If                                UsEmail = GetEmail(strMember4)                                XLAp.Cells(x, 21).Value = UsEmail                                UsEmail = ""                            XLAp.Cells(x, 7).Value = tmpv2                                                       'ProjectOrgDir проверка ----------------------------                            strGp = "ProjectOrgDir"                            Set objADus = GetObject("LDAP://" & strMember3)                            If (IsMember(objADus, strGp) = True) Then                                XLAp.Cells(x, 8).Value = "V"                            End If                            'ProjectResManager проверка ----------------------                            strGp = "ProjectResManager"                            Set objADus = GetObject("LDAP://" & strMember3)                            If (IsMember(objADus, strGp) = True) Then                                XLAp.Cells(x, 9).Value = "V"                            End If                            'ProjectManProect проверка ------------------------                            strGp = "ProjectManProect"                            Set objADus = GetObject("LDAP://" & strMember3)                            If (IsMember(objADus, strGp) = True) Then                                XLAp.Cells(x, 10).Value = "V"                            End If                            'ProjectUsers проверка -----------------------------                            strGp = "ProjectUsers"                            Set objADus = GetObject("LDAP://" & strMember4)                            If (IsMember(objADus, strGp) = True) Then                                XLAp.Cells(x, 11).Value = "V"                            End If                            '1C_user проверка ----------------------------------                            strGp = "1C_user"                            Set objADus = GetObject("LDAP://" & strMember4)                            If (IsMember(objADus, strGp) = True) Then                                XLAp.Cells(x, 12).Value = "V"                            End If                            'Terminal_user проверка ----------------------------                            strGp = "Terminal_user"                            Set objADus = GetObject("LDAP://" & strMember4)                            If (IsMember(objADus, strGp) = True) Then                                XLAp.Cells(x, 13).Value = "V"                            End If                            'VPN_user проверка --------------------------------                            strGp = "VPN_user"                            Set objADus = GetObject("LDAP://" & strMember4)                            If (IsMember(objADus, strGp) = True) Then                                XLAp.Cells(x, 14).Value = "V"                            End If                            'Inet_User проверка --------------------------------                            strGp = "internet_user"                            Set objADus = GetObject("LDAP://" & strMember4)                            If (IsMember(objADus, strGp) = True) Then                                XLAp.Cells(x, 15).Value = "V"                            End If                            '----------------------------------------------------                            XLAp.Range("H"&x &":K"&x).Select                            XLAp.Selection.Interior.Color = 10147522                            XLAp.Range("L"&x &":P"&x).Select                            XLAp.Selection.Interior.Color = 12106214                                Next                                arrMemberOf4 =""    ' сбрасываем в ноль для предотвращения повторений                        End If                      Podrazdel2 = Podrazdel2 + 1                    ' Выделяем рамкой раздел                     XLAp.Range("D"&BorderPrazdelX &":U"&x).Select                    BigBorder                    XLAp.Range("E"&BorderPrazdelX &":E"&x).Select                    BigBorder                    XLAp.Range("G"&BorderPrazdelX &":G"&x).Select                    BigBorder                    XLAp.Range("F"&BorderPrazdelX &":F"&x).Select                    BigBorder                    XLAp.Range("H"&BorderPrazdelX &":K"&x).Select                    BigBorder                    XLAp.Range("L"&BorderPrazdelX &":P"&x).Select                    BigBorder                    XLAp.Range("Q"&BorderPrazdelX &":T"&x).Select                    BigBorder                    Next                Podrazdel1 = Podrazdel1 + 1            Next

    razdel = razdel + 1    XLAp.Range("B"&BorderMainX &":V"&x+1).Select 'Рисуем рамку главной группы    BigBorder    x = x + 3    ' Делаем отступ для следующей группы   BorderMainX = xNext

Function BigBorder()' Функция выделения раздела рамкой    XLAp.Selection.Borders(5).LineStyle = -4142                    XLAp.Selection.Borders(6).LineStyle = -4142                    With XLAp.Selection.Borders(7)                    .LineStyle = 1                    .ColorIndex = 0                    .TintAndShade = 0                    .Weight = -4138                    End With                    With XLAp.Selection.Borders(8)                    .LineStyle = 1                    .ColorIndex = 0                    .TintAndShade = 0                    .Weight = -4138                    End With                    With XLAp.Selection.Borders(9)                    .LineStyle = 1                    .ColorIndex = 0                    .TintAndShade = 0                    .Weight = -4138                    End With                    With XLAp.Selection.Borders(10)                    .LineStyle = 1                    .ColorIndex = 0                    .TintAndShade = 0                    .Weight = -4138                    End WithEnd Function

Function GetDescript(LdpAd)' Функция возврата текстового поля description группы    Set oGroup = GetObject ("LDAP://" & LdpAd)    GetDescript = oGroup.DescriptionEnd Function

Function GetEmail(LdpAd)' Функция возврата текстового поля  группы    On Error Resume Next    Set oGroup = GetObject ("LDAP://" & LdpAd)    GetEmail = oGroup.EmailAddress    Err.ClearEnd Function

Function DisabledAkk(LdpAd)' Функция проверки отключен ли аккаунт     Set oGroup = GetObject ("LDAP://" & LdpAd)    DisabledAkk = oGroup.AccountDisabledEnd Function'--------------------------------------------------------------------------------Function splitArray(anArray, leftBound, rightBound)            ' Сортировка массива            Dim leftValue, rightValue, pivotValue, pivot, left, right            left = leftBound            pivot = left            right = rightBound            pivotValue = anArray( pivot )

            Do while left < right                rightValue = anArray( right )                Do while pivotValue <= rightValue and left < right                    right = right - 1                    rightValue = anArray( right )                Loop                anArray( left ) = rightValue

                leftValue = anArray( left )                Do while pivotValue > leftValue and left < right                    left = left + 1                    leftValue = anArray( left )                Loop                anArray( right ) = leftValue            Loop

            anArray( left ) = pivotValue            splitArray = left        End function

        ' собственно сортировка        Function quickSort(anArray, leftBound, rightBound)            Dim splitIndex, left, right            left = leftBound            right = rightBound            If ( left < right ) then                splitIndex = splitArray( anArray, left, Right )                Call quickSort( anArray, left, splitIndex - 1 )                Call quickSort( anArray, splitIndex + 1, right )            End if        End Function

'------------------------------------------------------------Function IsMember(ByVal objADObject, ByVal strGroup)    ' Function to test for group membership.    ' objADObject is a user or computer object.    ' strGroup is the NT name (sAMAccountName) of the group to test.    ' objGroupList is a dictionary object, with global scope.    ' Returns True if the user or computer is a member of the group.    ' Subroutine LoadGroups is called once for each different objADObject.

    If (IsEmpty(objGroupList) = True) Then        Set objGroupList = CreateObject("Scripting.Dictionary")        objGroupList.CompareMode = vbTextCompare        Call LoadGroups(objADObject)    End If    If (objGroupList.Exists(objADObject.sAMAccountName & "\") = False) Then        Call LoadGroups(objADObject)    End If    IsMember = objGroupList.Exists(objADObject.sAMAccountName & "\" _        & strGroup)End Function

Sub LoadGroups(ByVal objADObject)    ' Subroutine to populate dictionary object with group memberships.    ' objGroupList is a dictionary object, with global scope. It keeps track    ' of group memberships for each user or computer separately.

    Dim arrbytGroups, j    Dim arrstrGroupSids(), objGroup

    objGroupList.Add objADObject.sAMAccountName & "\", True

    objADObject.GetInfoEx Array("tokenGroups"), 0    arrbytGroups = objADObject.Get("tokenGroups")    If (TypeName(arrbytGroups) = "Byte()") Then        ReDim arrstrGroupSids(0)        arrstrGroupSids(0) = OctetToHexStr(arrbytGroups)        Set objGroup = GetObject("LDAP://<SID=" & arrstrGroupSids(0) _            & ">")        objGroupList.Add objADObject.sAMAccountName & "\" _            & objGroup.sAMAccountName, True        Exit Sub    End If    If (UBound(arrbytGroups) = -1) Then        Exit Sub    End If

    ReDim arrstrGroupSids(UBound(arrbytGroups))    For j = 0 To UBound(arrbytGroups)        arrstrGroupSids(j) = OctetToHexStr(arrbytGroups(j))        Set objGroup = GetObject("LDAP://<SID=" & arrstrGroupSids(j) _            & ">")        objGroupList.Add objADObject.sAMAccountName & "\" _            & objGroup.sAMAccountName, True    Next

End Sub

Function OctetToHexStr(ByVal arrbytOctet)    ' Function to convert OctetString (byte array) to Hex string.

    Dim k    OctetToHexStr = ""    For k = 1 To Lenb(arrbytOctet)        OctetToHexStr = OctetToHexStr _            & Right("0" & Hex(Ascb(Midb(arrbytOctet, k, 1))), 2)    NextEnd Function

'------------------------------------------------------------------

В результате выполнения скрипта имеем документ в EXCEL, который сразу можно отправлять на принтер:

Некоторые особенности:1) Значение некоторых свойств и методов можно подсмотреть в режиме записи макроса (т.е. записать макрос и посмотреть какие свойства и методы применяются).2) Для запуска скрипта в системе должен быть установлен принтер и компьютер, на котором запускается скрипт, должен быть в домене Active Directory.

daydevnull.blogspot.com

Как в VBA скрипт для excel вставить проверку по регулярному выражению? — Toster.ru

Всем привет. Пожалуй перейду сразу в общем имеется скрипт (писал не я, помогли) который по определенному признаку (коды оператора, которые указаны в массиве) отделяет мобильные номера в таблице от городских. Скрипт работает отлично, но так как он опирается на скобки возле кода (050), иногда случаются ложные срабатывания. Я хотел бы попросить помощи у тех кто разбирается в VBA, помогите пожалуйста переделать скрипт так, что бы он детектировал номера не по скобочкам, а по следующему регулярному выражению:\b\(?(039|050|063|066|067|068|091|092|093|094|095|096|097|098|099)\)?\s?\-?\d{3}\s?\-?\d{2}\s?\-?\d{2}\b Единственное, я не совсем уверен в верности регулярки, кажется я ошибся с окончанием строки (\b).

Сам скрипт:

Public Sub QWERT() Dim R, C, i Dim OD: Set OD = CreateObject("Scripting.Dictionary") Dim T: Set T = CreateObject("Scripting.Dictionary") Dim M(), RZ(), U() As String Dim MB M = Array(39, 50, 63, 66, 67, 68, 91, 92, 93, 94, 95, 96, 97, 98, 99) 'закидываем в словарь префиксы For R = 0 To UBound(M) T("(0" & M(R) & ")") = 1 Next R 'считываем в маассив данные With Ëèñò1 M = .Range("A1:G" & .Cells(.Rows.Count, 1).End(xlUp).Row) End With ReDim RZ(1 To UBound(M), 1 To UBound(M, 2) + 2) 'перебираем все строки массива For R = 1 To UBound(M) ' отделяеем название фирмы If InStr(1, M(R, 1), ",") > 0 Then C = Split(M(R, 1), ",")(0) RZ(R, 1) = C RZ(R, 2) = Replace(M(R, 1), C & ",", "") Else RZ(R, 1) = M(R, 1) End If RZ(R, 3) = M(R, 2) ' ищем мобильные операторы U = Split(M(R, 3), ",") For i = 0 To UBound(U) Debug.Print i, UBound(U), U(i), R If T.Exists(Left(U(i), 5)) Then RZ(R, 4) = IIf(RZ(R, 4) = "", U(i), RZ(R, 4) & "," & U(i)) Else RZ(R, 5) = IIf(RZ(R, 5) = "", U(i), RZ(R, 5) & "," & U(i)) End If Next i For i = 4 To UBound(M, 2) RZ(R, i + 2) = M(R, i) Next i Next R Worksheets.Add Range("A1").Resize(UBound(RZ), UBound(RZ, 2)) = RZ Cells.Columns.AutoFit Cells.Rows.AutoFit End Sub

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

Большое спасибо.

toster.ru

Трюки Excel — MS Excel

Хотя сайт разделен на разделы, перечисленные ниже, вы можете работать с ним разными способами. Один подход заключается в том, чтобы считать сайт набором инструментов и начинать со знакомства с ними в каждом разделе. Затем, если возникает необходимость или проблема, вы просто сможете применить подходящее делу средство. А можно и пролистать разделы или прочитать его статьи от корки до корки, изучая процедуры и скрипты и все больше узнавая Excel. Некоторые из трюков этим и хороши, содержа объяснения сложных тем или хорошо документированные скрипты. Помимо этого, можно просто выбрать один раздел и посмотреть, что в нем полезного для текущей ситуации, а что может пригодиться в будущем.

Упрощение рабочих книг и листов

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

Перейти к разделу

Трюки со встроенными возможностями Excel

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

Перейти к разделу

Трюки с именованием

Хотя ссылки на ячейки вида А2 и IV284:IN1237 определенно бывают полезны, с увеличением электронных таблиц становится проще ссылаться на информацию по имени. Эти трюки демонстрируют не только, как именовать ячейки и диапазоны, но и как создавать имена, приспособленные к данным таблицы.

Перейти к разделу

Трюки со сводными таблицами

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

Перейти к разделу

Трюки с диаграммами

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

Перейти к разделу

Трюки с формулами и функциями

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

Перейти к разделу

Трюки с макросами

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

Перейти к разделу

excel2010.ru