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
.
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
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):
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)
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.
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
À 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
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