web-dev-qa-db-fra.com

Déclaration de classeur/de feuille de calcul variable vba

Je sais que cela peut sembler une question triviale, mais je n'arrive pas à déclarer un workbook ou un worksheet comme variable dans VBA. J'ai le code suivant, mais je ne peux pas comprendre ce que je fais mal, il devrait être simple. Normalement, je n'ai aucun problème à déclarer des variables telles que Dim i As Integer etc. 

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    Set ws = Sheet("name")

    wb.ws.Select

End Sub

Lorsque je lance le code ci-dessus, je reçois une erreur type missmatch.

14

Utilisez Feuilles plutôt que Feuille et activez-les séquentiellement:

Sub kl()
    Dim wb As Workbook
    Dim ws As Worksheet
    Set wb = ActiveWorkbook
    Set ws = Sheets("Sheet1")
    wb.Activate
    ws.Select
End Sub
15
Gary's Student

Si la feuille de calcul que vous souhaitez récupérer existe au moment de la compilation dans ThisWorkbook (le classeur contenant le code VBA que vous consultez), le moyen le plus simple et le plus fiable de faire référence à cet objet Worksheet consiste à utiliser son nom de code:

Debug.Print Sheet1.Range("A1").Value

Vous pouvez définir le nom de code sur tout ce dont vous avez besoin (dans la mesure où il s'agit d'un identifiant VBA valide), indépendamment de son "nom de tabulation" (que l'utilisateur peut modifier à tout moment), en modifiant la propriété (Name) dans le champ. Propriétés fenêtre d'outils (F4):

Sheet1 properties

La propriété Name fait référence au "nom de l'onglet" que l'utilisateur peut modifier sur un coup de tête; la propriété (Name) fait référence au nom de code de la feuille de calcul et l'utilisateur ne peut pas le modifier sans accéder à Visual Basic Editor.

VBA utilise ce nom de code pour déclarer automatiquement une variable d’objet Worksheet à portée globale que votre code peut utiliser n’importe où pour faire référence à cette feuille, gratuitement.

En d'autres termes, si la feuille existe dans ThisWorkbook au moment de la compilation, il n'est jamais nécessaire de déclarer une variable pour elle, la variable est déjà là!


Si la feuille de calcul est créée au moment de l'exécution (dans ThisWorkbook ou non), then, vous devez déclarer et affecter une variable Worksheet pour celle-ci.

Utilisez la propriété Worksheets d'un objet Workbook pour le récupérer:

Dim wb As Workbook
Set wb = Application.Workbooks.Open(path)

Dim ws As Worksheet
Set ws = wb.Worksheets(nameOrIndex)

Notes IMPORTANTES...

  • Le nom et l'index d'une feuille de calcul peuvent facilement être modifiés par l'utilisateur (accidentellement ou non), sauf si la structure du classeur est protégée . Si le classeur n'est pas protégé, vous ne pouvez tout simplement pas supposer que le nom ou l'index vous donnera la feuille de calcul spécifique que vous recherchez - il est toujours bon de valider le format de la feuille (par exemple, vérifiez que la cellule A1 contient du texte spécifique.) , ou qu’il existe une table avec un nom spécifique, qui contient des en-têtes de colonne spécifiques).

  • L'utilisation de la collection Sheets contient des objets Worksheet, mais peut également contenir des instances Chart et une demi-douzaine de types de feuille hérités qui sont et non des feuilles de calcul . L'affectation d'une référence Worksheet à partir de la valeur retournée par Sheets(nameOrIndex) risque de générer une erreur d'exécution type mismatch pour cette raison.

  • Non qualifying la collection Worksheets est une implicite ActiveWorkbook reference - ce qui signifie que la collection Worksheets est extraite du classeur actif au moment de l'exécution de l'instruction. De telles références implicites rendent le code fragile et sujet aux bogues, en particulier si l'utilisateur peut naviguer et interagir avec l'interface utilisateur Excel pendant l'exécution du code.

  • À moins que vous ne vouliez activer une feuille spécifique, vous n'avez jamais besoin d'appeler ws.Activate pour faire 99% de ce que vous voulez faire avec une feuille de calcul. Utilisez simplement votre variable ws à la place.

7
Mathieu Guindon

Troisième solution: Je définirais ws sur une feuille de classeur wb car l'utilisation de Sheet("name") fait toujours référence au classeur actif, qui peut changer en fonction du développement de votre code.

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    'be aware as this might produce an error, if Shet "name" does not exist
    Set ws = wb.Sheets("name")
    ' if wb is other than the active workbook
    wb.activate
    ws.Select

End Sub
2
DrMarbuse

À votre grande surprise, vous devez déclarer une variable de classeur et de feuille de calcul dans Excel 2007 ou une version ultérieure. Ajoutez simplement une expression à une seule ligne.

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.select
End Sub

Supprimez tout le reste et profitez de… .. Mais pourquoi choisir une feuille? la sélection de feuilles est maintenant désuète pour le calcul et la manipulation ... simplement ajouter une formule comme celle-ci

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.range("cell reference").formula = "your formula"
'OR in case you are using copy paste formula, just use 'insert or formula method instead of ActiveSheet.paste e.g.:
   ws.range("your cell").formula
'or
   ws.colums("your col: one col e.g. "A:A").insert
'if you need to clear the previous value, just add the following above insert line
   ws.columns("your column").delete

End Sub
0
P K Prabhakar

Essayez de changer le nom de la variable car elle se heurte parfois à d'autres modules/sous-programmes.

 Dim Workbk As Workbook
 Dim Worksh As Worksheet

Mais aussi, essayez

 Set ws = wb.Sheets("name")

Je ne me souviens pas si cela fonctionne avec Sheet

0
DannyBland