How to add a new spreadsheet with VBA-Code, using VBA

后端 未结 3 1675
情歌与酒
情歌与酒 2021-01-03 01:36

I am creating a macro and part of the macros function is to make VBA create a new spreadsheet. Because of the nature of distribution the name will change. I need to add code

相关标签:
3条回答
  • 2021-01-03 01:59

    Jook has already explained how it works. I will take it a step further.

    The syntax of adding a worksheet is

    expression.Add(Before, After, Count, Type)
    

    If you check inbuilt Excel's help then you can see what Before, After, Count, Type stands for

    FROM EXCEL"S HELP

    Parameters (All 4 parameters are Optional)

    1. Before - An object that specifies the sheet before which the new sheet is added.
    2. After - An object that specifies the sheet after which the new sheet is added.
    3. Count - The number of sheets to be added. The default value is one.
    4. Type - Specifies the sheet type. Can be one of the following XlSheetType constants: xlWorksheet, xlChart, xlExcel4MacroSheet, or xlExcel4IntlMacroSheet. If you are inserting a sheet based on an existing template, specify the path to the template. The default value is xlWorksheet.

    Once the sheet is created then you need to use .insertlines to create the relevant procedure and to also embed the code that you want to run.

    NOTE - IMP: If you want the code to embed code in the VBA project, you need to ensure that you have "Trust Access to the VBA Project Object Model" selected. See snapshot.

    enter image description here

    Here is an example where I am creating a sheet and then embedding a Worksheet_SelectionChange Code which will display a message "Hello World"

    CODE - TRIED AND TESTED

    Option Explicit
    
    Sub Sample()
        Dim ws As Worksheet
        Dim nLines As Long
        Dim VBP As Object, VBC As Object, CM As Object
        Dim strProcName As String
    
        Set ws = Worksheets.Add
    
        Set VBP = ThisWorkbook.VBProject
        Set VBC = VBP.VBComponents(ws.Name)
        Set CM = VBC.CodeModule
    
        strProcName = "Worksheet_SelectionChange"
    
        With ThisWorkbook.VBProject.VBComponents( _
        ThisWorkbook.Worksheets(ws.Name).CodeName).CodeModule
            .InsertLines Line:=.CreateEventProc("SelectionChange", "Worksheet") + 1, _
            String:=vbCrLf & _
            "    Msgbox ""Hello World!"""
        End With
    End Sub
    

    This is how the new sheet code area looks once you run the above code.

    enter image description here

    0 讨论(0)
  • 2021-01-03 02:04

    The default .Add method adds a sheet at the start of the list. Often you want to add it at the end before adding the code lines, as explained by Siddarth Rout. To do that anywhere you can use:

        ActiveWorkbook.Worksheets.ADD  After:=ActiveWorkbook.Sheets(ActiveWorkbook.Worksheets.Count)
    

    It is easier to read if you have defined and set WB:

      Dim WB as Excel.workbook
      Set WB = ActiveWorkbook
          WB.Sheets.ADD  After:=WB.Sheets(WB.Sheets.Count)
          Set VBC = ActiveSheet     'If using in Siddarth Rout's code above
    

    Sheets and Worksheets are interchangeable, as illustrated.

    0 讨论(0)
  • 2021-01-03 02:09

    the following code will add you a spreadsheet.

    Public Sub Workbook_Add()
     Dim wks As Worksheet
     Set wks = ThisWorkbook.Worksheets.Add(, , 1, xlWorksheet)
     With wks
       'set codename of wks
       ThisWorkbook.VBProject.VBComponents(.CodeName).Name = "tblWhatever"
       'set tablename of wks
       .Name = "whatever"
       'add code (untested demo)
       'ThisWorkbook.VBProject.VBComponents(.CodeName).CodeModule.InsertLines 1, "Option Explicit"
       'add code (as of example from excel-help)
       'Application.VBE.CodePanes(1).CodeModule.InsertLines 1, "Option Explicit"
     End With
    End Sub
    

    If you need to add VBA-Code to this specific spreadsheet, you should further inspect the VBProject object - look for CodeModule and then i.e. InsertLines.

    A further hint for you - I would try to use the CodeNames of your tables. It is less likely to be changed - BUT it might be not that comfortable to use in your code at first. I had to get used to it, but for me it has many advantages against using a tables name.

    Hope this helps ;)

    0 讨论(0)
提交回复
热议问题