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 FunctionJoco7915, 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 SubBonsoir,
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 SubJoco7915, 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.