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 :

Cellule dynamique dans Range


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Cellule dynamique dans Range
    Bonjour,

    j'ai une ligne
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    frs.Range("J1:J100").Value = Sh.Range("B4:B100").Value

    je veux remplacer les colonnes J et B ( et éventuellement la limite 100 par une variable pour pouvoir passer aux colonnes suivantes

    Je pensai m'en sortir facilement mais je bloque depuis 2 jours en voulant utiliser ce que j'ai trouver sur le net :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Range(.Cells(x, y), .Cells(a, b))


    sans succès
    Il ne savait pas que c'était impossible, donc il l' a fait...

  2. #2
    Expert éminent sénior
    C'est sans doute parce que tu ne définis pas les onglets des Cells. Il faut que ce soient les mêmes que celles des Range.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    frs.Range(frs.Cells(x, y), frs.Cells(a, b)).Value


    Ou bien
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    With frs
       .Range(.Cells(x, y), .Cells(a, b)).Value = 0
    End With


    Mais il serait plus simple d'utiliser un Resize :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    frs.Range("J1").Resize(a, b).Value = Sh.Range("B4").Resize(a, b).Value
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Membre actif
    voilà ma séquence :
    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
    While CatalDercol > catalCol
        With catalSh.Cells(Columns.Count, catalCol).End(xlUp).MergeArea: derlig = .Cells(.Cells.Count).Row: End With
        k = 4
        x = 1
        While derlig > k
            If catalSh.Cells(k, catalCol) > " " Then  ' ligne / col
                frs.Range("J1").Resize(x, y).Value = catalSh.Range("B4").Resize(k, catalCol).Value
                x = x + 1
                k = k + 1
            Else
            End If
        Wend
     
        y = y + 1   ' col frs
        catalCol = catalCol + 2   ' col catal
    Wend


    Les colonnes de "catalSh" sont les bonnes (une sur 2 à partir de "B"), mais j'ai les résultats en colonnes J, L, M... de "frs"soit une colonne sur 2, multiples essais sans comprendre.

    Le contenu des lignes est cependant correct
    Il ne savait pas que c'était impossible, donc il l' a fait...

  4. #4
    Expert confirmé
    Bonjour,

    "y" n'est pas défini !
    Ne confondrait-tu pas resize et offset :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    ___.Resize(x, y).Value = ___.Resize(k, catalCol).Value

    Pour que cette ligne fonctionne il faudrait que x = k et y = catalCol
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  5. #5
    Membre actif
    y est défini avant (y = 1)

    le pb est que x # a et y # catalCol

    Je ne connais ni resize ni offset, alors peut être que c'est offset à utiliser...
    Il ne savait pas que c'était impossible, donc il l' a fait...

  6. #6
    Expert confirmé
    Citation Envoyé par retraite83 Voir le message
    Je ne connais ni resize ni offset, ...
    Quand tu connais pas, tu cliques sur le mot et il y a la touche magique : F1
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  7. #7
    Membre actif
    J'ai fait qq test avec offset, vu merci, mais cela ne permet pas de copier une plage d'une feuille vers une autre d'un autre classeur ?

    mon pb de base est de copier une plage d'une feuille vers une feuille d'un autre classeur avec des colonnes dynamique et lignes dynamiques (ça je sais faire pour les lignes)
    Il ne savait pas que c'était impossible, donc il l' a fait...

  8. #8
    Expert éminent sénior
    Je t'ai donné la méthode. A toi d'aller regarder dans l'aide VBA la description de Resize et de faire des essais.
    Après 210 demandes sur le forum Excel (et 0 aide apportée à un autre demandeur ), tu devrais être en mesure de faire ça, non ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  9. #9
    Expert confirmé
    Re,

    Un 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
    Option Explicit
    Sub test()
    Dim r As Range
    Dim c As Range
    Dim nL As Long, pL As Long, pC As Long, dL As Long, dC As Long
      pL = 2: dL = 20
      pC = 1: dC = 10
      Set c = Workbooks(2).Worksheets(3).Range("B12")  'destination
      With Workbooks(1).Worksheets(1)
        For nL = pL To dL
          Set r = .Range(.Cells(nL, pC), .Cells(nL, dC))
          c.Resize(r.Rows.Count, r.Columns.Count).Value = r.Value
          Set c = c.Offset(1)
        Next nL
      End With
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  10. #10
    Membre actif
    Comment peut-on porter assistance aux autres personnes ?
    Il ne savait pas que c'était impossible, donc il l' a fait...

  11. #11
    Expert éminent sénior
    Citation Envoyé par retraite83 Voir le message
    Comment peut-on porter assistance aux autres personnes ?
    Tu lis leurs demandes et tu essayes de trouver une réponse à leurs questions.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  12. #12
    Membre actif
    tout simplement, merci je vais faire dans la limite de mes compétences

    pour ma questions, merci de toutes les réponses,

    voilà le code probablement pas le meilleur pour copier les colonnes B, D, F etc à partir de la ligne 4 d'une feuille dans les colonnes J,K,L etc à partir de la ligne 1 d'une autre feuille
    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
    premlig = 4 ' 1ere ligne "catalSh"
    premcol = 2 ' 1ere colonne "catalSh"
    colDest = 10 ' col J
    dercol = catalSh.Cells(4, Columns.Count).End(xlToLeft).Column
    Set dest = frs.Range("J1")  'destination
     
    While dercol >= premcol
        With catalSh.Cells(Rows.Count, premcol).End(xlUp).MergeArea: derlig = .Cells(.Cells.Count).Row: End With
     
        For i = premlig To derlig
          Set r = catalSh.Range(catalSh.Cells(i, premcol), catalSh.Cells(i, premcol))
          dest.Resize(r.Rows.Count, r.Columns.Count).Value = r.Value
          Set dest = dest.Offset(1)
        Next i
     
        k = -i + 3 + 1
        Set dest = dest.Offset(k, 1)
        premcol = premcol + 2
    Wend
    Il ne savait pas que c'était impossible, donc il l' a fait...