web-dev-qa-db-fra.com

Noms des onglets Excel et noms Visual Basic

Il semble que Visual Basic ne puisse pas faire référence à des feuilles en fonction des noms de feuilles modifiés par l'utilisateur. Les noms des onglets de la feuille de calcul peuvent changer de nom, mais il semble que Visual Basic considère toujours les noms de la feuille de calcul comme Sheet1, etc., même si l'onglet de classeur a été modifié pour quelque chose d'utile.

J'ai ceci: 

TABname = rng.Worksheet.Name  ' Excel sheet TAB name, not VSB Sheetx name.

mais je voudrais utiliser des noms de feuille dans les routines Visual Basic. Pour l'instant, le mieux que je puisse faire est de sélectionner les cas de l'onglet Feuilles de calcul par rapport aux noms Visual Basic, ce qui ne me rend pas la journée difficile ..___ Visual Basic doit connaître les noms Sheet1, Sheet2, etc. Comment puis-je les associer aux noms des onglets Excel afin de ne pas avoir à gérer une table de correspondance qui change à chaque nouveau nom ou nouvelle feuille? Merci d'avance pour vos réponses.

16

Dans le modèle d'objet Excel, une feuille de calcul a 2 propriétés de nom différentes:

Feuille de travail.Nom 
Worksheet.CodeName

la propriété Nom est en lecture/écriture et contient le nom qui apparaît sur l'onglet de la feuille. Il est modifiable par l'utilisateur et VBA

la propriété CodeName est en lecture seule

Vous pouvez référencer une feuille particulière en tant que Worksheets ("Fred"). Range ("A1") où Fred est la propriété .Name Ou en tant que Sheet1.Range ("A1") où Sheet1 est le nom de code de la feuille de calcul.

22
Charles Williams

