L'indice n'appartient pas à la sélection

Bonjour à tous, merci par avance pour l'aide que vous allez m'apporter.

ce titre de sujet existe déjà mais les réponses ne m'ont pas permit de solutionner le problème suivant.

Le code suivant me donne "L'indice n'appartient pas à la sélection" pour la ligne de code "Set wsSource = ..... "

          Dim moistraite, anneetraitee As Integer
          Dim zone As Range
          Dim wsSource, wsDest As Worksheet
          moistraite = InputBox("Mois du tableau à traiter en chiffre")
          anneetraitee = InputBox("Année à traiter")
          Set wsSource = ThisWorkbook.Worksheets("t" & moistraite)
          Set wsDest = ThisWorkbook.Worksheets("R" & moistraite)
          wsDest.Cells.ClearContents
          zone = wsSource.Range("A1").CurrentRegion
          zone.Copy Destination:=wsDest.Cells(1, 1)

Pouvez vous m'expliquer pourquoi ce code ne fonctionne pas. Merci

Bonjour

Macro à tester

Sub CopierDonnees()

    Dim moistraite As Integer
    Dim anneetraitee As Integer
    Dim zone As Range
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet

    moistraite = InputBox("Mois du tableau à traiter en chiffre")
    anneetraitee = InputBox("Année à traiter")

    ' Vérification de l'existence des feuilles
    If Not WorksheetExists("t" & moistraite) Then
        MsgBox "La feuille 't" & moistraite & "' n'existe pas."
        Exit Sub
    End If
    If Not WorksheetExists("R" & moistraite) Then
        MsgBox "La feuille 'R" & moistraite & "' n'existe pas."
        Exit Sub
    End If

    Set wsSource = ThisWorkbook.Worksheets("t" & moistraite)
    Set wsDest = ThisWorkbook.Worksheets("R" & moistraite)

    wsDest.Cells.ClearContents
    Set zone = wsSource.Range("A1").CurrentRegion
    zone.Copy Destination:=wsDest.Cells(1, 1)

End Sub

Function WorksheetExists(sheetName As String) As Boolean
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets(sheetName)
    On Error GoTo 0
    WorksheetExists = Not ws Is Nothing
End Function

Joco7915, merci pour votre réponse.

J'ai commencer à regarder mais il semble que cela ne fonctionne pas je chercherais encore demain

paterbleutch

bonjour paterbleutch, salut Joco7915

un essai moins conventionel.

X et B ne sont pas déclarés et donc à ce moment "Variant/Empty".Après le "inputbox", X sera un "Variant/double" (pour un chiffre) ou "Variant/Boolean" (pour le croix ou "annuler"). B est "Variant/Empty" qui changera en "Variant/Boolean". Les 2 autres sont déclaré comme "Worksheet" et commencent en valeur "nothing" et changent éventuellement en un vrai "Worksheet". Avec ces connaissances, le traitement des erreurs est plus facile.

Sub CopierDonnees()

     Dim wsSource As Worksheet, wsDest As Worksheet, X, B

     On Error Resume Next
     Do
          X = Application.InputBox("Mois du tableau à traiter en chiffre" & vbLf & "0=arrêter", "MOIS", Month(Date), Type:=1)
          If X = False Or X = 0 Then Exit Sub        'on a choisi "0" ou "annuler" ou le croix
          Set wsSource = ThisWorkbook.Worksheets("t" & X)
          Set wsDest = ThisWorkbook.Worksheets("R" & X)
          B = (wsSource Is Nothing Or wsDest Is Nothing)
          If B Then If vbYes <> MsgBox("Feuille " & Chr(34) & "T" & X & Chr(34) & "  et/ou " & Chr(34) & "R" & X & Chr(34) & vbLf & "n'existe(nt) pas" & vbLf & vbLf & "Continuer=Oui", vbCritical + vbYesNo, "ERREUR") Then Exit Sub
     Loop While B
     On Error GoTo 0

     With wsDest
          .Cells.ClearContents               'RAZ destination
          wsSource.Range("A1").CurrentRegion.Copy .Cells(1, 1)     'copier&coller source
     End With
End Sub

Bonsoir,

