2015-07-28 2 views
3

Я пытаюсь добавить кнопку в книгу Excel, чтобы она отображалась на каждом листе. Отличный ответ на мой первоначальный вопрос дал мне макрос для создания кнопок на каждом листе:Как добавить командную кнопку в VBA?

Sub AddButtons() 
    Dim ws As Excel.Worksheet 
    Dim btn As Button 

    For Each ws In ThisWorkbook.Worksheets 
     Set btn = ws.Buttons.Add(X, Y, W, H) 
     [set btn properties] 
    Next ws 
End Sub 

Я теперь возникают проблемы с установкой свойств кнопки, так что кнопка печатает лист при нажатии. Опять же здесь моя печать макрос:

Dim WS_Count As Integer 
Dim i As Integer 

' Set WS_Count equal to the number of worksheets in the active workbook. 
WS_Count = ActiveWorkbook.Worksheets.Count 
'allows user to set printer they want to use 
Application.Dialogs(xlDialogPrinterSetup).Show 
' Begin the loop. 
For i = 5 To WS_Count 
    Worksheets(i).Activate 
    With ActiveWorkbook.Worksheets(i).PageSetup 
    .PrintArea = "A1:O48" 
    .Orientation = xlLandscape 
    .Zoom = False 
    .FitToPagesTall = 1 
    .FitToPagesWide = 1 
    End With 
    ActiveWorkbook.Worksheets(i).PrintOut 

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

Последнее, что я пытаюсь изменить код кнопки, чтобы он только добавлял кнопки на лист 5 вперед. Было бы здорово, если бы кто-нибудь знал, как это сделать?

Любой совет полезен и ценится!

ответ

4

Попробуйте это:

Sub AddButtons() 
    Dim ws As Excel.Worksheet 
    Dim btn As Button 

    For Each ws In ThisWorkbook.Worksheets 
     Set btn = ws.Buttons.Add(X, Y, W, H) 
     btn.OnAction = "MySub" ' MySub is executed when btn is clicked 
     ' Substitute the name of your printing subroutine 
     btn.Caption = "Print" 
     'set additional btn properties as needed 
    Next ws 
End Sub 

X и Y определения местоположения, W и H определить размер кнопки.

+0

Спасибо! Это добавило кнопку на каждую страницу! Когда я добавляю свойства кнопки, могу ли я просто поместить свой код печати vba или есть способ установить код, чтобы он включался только при нажатии? – Cam

+1

@Cam вы должны создать новый Sub и иметь этот суб, содержащий ваш код для печати. Sub должен требовать переменную, вызываемую при нажатии кнопки (поиск информации о передаче переменных в подсистемы). Затем в каждой кнопке есть код «Вызовите MyPrintSub (BUTTON_VARIABLE)». И тогда вам не нужно будет копировать код с каждой кнопки по отдельности, вам просто нужно вызвать суб-кнопку с каждой кнопки. Это упростит редактирование для всех кнопок. –

+0

Извините, я довольно новичок в VBA и кодировании, и я думаю, что вы говорите, имеет смысл, но я не понимаю, как реализовать. У вас есть примеры кода для этого[email protected] Grade'Eh'Bacon – Cam

0

Это добавит кнопку (контроль формы) и назначит ей существующий макрос.

Sub test() 
    Dim cb As Shape 
    Set cb = Sheet1.Shapes.AddFormControl(xlButtonControl, 10, 10, 100, 25) 
    cb.OnAction = "PrintMacro" 
End Sub 

Private Sub PrintMacro() 
    MsgBox "Test" ' for testing pursposes 
    ' you actually put your print code here 
End Sub 

Теперь, чтобы добавить кнопки из листа 5 года только, вы можете попробовать:

  1. Производство список всех имен листов (если есть только несколько из них)

    Dim shname 
    For Each shname In Array("Sheet 5", "Sheet 6", "Sheet 7") 
        test Sheets(shname) ' note that you'll have to use below test sub 
    Next 
    
  2. Сделайте это наоборот. Составьте список того, что следует исключать и проверять каждый лист, если он есть в списке или нет.

    Dim sh As Worksheet 
    Dim xcludesheet: xcludesheet = Array("Sheet1", "Sheet2", "Sheet3", "Sheet4") 
    For Each sh In Worksheets 
        If IsError(Application.Match(sh.Name, xcludesheet, 0)) Then 
         test Sheets(sh.Name) 
        End If 
    Next 
    

Ваш тест суб для использования в указанных выше образцов.

Sub test(ws As Worksheet) 
    Dim cb As Shape 
    Set cb = ws.Shapes.AddFormControl(xlButtonControl, 10, 10, 100, 25) 
    cb.OnAction = "PrintMacro" 
End Sub 
Смежные вопросы