简体   繁体   中英

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

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 to this spreadsheet. Is there anyway I can do this?

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.

在此输入图像描述

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.

在此输入图像描述

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 ie 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 ;)

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM