14 готови макросa за Ексел

1 одобрение 0 неодобрения
попитан 2017 септември 20 в VBA от BgExcelAdmin цар (651 точки) 1 флаг

В този урок ще ви представим как бързо и лесно можете да използвате програмния език VBA (Visual Basic For Application), чрез който да разширите възможностите на Ексел и Майкрософт Офис според конкретните ви нужди и осезаемо да подобрите ефективността си при работа със софтуера. Не е необходимо да имате опит в програмирането, за да се възползвате от информацията в тази статия, но се очаква да имате основни познания по Ексел. Ако сте начинаещи, ви препоръчваме първо да прочетете статията: „11 формули на Ексел, които да започнете да използвате сега", за да се запознаете с основните функционалности на Ексел.

Подготвили сме ви няколко готови макроса с огромна функционалност, които можете да ползвате наготово, за да оптимизирате работата си. За да ги ползвате трябва само да ги инсталирате във вашия екселски файл. Следващия параграф информира читателя как се инсталира макрос в Ексел. Пропуснете тази част, ако вече знаете как се прави това.

Как се инсталира макрос?

В Ексел, натиснете клавишната комбинация alt + F11. Това ще ви отведе във VBA едитора на Ексел. После, от лявата страна натискаш с десен бутон върху папката Microsoft Excel Objects  и избираш Insert => Module. Това е мястото, където се поставят макросите. За да направите екселския файл macro-enabled трябва да го запаметите като такъв. От таба file => save as избирате save as macro-enabled workbook (с разширение .xlsm) Време е да напишем първия си макрос!

1.  Копиране на данни от един файл в друг.

Това макро е много полезно, тъй като показва как може да копирате рейндж от данни във vba и как се създават и наименоват нови екселски файлове (workbooks). Можете да го надградите според нуждите ви:

Sub CopyFiletoAnotherWorkbook()
'Copy the data
    Sheets("Example 1").Range("B4:C15").Copy
'Create a new workbook
    Workbooks.Add
'Paste the data
    ActiveSheet.Paste
'Turn off application alerts
    Application.DisplayAlerts = False
'Save the newly file. Change the name of the directory.
    ActiveWorkbook.SaveAs Filename:="C:\Temp\MyNewBook.xlsx"
'Turn application alerts back on
    Application.DisplayAlerts = True
End Sub

2. Показване на скрити редове

Понякога Екселските файлове съдържат скрити редове за по-добра прегледност. Ето макро, което ще покаже всички редове в активния лист:

Sub ShowHiddenRows()
Columns.EntireColumn.Hidden = False
Rows.EntireRow.Hidden = False
End Sub

3. Изтриване на празни редове и колони

Празните редове в Ексел са проблем при обработката на данни. Ето как да се избавим от тях!

Sub DeleteEmptyRowsAndColumns()

'Declare your variables.
    Dim MyRange As Range
    Dim iCounter As Long
'Define the target Range.
    Set MyRange = ActiveSheet.UsedRange
    'Start reverse looping through the range of Rows.
    For iCounter = MyRange.Rows.Count To 1 Step -1
'If entire row is empty then delete it.
       If Application.CountA(Rows(iCounter).EntireRow) = 0 Then
       Rows(iCounter).Delete
       'Remove comment to See which are the empty rows
       'MsgBox "row " & iCounter & " is empty"
       End If
'Increment the counter down
    Next iCounter
'Step 6:  Start reverse looping through the range of Columns.
    For iCounter = MyRange.Columns.Count To 1 Step -1
'Step 7: If entire column is empty then delete it.
       If Application.CountA(Columns(iCounter).EntireColumn) = 0 Then
       Columns(iCounter).Delete
       End If
'Step 8: Increment the counter down
    Next iCounter
    
End Sub

4. Намиране на празна клетка

Sub FindEmptyCell()
ActiveCell.Offset(1, 0).Select
   Do While Not IsEmpty(ActiveCell)
      ActiveCell.Offset(1, 0).Select
   Loop
End Sub

5. Сортиране на числа

Следното макро сортира числа от дадена колона във възходящ ред при двойно щракване. Поставете го в Sheet 1, а не в модул, за да работи:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Declare your Variables
    Dim LastRow As Long
'Find last row
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
'Sort ascending on double-clicked column
    Rows("6:" & LastRow).Sort _
    Key1:=Cells(6, ActiveCell.Column), _
    Order1:=xlAscending
End Sub

6. Премахване на празни места

