Home » excel » excel – Worksheet.CodeName empty

excel – Worksheet.CodeName empty

Posted by: admin April 23, 2020 Leave a comment

Questions:

I am trying to reference newly added Worksheet by it’s CodeName property. The problem is that CodeName returns empty string unless run from debugger.

Set tableSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
MsgBox tableSheet.CodeName

Even this simple example doesn’t work unless I put a break point on MsgBox line.
What is the problem with this?

How to&Answers:

I was able to duplicate your issue. Some googling revealed this answer:

Sub test()
Dim tablesheet As Excel.Worksheet

Set tablesheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
MsgBox ThisWorkbook.VBProject.VBComponents(tablesheet.Name).Properties("Codename")
End Sub

I think you have to check Microsoft Visual Basic for Applications Extensibility 5.3 in Tools>References.

Answer:

I can confirm this behavior. I have never used CodeName before, I use sometimes Name to reference a sheet.

Sub Test()
    Dim tableSheet As New Worksheet

    Set tableSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    MsgBox tableSheet.Name
End Sub

This gives the name of the sheet in the MsgBox and it is not only readable, you can change the name of the sheet if you want.

Answer:

I have a similar problem for a new sheet that created by macro (it would have a blank codename unless you open the Macro Editor).
For my case, since I need the code name to insert some macro to the new sheet. So I use the following code, and it works. It seems the codeName would have value, due to my code access Name attribute of ‘VBComponents.item’, which is codeName attribute for sheet.

Note: I am not sure why, below code would open the VBA Editor automatically.

Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent

Set VBProj = ActiveWorkbook.VBProject

Dim i
For i = 1 To VBProj.VBComponents.Count
    If VBProj.VBComponents.Item(i).Name = ActiveSheet.CodeName Then
        Set VBComp = VBProj.VBComponents.Item(i)
    End If
Next