ATTENTION ! la définition d'une variable n'est pas "collective"...
Dim wsSource, wsDest As Worksheet => ici seul wsDest est définie comme une feuille, wsSource est considérée comme Variant.
peut être que cela vient de là...

faites comme BsAlv : Dim wsSource As Worksheet, wsDest As Worksheet
il en est de même pour Dim moistraite, anneetraitee As Integer !

Alors si cela ne corrige pas l'erreur du code, cela corrige tout de même une façon de faire incorrecte.

@ bientôt

LouReeD

correction, petite erreur (chaque fois reset des variables avec "set ws...=nothing", sinon en cas d'erreur, il maintient le worksheet du boucle précédent)

Sub CopierDonnees()

     Dim wsSource As Worksheet, wsDest As Worksheet, X, B

     Do
          X = Application.InputBox("Mois du tableau à traiter en chiffre" & vbLf & "0=arrêter", "MOIS", Month(Date), Type:=1)
          If X = False Then Exit Sub     'on a choisi "0" ou "annuler" ou le croix (PS false=0)
          On Error Resume Next
          Set wsSource = Nothing: Set wsSource = ThisWorkbook.Worksheets("t" & X)
          Set wsDest = Nothing: Set wsDest = ThisWorkbook.Worksheets("R" & X)
          On Error GoTo 0
          B = (wsSource Is Nothing Or wsDest Is Nothing)
          If B Then If vbYes <> MsgBox("Feuille " & Chr(34) & "T" & X & Chr(34) & "  et/ou " & Chr(34) & "R" & X & Chr(34) & vbLf & "n'existe(nt) pas" & vbLf & vbLf & "Continuer=Oui", vbCritical + vbYesNo, "ERREUR") Then Exit Sub
     Loop While B

     With wsDest
          .Cells.ClearContents               'RAZ destination
          wsSource.Range("A1").CurrentRegion.Copy .Cells(1, 1)     'copier&coller source
     End With
End Sub

Joco7915, BsAlv, LouReeD, merci pour vos réponses.

J'ai appliqué les recommandations de LouReeD pour la déclaration des variables.

J'ai ensuite essayé de faire fonctionner les programmes de Joco7915 et de BsAlv. Les trois programme bloquent au même endroit avec :

Set wsSource = ThisWorkbook.Worksheets("t" & X) 'et l'erreur :"L'indice n'appartient pas à la sélection"????

J'ai établi ce petit programme qui lui fonctionne mais mon but et de supprimer les "Select"

Dim moistraite as integer, anneetraitee as integer
Dim zone as Range
Dim N1 as integer, N2 as integer
moistraite = InputBox("Mois du tableau à traiter en chiffre")
anneetraitee = InputBox("Année à traiter")
Sheets("R" & moistraite).Select
Cells.ClearContents
Sheets("t" & moistraite).Select
zone = Sheets("t" & moistraite).Range("A1").CurrentRegion
N1 = UBound(zone)
N2 = UBound(zone, 2)
Set zone = Range(Cells(1, 1), Cells(N1, N2))
Sheets("R" & moistraite).Select
zone.Copy Destination:=Sheets("R" & moistraite).Cells(1, 1)

Bonjour paterbleuch,

Ta macro se trouve-t-elle bien dans le classeur qui contient les onglets auxquels tu essaies d'accéder ? Thisworkbook fait référence au classeur qui contient la macro, pas au classeur actif ( utlise activeworkbook pour cela).

Dans ta macro qui fonctionne, tu ne fais pas référence à un classeur, par défaut c'est le classeur actif.

h2so4, merci pour ta réponse.

Tu soulève un problème tout à fait pertinent, je suis effectivement dans le bon classeur, qui correspond à l'année traitée. Mais je prévois quand le programme sera au point d'ouvrir par le code le classeur correspondant à l'année choisie pour éviter de faire des mélanges entre les années, ce que j'ai déjà fait.

paterbleutch

ma macro n'a pas d'erreur, ces 2 sets se trouvent entre "on error resume next" et "on error goto 0", donc en cas d'erreur, la macro ne s'arrête pas. mais les wsSource et wsDest restent éventuellement en état "nothing"

Rechercher des sujets similaires à "indice appartient pas selection"