Hannah
Hannah

Reputation: 169

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?

Upvotes: 4

Views: 12781

Answers (3)

Neil Dunlop
Neil Dunlop

Reputation: 405

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.

Upvotes: 0

Siddharth Rout
Siddharth Rout

Reputation: 149297

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

Upvotes: 8

Jook
Jook

Reputation: 4682

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

Upvotes: 2

Related Questions