Понякога данните в ексел съдържат в себе си допълнителни празни места (спейсове), които могат да попречат на анализа на данни и употребата на формули. Ето макро, което премахва всички празни места между данните, които са предварително избрани с мишката:

Sub TrimTheSpaces()
'Declare your variables
    Dim MyRange As Range
    Dim MyCell As Range
'Save the Workbook before changing cells
    Select Case MsgBox("Can't Undo this action.  " & _
                        "Save Workbook First?", vbYesNoCancel)
        Case Is = vbYes
        ThisWorkbook.Save
        Case Is = vbCancel
        Exit Sub
    End Select
'Define the target Range.
    Set MyRange = Selection
'Start looping through the range.
    For Each MyCell In MyRange
'Trim the Spaces.
    If Not IsEmpty(MyCell) Then
    MyCell = Trim(MyCell)
    End If
'Get the next cell in the range
    Next MyCell
End Sub

7. Заменяне на празни клетки от няколко колони със стойност.

Както споменахме преди, празните клетки пречат на обработката на данни и създаването на пивот таблици. Ето код, с който празните стойности се заменят с 0. Това макро има много голямо приложение, защото можете аналогично да премахнете N/А резултати, както и да локализирате и замените други знаци като точки, запетайки, двуеточия и пр.

Sub FindAndReplace()

'Declare your variables
    Dim MyRange As Range
    Dim MyCell As Range

'Save the Workbook before changing cells?
    Select Case MsgBox("Can't Undo this action.  " & _
                        "Save Workbook First?", vbYesNoCancel)
        Case Is = vbYes
        ThisWorkbook.Save
        Case Is = vbCancel
        Exit Sub
    End Select
'Define the target Range.
    Set MyRange = Selection
'Start looping through the range.
    For Each MyCell In MyRange
'Check for zero length then add 0.
    If Len(MyCell.Value) = 0 Then
    MyCell = 0
    End If
'Get the next cell in the range
    Next MyCell
End Sub

8. Оцветяване на повтарящи се стойности от няколко колони

Понякога има дублиращи се стойности в няколко колони, които искаме да осветлим. Ето макро, което прави тъкмо това:

Sub HighlightDuplicates()

'Declare your variables
    Dim MyRange As Range
    Dim MyCell As Range
'Define the target Range.
    Set MyRange = Selection 
'Start looping through the range.
    For Each MyCell In MyRange 
'Ensure the cell has Text formatting.
    If WorksheetFunction.CountIf(MyRange, MyCell.Value) > 1 Then
    MyCell.Interior.ColorIndex = 36
    End If
'Get the next cell in the range
    Next MyCell
End Sub

9. Създаване на пивот таблица

Макрото може да бъде използвано за генериране на пивот таблици. Особено полезно, ако често правите еднакъв тип пивот таблици. С малко надстройване би могъл да се автоматизира целия процес по създаване на пивот таблица.

Sub PivotTableForExcel2007()
Dim SourceRange As Range
Set SourceRange = Sheets("Sheet1").Range("A3:N86")
ActiveWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=SourceRange, _
Version:=xlPivotTableVersion12).CreatePivotTable _
TableDestination:="", _
TableName:="", _
DefaultVersion:=xlPivotTableVersion12
End Sub

10. Автоматично изпращане на имейл с прикачен екселски файл

Любимото ми макро. Дава възможност да прикачите и изпратите файла, с който работите на предварително зададен от вас имейл адрес, заглавие на съобщението и шаблонен текст!

Sub SendFIleAsAttachment()
'Declare your variables
'Set reference to Microsoft Outlook Object library
    Dim OLApp As Outlook.Application
    Dim OLMail As Object
'Open Outlook start a new mail item
    Set OLApp = New Outlook.Application
    Set OLMail = OLApp.CreateItem(0)
    OLApp.Session.Logon  
'Build your mail item and send
    With OLMail
    .To = "[email protected]; [email protected]"
    .CC = ""
    .BCC = ""
    .Subject = "This is the Subject line"
    .Body = "Hi there"
    .Attachments.Add ActiveWorkbook.FullName
    .Display  'Change to .Send to send without reviewing
    End With
'Memory cleanup
    Set OLMail = Nothing
    Set OLApp = Nothing

End Sub

11. Изпращане на всички екселски графики от един файл в PowerPoint презентация

