VBA - aide pour une boucle simple
Bonjour à tous,
Tout d'abord, je vous souhaite une bonne fin d'années !
je n'arrive pas à créer une boucle.
Le but de celle-ci est d'ouvrir un classeur excel (classeur "fia" et "fib") via un lien hypertexte dans une cellule et copier un certain nombre de ligne entre deux mots précis puis fermer ce classeur et coller ce nombre de lignes dans le premier classeur (classeur "test"). Puis appel deux autres macros pour nettoyer les lignes copiées.
ci dessous mon code défecteux avec en commentaire la ligne qui me fait déboger..
Avez vous une idée pour m'aider à réussir cette boucle. En PJ, vous avez un exemple.
Un grand merci pour votre temps.
Sub essai()
Dim c1 As Range, c2 As Range
Dim cell As Range
[color=#FF0000]Set DataRange = Sheets("parametrages").Range("a2:a4")
Application.DisplayAlerts = False 'etat d'affichage des messages d'alerte d'excel ici désactiver
For Each cell In DataRange
ActiveWorkbook.FollowHyperlink Address:=DataRange, NewWindow:=True '<= cette ligne ne foncitonne pas avez vous une idée svp?
UpdateLinks = True '<= malgré cette ligne le classeur excel me demande d'actualiser les liens avez vous une idée svp?[/color]
Sheets("feuil1").Select ' selectionne la feuille des données
Set c1 = Columns(1).Find("References", LookIn:=xlValues, lookat:=xlWhole) 'cherche la première cellule avec le mot references
Set c2 = Columns(1).Find("Pieces", LookIn:=xlValues, lookat:=xlWhole) 'cherche la première cellule avec le mot pieces
If c1 Is Nothing Or c2 Is Nothing Then MsgBox "y'a un os !": Exit Sub 'si l'un des 2 mots ne sont pas présent msg puis sort de la macro
Range(c1, c2).EntireRow.Copy 'copie toute les lignes du mot "references" au mot "pieces"
ActiveWorkbook.Close 'ferme le classeur
Windows("test.xlsm").Activate 'active le classeur ou les données doivent être collées
Sheets("BDD").Activate 'active la feuille ou les données doivent être collées
Range("A1").Activate 'active la première cellule
Range("A1000").End(xlDown).Offset(1, 0).Select 'active la première cellule vide
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'colle les données en dur avec mef de la source
Cells.Select 'select toutes les cellules de la feuille
Selection.Rows.Ungroup 'dégroupe les lignes
Selection.Columns.Ungroup 'dégroupe les colonnes
Call Essai_1 'supprime toutes les lignes si cellule dans la col A qui ne commence pas par CR*, re
Next
Call Essai_2 'supprime toutes les lignes vides
Call essai_3 'supprime toutes les colonnes vides en dehors de la boucle
Application.DisplayAlerts = True 'etat d'affichage des messages d'alerte d'excel ici activer
End Sub
Je vous souhaite une bonne soirée et merci d'avance
cdt
Julien
Bonjour,
Set DataRange = Sheets("parametrages").Range("a2:a4")
ActiveWorkbook.FollowHyperlink Address:=DataRange
Tu devrais voir que tu fournis un objet Range là où un argument de type String est attendu...
Pour que je lise plus avant : il faudrait un code bien indenté
Cordialement, et bonne fin d'année.
Bonjour,
Merci de ton retour. J'ai copié plusieurs bout de code que j'ai trouvé sur Internet car je ne connais pas trop VBA...
J'ai enlevé les commentaires comme voulu.
Par contre, indenté ? ce sont les espaces en début de ligne?
Et tu attires ma curiosité en utilisant pas de select? comment fais tu sans ?
Si je ne dois pas utilisé Set, je dois utilisé quelle variable stp?
Merci pour ton aide et bonne soirée
Julien
Sub essai()
Dim c1 As Range, c2 As Range
Dim cell As Range
Set DataRange = Sheets("parametrages").Range("a2:a4")
Application.DisplayAlerts = False
For Each cell In DataRange
ActiveWorkbook.FollowHyperlink Address:=DataRange, NewWindow:=True '<= cette ligne ne foncitonne pas avez vous une idée svp?
UpdateLinks = True '<= malgré cette ligne le classeur excel me demande d'actualiser les liens avez vous une idée svp?</span>
Sheets("feuil1").Select
Set c1 = Columns(1).Find("References", LookIn:=xlValues, lookat:=xlWhole)
Set c2 = Columns(1).Find("Pieces", LookIn:=xlValues, lookat:=xlWhole)
If c1 Is Nothing Or c2 Is Nothing Then MsgBox "y'a un os !": Exit Sub
Range(c1, c2).EntireRow.Copy
ActiveWorkbook.Close
Windows("test.xlsm").Activate
Sheets("BDD").Activate
Range("A1").Activate
Range("A1000").End(xlDown).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Cells.Selec
Selection.Rows.Ungroup
Selection.Columns.Ungroup
Call Essai_1
Next
Call Essai_2
Call essai_3
Application.DisplayAlerts = True 'r
End Sub
Set est une instruction permettant d'affecter une référence d'objet à une variable.
Ta variable est DataRange, elle n'est pas déclarée, donc de type Variant, et ne rechignera donc pas à l'affectation d'un objet Range. Ce que tu fais en lui affectant une plage de 3 cellules.
Tu l'utilises ensuite pour renvoyer le paramètre Address d'un objet Hyperlink que tu veux résoudre par la méthode FollowHyperlink du classeur. Si DataRange représentait une seule cellule, VBA chercherait la propriété Value (propriété par défaut de l'objet Range) de cette cellule, mais là il n'a pas le choix, il n'a que soit un objet Range, inadéquat, soit une matrice de valeurs, il se croise les bras !
Il faut un peu de logique, et lire ce que l'on écrit exactement... Dans le cas où tu lui envoies un objet Range constitué d'une seule cellule, dont il pourra prélever la valeur, il faudra encore que cette valeur soit de type String, que le chaîne constitue bien une adresse de lien et que cette adresse soit complète pour que le lien puisse être résolu.
Cordialement.
Merci pour ton explication. Mais si je met simplement une valeur de la cellule cela fonctionne. Je suis d'accord.
Sub essai()
Dim c1 As Range, c2 As Range
Dim cell As Range
Application.DisplayAlerts = False
For Each cell In DataRange
ActiveWorkbook.FollowHyperlink Address:=range ("R2"), NewWindow:=True '<=cela fonctionne
UpdateLinks = True
Mais je souhaiterais créer une boucle pour qu'il fasse les mêmes instructions sur la plage de cellule choisi de R2 à R6 par exemple.
Quelles seraient les instructions pour réussir cette boucle?
Merci pour ton retour.
Bonne soirée
Julien
Sous réserve de ce qui manque (plus de définition de DataRange... ? ...), dans ta boucle For Each c'est :
..... Address:= cell.Value....
que tu dois avoir.
Sub essai()
Dim c1 As Range, c2 As Range
Dim cell As Object
Application.DisplayAlerts = False
For Each cell In Selection
ActiveWorkbook.FollowHyperlink Address = cell.Value("a2:a4"), NewWindow = True
Hmm au secours il me marque incomptabilité de type...
je ne comprends plus...as tu une idée?
Que vient faire le "a2:a4" après Value ?
Tu écris vraiment sans te demander de quoi il s'agit !
hello,
peut être un cell.value(1,i)
et mettre la variable i = 1 to ....
nn?
Quel martyr pour le code ?