web-dev-qa-db-fra.com

Référence à la feuille de calcul Excel par son nom?

J'ai le nom d'une feuille de calcul stockée sous forme de chaîne dans une variable. Comment effectuer une opération sur cette feuille de calcul?

Je pensais que je ferais quelque chose comme ça:

nameOfWorkSheet = "test"
ActiveWorkbook.Worksheets(nameOfWorkSheet).someOperation()

Comment dois-je procéder?

19
Jonson Bylvaklov

Il existe plusieurs options, notamment l'utilisation de la méthode que vous démontrez, avec et l'utilisation d'une variable.

Ma préférence est l'option 4 ci-dessous: Dim une variable de type Worksheet et stocke la feuille de calcul et appelle les méthodes sur la variable ou la transmet aux fonctions, mais toutes les options fonctionnent.

Sub Test()
  Dim SheetName As String
  Dim SearchText As String
  Dim FoundRange As Range

  SheetName = "test"      
  SearchText = "abc"

  ' 0. If you know the sheet is the ActiveSheet, you can use if directly.
  Set FoundRange = ActiveSheet.UsedRange.Find(What:=SearchText)
  ' Since I usually have a lot of Subs/Functions, I don't use this method often.
  ' If I do, I store it in a variable to make it easy to change in the future or
  ' to pass to functions, e.g.: Set MySheet = ActiveSheet
  ' If your methods need to work with multiple worksheets at the same time, using
  ' ActiveSheet probably isn't a good idea and you should just specify the sheets.

  ' 1. Using Sheets or Worksheets (Least efficient if repeating or calling multiple times)
  Set FoundRange = Sheets(SheetName).UsedRange.Find(What:=SearchText)
  Set FoundRange = Worksheets(SheetName).UsedRange.Find(What:=SearchText)

  ' 2. Using Named Sheet, i.e. Sheet1 (if Worksheet is named "Sheet1"). The
  ' sheet names use the title/name of the worksheet, however the name must
  ' be a valid VBA identifier (no spaces or special characters. Use the Object
  ' Browser to find the sheet names if it isn't obvious. (More efficient than #1)
  Set FoundRange = Sheet1.UsedRange.Find(What:=SearchText)

  ' 3. Using "With" (more efficient than #1)
  With Sheets(SheetName)
    Set FoundRange = .UsedRange.Find(What:=SearchText)
  End With
  ' or possibly...
  With Sheets(SheetName).UsedRange
    Set FoundRange = .Find(What:=SearchText)
  End With

  ' 4. Using Worksheet variable (more efficient than 1)
  Dim MySheet As Worksheet
  Set MySheet = Worksheets(SheetName)
  Set FoundRange = MySheet.UsedRange.Find(What:=SearchText)

  ' Calling a Function/Sub
  Test2 Sheets(SheetName) ' Option 1
  Test2 Sheet1 ' Option 2
  Test2 MySheet ' Option 4

End Sub

Sub Test2(TestSheet As Worksheet)
    Dim RowIndex As Long
    For RowIndex = 1 To TestSheet.UsedRange.Rows.Count
        If TestSheet.Cells(RowIndex, 1).Value = "SomeValue" Then
            ' Do something
        End If
    Next RowIndex
End Sub
12
Ryan

La meilleure façon est de créer une variable de type Worksheet, d'affecter la feuille de calcul et de l'utiliser à chaque fois que le VBA utilise implicitement le ActiveSheet.

Cela vous aidera à éviter les bogues qui finiront par apparaître lorsque votre programme augmentera de taille.

Par exemple, quelque chose comme Range("A1:C10").Sort Key1:=Range("A2") est bon lorsque la macro ne fonctionne que sur une seule feuille. Mais vous allez éventuellement étendre votre macro pour qu'elle fonctionne avec plusieurs feuilles, découvrir que cela ne fonctionne pas, l'ajuster sur ShTest1.Range("A1:C10").Sort Key1:=Range("A2")... et découvrir qu'elle ne fonctionne toujours pas.

Voici la bonne façon:

Dim ShTest1 As Worksheet
Set ShTest1 = Sheets("Test1")
ShTest1.Range("A1:C10").Sort Key1:=ShTest1.Range("A2")
6
stenci

Pour développer la réponse de Ryan, lorsque vous déclarez des variables (en utilisant Dim), vous pouvez tricher un peu en utilisant la fonction de texte prédictif dans le VBE, comme dans l'image ci-dessous. screenshot of predictive text in VBE

S'il apparaît dans cette liste, vous pouvez affecter un objet de ce type à une variable. Donc, pas seulement une feuille de calcul, comme Ryan l'a souligné, mais aussi un graphique, une plage, un classeur, une série et ainsi de suite.

Vous définissez cette variable égale à l'objet que vous souhaitez manipuler, puis vous pouvez appeler des méthodes, la transmettre à des fonctions, etc., comme Ryan l'a souligné dans cet exemple. Vous pourriez rencontrer quelques accrocs en ce qui concerne les collections par rapport aux objets (graphique ou graphiques, plage ou plages, etc.), mais avec des essais et des erreurs, vous l'obtiendrez à coup sûr.

2
j boschiero