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 Sub