IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA7.1] Fonction Range avec constante de cellules


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Emloyé
    Inscrit en
    Novembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Emloyé
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2022
    Messages : 5
    Par défaut [VBA7.1] Fonction Range avec constante de cellules
    Bonjour à tous, je suis tout nouveau dans le codage via VBA

    Et je n'arrive pas a régler un problème sur ma fonction Range!

    Range(LaVoie & "_B") = Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_MATERIEL)
    La constante (COL_DEST_DEPART_MATERIEL) peut contenir plusieurs cellules : j'aimerai lorsque qu'il y a plusieurs données dans cette constante qu'elles les fusionnent, en gardant le texte, dans une seule et même cellule.


    Désolé si vous n'arrivez pas a me comprendre, ce monde du programme et tout nouveau pour moi.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Pas compris ...
    Tu peux donner un exemple concret ?

    Sinon, copier / coller ?
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Option Explicit
     
    Public Sub test()
        Dim Wb As Excel.Workbook
        Set Wb = ThisWorkbook
     
        Dim Ws As Excel.Worksheet
        Set Ws = Wb.Worksheets("Feuil1")
     
        Dim Source As Excel.Range
        Set Source = Ws.Range("A1:A10")
     
        Dim Target As Excel.Range
        Set Target = Ws.Range("B1:B10")
     
        Source.Copy Target
    End Sub

  3. #3
    Membre régulier
    Homme Profil pro
    Emloyé
    Inscrit en
    Novembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Emloyé
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2022
    Messages : 5
    Par défaut
    Je veux que que les données d'une cellule (voir deux si le cas échéant) se copie colle.

    Lorsque j'ai deux cellules pour une seul et même constante celle ci échoue.


    J'ai mis le fichier ci joint c'est quand j'effectue mon module de TOF que celui ci ne veut pas fonctionner car deux éléments(cellules) pour une seule cellule

    Fichier pour forum.xlsm

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Ok, je commence à comprendre.

    Le coupable est cette instruction:
    LaVoie = SupprimerEspace(Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_GARAGE))

    Le problème est que tu vas lire des cellules fusionnées.
    Il te faut tester la propriété MergeCells de la plage, et lire la première cellule de la plage fusionnée, que tu obtiens via la propriété MergeArea.
    La fonction suivante devrait te satisfaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Function GetCellValue(ByRef Rng As Excel.Range) As String
        If (Rng.MergeCells) Then
            Dim Data As Excel.Range
            Set Data = Rng.MergeArea
            GetCellValue = Data.Cells(1).Value
        Else
            GetCellValue = Rng.Value
        End If
    End Function
    Autre points:
    - Ajoute la directive Option Explicit en tête de chaque module, et configure ton IDE pour le faire automatiquement.
    - Tes fonctions sont trop grandes et violent le SRP (https://en.wikipedia.org/wiki/Single...lity_principle). Divise les en plusieurs fonction plus petites.
    - Tu as des variables non déclarées, et non typées.
    - Utilise des références explicite plutôt que des références implicites.
    - Les objets "Actifs" sont fortement dépendant du contexte, à bannir.
    - Evite les noms de fonction avec des accents, ce n'est pas portable.
    - Ton code ne devrait pas avoir besoin de sélectionner ni d'activer quoi que ce soit, c'est lent et fait ressembler ton classeur à un sapin de Noël.
    - Utilise des références autant que possible pour alléger tes lignes.

  5. #5
    Membre régulier
    Homme Profil pro
    Emloyé
    Inscrit en
    Novembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Emloyé
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2022
    Messages : 5
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Ok, je commence à comprendre.

    Le coupable est cette instruction:
    LaVoie = SupprimerEspace(Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_GARAGE))

    Le problème est que tu vas lire des cellules fusionnées.
    Il te faut tester la propriété MergeCells de la plage, et lire la première cellule de la plage fusionnée, que tu obtiens via la propriété MergeArea.
    La fonction suivante devrait te satisfaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Function GetCellValue(ByRef Rng As Excel.Range) As String
        If (Rng.MergeCells) Then
            Dim Data As Excel.Range
            Set Data = Rng.MergeArea
            GetCellValue = Data.Cells(1).Value
        Else
            GetCellValue = Rng.Value
        End If
    End Function
    Autre points:
    - Ajoute la directive Option Explicit en tête de chaque module, et configure ton IDE pour le faire automatiquement.
    - Tes fonctions sont trop grandes et violent le SRP (https://en.wikipedia.org/wiki/Single...lity_principle). Divise les en plusieurs fonction plus petites.
    - Tu as des variables non déclarées, et non typées.
    - Utilise des références explicite plutôt que des références implicites.
    - Les objets "Actifs" sont fortement dépendant du contexte, à bannir.
    - Evite les noms de fonction avec des accents, ce n'est pas portable.
    - Ton code ne devrait pas avoir besoin de sélectionner ni d'activer quoi que ce soit, c'est lent et fait ressembler ton classeur à un sapin de Noël.
    - Utilise des références autant que possible pour alléger tes lignes.
    Merci beaucoup pour tous les conseils, c'est un tableur en phase de test, il faut que je le perfectionne.

    le code que tu m'as donner il faut que je le mette dans toute mes macros ou seulement celle où j'ai un problème ?

    Je te remercie encore pour toute l'aide que tu me fourni

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir Mailloch38, deedoliht

    Je suis tombé sur le sujet et par curiosité ouvert ton fichier

    Je pense qu'on pourrait faire plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Sub RealisationDuTOF()
      Dim ShtTOF As Worksheet
      Dim MemLaVoie As String
      Dim LaLigneOrig As Integer
      Dim LaDateMatinDepart As Date
      ' En cas d'erreur
      On Error GoTo GestionErreur
      ' Définir la feuille de travail
      Set ShtTOF = ThisWorkbook.Sheets("TOF")
      'Effacement du tof précedent
      ShtTOF.Range("C4:E23").ClearContents
      '
      LaLigneOrig = PRE_LIG_DEST
      LaDateMatinDepart = InputBox("Pour quelle journée souhaitez vous éditer le TOF ?", "Stationnement des rames à SAG", Format(Now + 1, "dd/mm/yyyy"))
      '
      ShtTOF.Range("Libellé") = "Matin du " & LaDateMatinDepart
      '
      While Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_MATERIEL) <> ""
        LaVoie = SupprimerEspace(Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_GARAGE))
        If LaVoie <> "" Then
          MemLaVoie = LaVoie
          ShtTOF.Range(LaVoie) = Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_NUMERO)
          ShtTOF.Range(LaVoie & "_C") = Format(Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_DATE), "dd mmm") & " - " & Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_HEURE)
          ShtTOF.Range(LaVoie & "_B") = Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_MATERIEL)
        Else
          LaVoie = MemLaVoie
          ShtTOF.Range(LaVoie & "_B") = ShtTOF.Range(LaVoie & "_B") & "/" & Sheets(NOM_FEUILLE_DEST_GENERALE).Cells(LaLigneOrig, COL_DEST_DEPART_MATERIEL)
        End If
        LaLigneOrig = LaLigneOrig + 1
      Wend
      Set ShtTOF = Nothing
      Exit Sub
     
    GestionErreur:
      Beep
      Call MsgBox("La création du TOF n'est pas parvenue à son terme", vbOKOnly + vbCritical, "Création du TOF")
    End Sub
    Et la fonction abrégée (si on veut la conserver)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function SupprimerEspace(LaVoie As String)
      SupprimerEspace = Replace(LaVoie, " ", "")
    End Function
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser fonction Rang avec un critère
    Par Tensa03 dans le forum Excel
    Réponses: 5
    Dernier message: 22/04/2019, 17h50
  2. [XL-2010] Fonction RANG avec des chiffres positifs et négatifs
    Par goldstar dans le forum Conception
    Réponses: 2
    Dernier message: 09/07/2015, 09h49
  3. Réponses: 5
    Dernier message: 22/03/2014, 12h20
  4. [VBA-E] selection de plusieurs rangés avec des cellules définies
    Par noir_desir dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 24/02/2007, 14h26
  5. [VBA-E]Probleme avec la fonction Range
    Par pec dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2006, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo