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

13fia.xlsx (11.05 Ko)
13fib.xlsx (10.74 Ko)
20test.xlsm (12.58 Ko)

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é , expurgé de tout Activate, Select, ainsi que des arguments inutiles dans les expressions , et qu'on puisse le lire sans être gêné par un surplus de commentaires...

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 ?

Rechercher des sujets similaires à "vba aide boucle simple"