Adresses de cellule en VBA
Bonjour J'ai un vide. J'ai une adresse contenue dans une variable ValRech obtenu dans une feuille et je désire aller à cette adresse dans une autre feuille je ne me souviens plus comment faire.
Salutations
Bonjour Lesauvage,
Tout dépend comment est construit le code ... cela peut être du type (wsCible désigne la variable WorkSheet de l'autre feuille) : wsCible.Range(ValRech).Value = "XXXX" pour l'affectation d'une valeur.
Si cela ne répond pas à la question, merci de fournir un fichier.
Cdlt,
Cylfo
Bonjour
Voici ce que je recherche
Sub aaz()
'
' aaz Macro
'
Dim ValRech As String
Rows("4:4").Select
Selection.Copy
Sheets("Liste-Sp").Select
wsCible.Range(ValRech).Value = "XX" Ne fonctionne pas
' Range("A7").Select C'est la valeur de ValRech qu'il faudrait à la place de A7
ActiveSheet.Paste
Range("A2").Select
Sheets(Array("Liste-Sp", "Modif")).Select
Sheets("Liste-Sp").Activate
ActiveWindow.SelectedSheets.Visible = False
End Sub
Merci
Re,
Désolé mais le bout de code (ce n'est pas ce que j'appelle fourni un fichier ...) est incompréhensible mais ce qui est sûr c'est qu'il n'est pas compilable et qu'il ne peut pas fonctionner.
Sans fichier (anonymisé) : je ne pourrai pas vous aider et comme j'ai égaré ma boule de cristal
Cdlt,
Cylfo
Sub aaz()'
' aaz Macro
Dim ValRech As String
ValRech = "A7" 'assigner cette valeur à ValRech ******
Rows("4:4").Select
Selection.Copy
Sheets("Liste-Sp").Select
wsCible.Range(ValRech).Value = "XX" Ne fonctionne pas
' Range("A7").Select C'est la valeur de ValRech qu'il faudrait à la place de A7
ActiveSheet.Paste
Range("A2").Select
Sheets(Array("Liste-Sp", "Modif")).Select
Sheets("Liste-Sp").Activate
ActiveWindow.SelectedSheets.Visible = False
End Subvotre ValRech était vide dans votre exemple, il faut le donner la valeur "A7"
wsCible est aussi inconnu
Bonjour,
Moi, j'ai compris ceci:
Sub aaz()
Dim wsCible As Worksheet
Dim ValRech As String
ValRech = Rows("4:4").Value 'Récupère la valeur de la cellule "D4" de la feuille active
wsCibl = Sheets("Liste-Sp") 'attribution du nom de la feuille cible à la variable "wsCibl"
wsCible.Range("A7").Value = ValRech 'copie le contenu de la variable "ValRech" dans A7 de la feuille cible
End SubCdlt
Salut Lesauvage,
Salut Arturo, BsAlv,
allons-y sauvagement..
Sub aaz()
'
Dim iCol%
'
iCol = Cells(4, Columns.Count).End(xlToLeft).Column
With Worksheets("Liste-Sp")
.Range(Range("A7").Value).Resize(1, iCol).Value = Range("A4").Resize(1, iCol).Value
.Visible = False
End With
Worksheets("Modif").Visible = False
'
End SubA+
Bonjour
« Bonjour J'ai un vide. J'ai une adresse contenue dans une variable ValRech obtenu dans une feuille et je désire aller à cette adresse dans une autre feuille je ne me souviens plus comment faire. »
On peut toujours broder à l’infini quand le contexte n’est défini (salut Cylfo).
Lesauvage, tu ne dois pas être loin dans tes débuts de programmation (comme le montre ton premier message). Sache alors que : mieux (précis) le contexte est défini plus le travail de programmation est simplifié*.
Je te donne un exemple dans lequel j’utilise des Tableaux (indispensables plutôt que diaboliques).
*pas d’utilisation, pour les Tableaux d’expressions nouvelles longues purement théoriques, propagées à tout va (oups)!
Parmi les premières à connaître, celle qui permet de n’avoir pas à préciser dans quelle feuille ils figurent. Cela est fait , (automatiquement et de façon invisible) à leur initialisation). D’où une simplification d’écriture et un évitement d’erreurs sans eux. L’évolution de leur connaissance permet de progresser plus vite dans leurs utilisations !
@Ordonc,
il faut utiliser un TS comme un TS, autrement c'est comme taper dans une vis avec un marteau, ça marche à première vue, mais... (Cela se voit quand le TS est vide)
Sub trucBD()
Dim LO: Set LO = Range("BD").ListObject
With Range("TB").ListObject
If .ListRows.Count = 0 Then
MsgBox "TB est vide"
Else
If LO.ListRows.Count = 0 Then Set c = LO.InsertRowRange Else Set c = LO.ListRows.Add.Range
.ListRows(.ListRows.Count).Range.Copy c 'ajoute la ligne du tableau TB dans une nuvelle ligne du tableau BD
End If
End With
End SubBonjour
J’ai précisé que je travaille avec des Tableaux. Oups, je ne n’ajoute pas structurés et en tout cas, j’évite de travailler avec du vide total. Le tableau à copier ne doit pas être vide par contre la plage d’arrivée peut être un tableau vide (plage avec 2 lignes : une pour les titres des colonnes, l’autre, pouvant être vide, pour la plage des contenus à initialiser obligatoirement pur une procédure).
Règle générale rappelée par les utilisateurs avertis d’un tableau : « aucune de ces lignes ne doit rester vide ! »
BsAlv, avec ton raisonnement, tu proposes ta macro.
Sans indications spéciales*, simplicité exige, TB étant un tableau non vide, je continuerai à proposer :
Sub truc()
Dim n As Byte, L As Byte ‘dans cet exemple très restreint, on peut éviter les déclarations des variables**
n = [TB].Rows.Count: L = [BD].Rows.Count + 1
[TB].Rows(n).Copy [BD].Rows(L)
End Sub* On peut interdire de modifier des lignes, interdire les lignes en doublon …
Dans ces cas, on aura besoin d’ajouter des lignes de programmations.
Ici, on retrouve le principe du plus précis est le contexte, plus le travail de programmation est simplifié.
** Certains refusent catégoriquement ces déclarations sans se douter qu’un message d’erreur peut bloquer la macro quand le nombre de variables est assez élevé.
Il me rappelle (autre site et au siècle dernier) dans le test d’une rapidité d’une macro avec une dizaine de milliers de lignes, le principal répondeur, d’un très haut niveau, et félicité par beaucoup, a dû se rendre à l’évidence, que mon choix du type d’une variable, CURRENCY (très, très peu utilisé) à la place de LONG était nettem ent plus efficace.
D’où mon reflexe de déclarer les variables en ayant choisi l’apparition automatique du Option Explicit en première ligne dès l’ouverture de la page de traitement de la macro.
Merci BsAlv de ton intervention qui m’a permis d’ajouter de nouvelles informations.
Bonjour,
Pourquoi, après une argumentation sur les types de variable et leur importance, proposer byte (0-255) pour un indice de ligne (à priori inconnu) qui peut donc très facilement overflow ?
re, @Ordonc,
Nous sommes hors sujet et cela devient une discussion sur le sexe des anges
* l'utilisation de [TB], cela provoque un "evaluate" et le résultat dépend du contexte, ou on demande la valeur d'une cellule,ou on fait référence à une plage, ou on "évaluate" un formule, etc. C'est quelque chose, à mon avis, ancienne et à éviter. Je préfère range("TB"), c'est plus long à écrire mais "to-the-point", cela ne demande pas d'interprétation, donc aucun risque d'erreur. Si je veux le contenu, c'est range("TB").value2, etc
* tous mes variables sont "variant", j'utilise les déclarations uniquement comme correcteur orthographique glorifié, option explicit est pour des débutants. La durée d'une macro est pour moi d'une grande importance, mais il y a autant d'autres facteurs ... .
* Il faut presque obliger l'utilisation des tableaux structurés, Ils ont autant d'avantages (copier les formules ou formats quand on ajoute des lignes par exemple) et naturellement quelque petits désavantages (difficulté d'utiliser des adresses absolutes par exemple ou impossible d'avoir plusieurs formules ou formules et données fixes en même temps dans la même colonne). Un TS est un outil puissant, au début un peu plus difficile à manipuler, mais cela vaut le coup.
EDIT : salut saboh12617, je n'avais pas vu votre réaction avant la mienne ...