Cela modifiera les noms de tous les objets de la feuille de calcul (du point de vue de l'éditeur VBA) afin qu'ils correspondent à ceux de leurs noms de feuille (du point de vue d'Excel):

Sub ZZ_Reset_Sheet_CodeNames()
'Changes the internal object name (codename) of each sheet to it's conventional name (based on it's sheet name)

    Dim varItem As Variant

    For Each varItem In ThisWorkbook.VBProject.VBComponents
        'Type 100 is a worksheet
        If varItem.Type = 100 And varItem.Name <> "ThisWorkbook" Then
            varItem.Name = varItem.Properties("Name").Value
        End If
    Next
End Sub

Il est important de noter que le nom d'objet (nom de code) "(Nom)" est remplacé par le nom de propriété "Nom" et qu'il doit donc être référencé comme une sous-propriété.

4
ark565

Vous devriez pouvoir référencer les feuilles par le nom fourni par l'utilisateur. Etes-vous sûr de référencer le bon classeur? Si vous avez plusieurs classeurs ouverts au moment où vous faites référence à une feuille, cela peut certainement être à l'origine du problème.

Si tel est le problème, utilisez ActiveWorkbook (le classeur actuellement actif) ou ThisWorkbook (le classeur contenant la macro) devrait le résoudre.

Par exemple,

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet")
3
devuxer

En fait, le nom d'objet/code "Sheet1" peut être modifié. Dans VBA, cliquez sur Sheet1 dans la liste d'objets Excel. Dans la fenêtre des propriétés, vous pouvez modifier Sheet1 pour indiquer rng.

Vous pouvez ensuite référencer rng en tant qu'objet global sans avoir à créer une variable au préalable. Donc, debug.print rng.name fonctionne très bien. Plus de feuilles de travail ("rng"). Name.

Contrairement à l'onglet, le nom de l'objet est soumis aux mêmes restrictions que les autres variables (c'est-à-dire, aucun espace).

3
ccampj

C'est une solution très basique (peut-être que je manque le but de la question). ActiveSheet.Name renverra la chaîne du nom de l'onglet actuel (et reflétera toutes les modifications ultérieures apportées par l'utilisateur). J'appelle simplement la feuille active, définit la variable, puis l'utilise comme objet des feuilles de calcul. Ici, je récupère des données d'une table pour créer un rapport pour une division. Cette macro fonctionnera sur n’importe quelle feuille de mon classeur formatée pour le même filtre (critères et copie de gamme) - chaque division reçoit sa propre feuille et peut modifier les critères et se mettre à jour à l’aide de cette macro unique.

Dim currRPT As String
ActiveSheet.Select
currRPT = (ActiveSheet.Name)
Range("A6").Select
Selection.RemoveSubtotal
Selection.AutoFilter
Range("PipeData").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
    ("C1:D2"), CopyToRange:=Range("A6:L9"), Unique:=True
Worksheets(currRPT).AutoFilter.Sort.SortFields.Clear
Worksheets(currRPT).AutoFilter.Sort.SortFields.Add Key:= _
    Range("C7"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
1
Ottobahn

Il y a (au moins) deux façons différentes d'obtenir l'objet Worksheet

  • via les collections Sheets ou Worksheets telles que référencées par DanM
  • par des noms d'objet non qualifiés

Lorsqu'un nouveau classeur comportant trois feuilles de calcul est créé, il existe quatre objets auxquels vous pouvez accéder via des noms non qualifiés: ThisWorkbook; Sheet1; Sheet2; Sheet3. Cela vous permet d'écrire des choses comme ceci:

Sheet1.Range("A1").Value = "foo"

Bien que cela puisse sembler un raccourci utile, le problème survient lorsque les feuilles de calcul sont renommées. Le nom d'objet non qualifié reste en tant que Sheet1 même si la feuille de calcul est renommée en quelque chose de totalement différent.

Il y a une certaine logique à cela parce que:

  • les noms des feuilles de calcul ne sont pas conformes aux mêmes règles que les noms de variables
  • vous pouvez masquer accidentellement une variable existante

Par exemple (testé dans Excel 2003), créez une nouvelle variable Workbook avec trois feuilles de calcul. Créez deux modules. Dans un module, déclarez ceci:

Public Sheet4 As Integer

Dans l'autre module, mettez:

Sub main()

Sheet4 = 4

MsgBox Sheet4

End Sub

Exécutez ceci et la boîte de message devrait apparaître correctement.

Ajoutez maintenant une quatrième feuille de calcul au classeur qui créera un objet Sheet4. Essayez de relancer main et cette fois, vous obtiendrez une erreur "L'objet ne prend pas en charge cette propriété ou cette méthode"

0
barrowc

J'ai eu à recourir à cela, mais cela a des problèmes d'entretien.

Function sheet_match(rng As Range) As String  ' Converts Excel TAB names to the required VSB Sheetx names.
  TABname = rng.Worksheet.Name                ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates.
' Next, match this Excel sheet TAB name to the VSB Sheetx name:
   Select Case TABname 'sheet_match
      Case Is = "Sheet1": sheet_match = "Sheet1"  ' You supply these relationships
      Case Is = "Sheet2": sheet_match = "Sheet2"
      Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB
      Case Is = "Sheet4": sheet_match = "Sheet4"
      Case Is = "Sheet5": sheet_match = "Sheet5"
      Case Is = "Sheet6": sheet_match = "Sheet6"
      Case Is = "Sheet7": sheet_match = "Sheet7"
      Case Is = "Sheet8": sheet_match = "Sheet8"
   End Select
End Function
0

Je me trompe peut-être, mais vous pouvez ouvrir un classeur, sélectionner une feuille de calcul et modifier sa propriété (Nom) en fonction de vos besoins. Cela annule la convention de nommage "Sheetx". Ces noms sont également affichés dans l'éditeur VBA.

Comment faire cela manuellement: 1. Sélectionnez la feuille dans un classeur (j'ai tendance à créer des modèles) . 2. Définissez le nom de l’onglet sur ce que vous aimez ("foo") . 3. Cliquez sur le menu Développeur (que vous avez précédemment activé, n'est-ce pas?) . 4. Localisez "Propriétés" et cliquez dessus, en faisant apparaître la fenêtre de propriétés de cette feuille de calcul . 5. Le tout premier élément de la liste alphabétique est (nom) et à la droite de (nom) est "Sheetx".
6. Cliquez sur ce champ et modifiez-le (pourquoi ne pas utiliser "MyFav") . 7. Fermez la fenêtre des propriétés . 8. Accédez à l'éditeur Visual Basic . 9. Passez en revue les feuilles du cahier que vous venez de modifier ... 10. Observez que les objets Microsoft Excel affichent le nom que vous venez de modifier, "MyFav", et à droite, entre parenthèses, le nom de l'onglet de la feuille de calcul ("foo").

Vous pouvez modifier le nom de code par programme si vous préférez. J'utilise des noms non-Sheet pour faciliter la manipulation de mes modèles . Vous n'êtes pas obligé d'utiliser le nom générique par défaut de "Sheetx".

0
BjH

J'avais aussi besoin d'utiliser le nom de code de la feuille pour arrêter une série de macros - la réponse de ccampj ci-dessus reflète cette solution (avec des images à l'écran)

0
MickeyBlueOwl