Sub SendExcelFiguresToPowerPoint()
'Set reference to Microsoft Powerpoint Object Library
'Declare your variables
    Dim PP As PowerPoint.Application
    Dim PPPres As PowerPoint.Presentation
    Dim PPSlide As PowerPoint.Slide
    Dim i As Integer
'Check for charts; exit if no charts exist
    Sheets("Slide Data").Select
    If ActiveSheet.ChartObjects.Count < 1 Then
    MsgBox "No charts existing the active sheet"
    Exit Sub
    End If
'Open PowerPoint and create new presentation
    Set PP = New PowerPoint.Application
    Set PPPres = PP.Presentations.Add
    PP.Visible = True
'Start the loop based on chart count
    For i = 1 To ActiveSheet.ChartObjects.Count
'Copy the chart as a picture
    ActiveSheet.ChartObjects(i).Chart.CopyPicture _
    Size:=xlScreen, Format:=xlPicture
    Application.Wait (Now + TimeValue("0:00:1"))
'Count slides and add new slide as next available slide number
    ppSlideCount = PPPres.Slides.Count
    Set PPSlide = PPPres.Slides.Add(SlideCount + 1, ppLayoutBlank)
    PPSlide.Select
'Paste the picture and adjust its position; Go to next chart
    PPSlide.Shapes.Paste.Select
    PP.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, True
    PP.ActiveWindow.Selection.ShapeRange.Align msoAlignMiddles, True
    Next i
'Memory Cleanup
    Set PPSlide = Nothing
    Set PPPres = Nothing
    Set PP = Nothing
End Sub

12. Изпращане на екселска таблица в word

Sub ExcelTableInWord()

'Set reference to Microsoft Word Object library
'Declare your variables
    Dim MyRange As Excel.Range
    Dim wd As Word.Application
    Dim wdDoc As Word.Document
    Dim WdRange As Word.Range
'Copy the defined range
   Sheets("Revenue Table").Range("B4:F10").Cop
'Open the target Word document
    Set wd = New Word.Application
    Set wdDoc = wd.Documents.Open _
    (ThisWorkbook.Path & "\" & "PasteTable.docx")
    wd.Visible = True
'Set focus on the target bookmark
    Set WdRange = wdDoc.Bookmarks("DataTableHere").Rangе
'Delete the old table and paste new
    On Error Resume Next
    WdRange.Tables(1).Delete
    WdRange.Paste 'paste in the table   
'Adjust column widths
    WdRange.Tables(1).Columns.SetWidth _
    (MyRange.Width / MyRange.Columns.Count), wdAdjustSameWidth
'Reinsert the bookmark
    wdDoc.Bookmarks.Add "DataTableHere", WdRange
'Memory cleanup
    Set wd = Nothing
    Set wdDoc = Nothing
    Set WdRange = Nothing

End Sub

13. Изкарване на отделна дума от текст в една клетка

Можем да използваме формули, ако искаме да извадим определен брой символи. Но какво става, ако искаме да извадим само втората дума или число от текст с думи и символи в една клетка? За целта можем да създадем своя собствена функция чрез VBA, която да върши това. Нека създадем две функции: findword и findwordrev. Ето кода във vba:

Function FindWord(Source As String, Position As Integer) As String
  On Error Resume Next
  FindWord = Split(WorksheetFunction.Trim(Source), " ")(Position - 1)
  On Error GoTo 0
End Function

Function FindWordRev(Source As String, Position As Integer) As String
  Dim Arr() As String
  Arr = VBA.Split(WorksheetFunction.Trim(Source), " ")
  On Error Resume Next
  FindWordRev = Arr(UBound(Arr) - Position + 1)
  On Error GoTo 0
End Function

Току що създадохме две нови функции в Ексел. Функцията =FindWordRev(A1,1) изкарва последната дума от клетка A1. Функцията =FindWord(A1,3) изкарва третата дума от клетка A1 И т.н.

14. Забрана за променяне на текста в eкселския файл

Понякога искаме да защитим данните във файла, така че само ние да можем да ги променяме. Ето как може да стане това с VBA:

Sub ProtectSheets()

'Declare your variables
    Dim ws As Worksheet
'Start looping through all worksheets
    For Each ws In ActiveWorkbook.Worksheets
'Protect and loop to next worksheet
    ws.Protect Password:="1234"
    Next ws
 
End Sub

Моля влезте или се регистрирайте за да отговорите на този въпрос.

Добре дошли в българския форум за Ексел и Майкрософт офис! Тук можете да питате хора със знания и опит, както и да споделите знанията и опита си с другите.
...