XL 2021 code que je n'arrive pas à faite fonctionner avec Range("ActiveCell.Offset(0, 0).Resize(10, 1)")

Usine à gaz

XLDnaute Barbatruc
Bonjour à toutes et à tous :)

Grrrr !!! encore dans les choux :mad:

Mon besoin
dans ce fichier "test1"il me faut importer des valeurs du classeur "test2" (les 2 fichiers sont ouverts)
J'ai trouvé sur le net (le lien est en haut dans le classeur) comment le faire
Ce code fonctionne nickel
VB:
Sub Macro1()
Workbooks("test1").Sheets("Feuil1").Range("a2:a100") = Workbooks("test2").Sheets("Feuil1").Range("l2:l100").Value
End Sub

En revanche, j'ai besoin de coller à partir de la cellule active dans mon fichier "test1"
J'ai fait ce code
Code:
Sub Macro1()
Workbooks("test1").Sheets("Feuil1").Range("ActiveCell.Offset(0, 0).Resize(10, 1)") = Workbooks("test2").Sheets("Feuil1").Range("l2:l100").Value
End Sub
Qui beug avec cette information
1695474793232.png

Je n'arrive pas à trouver mon erreur.

Pourriez-vous m'aider ?
En cas, je joins les 2 fichiers test

Un grand merci à toutes et à tous :)
 

Pièces jointes

  • test1.xlsm
    18.3 KB · Affichages: 7
  • test2.xlsm
    8.5 KB · Affichages: 8

laurent950

XLDnaute Barbatruc
Bonjour @Usine à gaz , @vgendron , @Staple1600 , @TooFatBoy Le forum

Pour @Usine à gaz

RESIZE
OFFSET
Les combinaisons gagnantes :)

Ce n'a plus de rapport avec le lien entre les deux classeur, mais je lui est fait un exemple plus parlant est complet

Exécute la macro en Pas a Pas avec le mode débugage, tu va comprendre Lionel

VB:
Sub ResizeEtOffset()
' Le Classeur Test 2 / La Feuille 1 / Une Plage défini
Dim Wkb As Workbook
Dim Wks As Worksheet
    Set Wkb = Workbooks("Resize et Offset.xlsm")
    Set Wks = Wkb.Worksheets("Feuil1")
' Une Plage défini Colonne I2 (Ligne 2 / colonne I) à M100 (Lignes 100 / colonne M)
Dim Rgn As Range
    Set Rgn = Wks.Range("A1:E100")
' On Commence les Tests
' ActiveCell sera dans ce cas la cellule active choisie dans
'            Le Classeur Resize et Offset.xlsm" de la Feuille 1
'            Pour le Test on Choisie la H1'
' Récupérer les donner du Classeur Test2 de la Feuille 1 qui sont les valeurs de cette plage
' "A1:E100"
'
' Avec ----->>>>   RESIZE
'
'
' Pour le test
'
' Nettoyage de la zone
'
'
    Cells(1, 8).Offset(, -1).Resize(43, 7).Select
    MsgBox "Cells(1, 8).Offset(, -1).Resize(43, 7).Address " & vbCrLf & Cells(1, 8).Offset(, -1).Resize(43, 7).Address
    Cells(1, 8).Offset(, -1).Resize(43, 7).ClearContents
'
'
' La premiére cellule sera H1
'
 Cells(1, 8).Select ' H1 pour ActiveCell
'
'
' Je souhaite récupérer la premiéres Lignes (1) à la Lignes (10) de la colonnes (A)
'       Resize(10,1)
'              10 = 10 lignes de la Premiére Ligne à la 10éme Ligne ---->>> par rapport a "A1"
'               1 = 1   Colonnes de la Premiére colonne à la premiére colonnes ---->>> par rapport a "A1"
        ActiveCell.Resize(10, 1).Value = Rgn.Value ' Les 10 premiéres Lignes de la premiére (1) Colonnes (A)
'        ActiveCell.Resize(10, 1).ClearContents
'
'
' Cette Fois
'
'
 ActiveCell.Offset(, 2).Select  ' Decalage de 2 Colonnes
'
'
' Je souhaite récupérer la premiéres Lignes (1) à la Lignes (10) de la colonnes (A à D)
'       Resize(10,4)
'              10 = 10 lignes de la Premiére Ligne à la 10éme Ligne ---->>> par rapport à "A1"
'               4 = 4  Colonnes de la Premiére colonne à la colonnes 4 ---->>> par rapport à "A1"
        ActiveCell.Resize(10, 4).Value = Rgn.Value ' 10 premiéres Lignes sur 3 Colonnes
'        ActiveCell.Resize(10, 4).ClearContents
'
'
'
 ActiveCell.Offset(12, -3).Select  ' Decalage de 11 Lignes avec un décalage de 3 Colonnes vers la gauche
'
'

' Mais maintenat je veux de la colonne C et D Comment Faire - ?
' C'est la que Offset arrive !!
'
'
' Je souhaite récupérer la premiéres Lignes (1) à la Lignes (10) de la colonnes (C à D )
' Alors :
'       Resize(10,2)
'              10 = 10 lignes de la Premiére Ligne à la 10éme Ligne ---->>> par rapport à "A1"
'               2 = 2  Colonnes de la Premiére colonne à la colonnes 2 ---->>> par rapport à "A1"
' Puis :
'      : Offset(0, 2) dans l'exemple : "A1:E100" - "A1" est la premiére cellule référence de la plage
'                0 = aucun décalage pour les lignes par rapport a "A1"
'                2 =   2   décalages de colonnes par rapport à "A1" soit 2 décalages commence à "C2"
        ActiveCell.Resize(10, 2).Value = Rgn.Offset(0, 2).Value ' 10 premiéres Lignes sur 2 Colonnes
'        ActiveCell.Resize(10, 2).ClearContents
'
'
'
 ActiveCell.Offset(, 4).Select  ' Decalage de 0 Lignes avec un décalage de 4 Colonnes vers la droite
'
'
'
'
' Maintenant je souhaite récupérer après la premiére ligne de cette plage "A1:E100"
'
'            Je souhaite récupérer de la la ligne 11 à la Ligne 20, Mais sur les colonne B à D
'
'
' Je souhaite récupérer de Lignes (11) à la Lignes (20) sur la colonnes (B à D )
' Alors :
'       Resize(10,3)
'              10 = 10 lignes de la 11éme Lignes à la 20éme Ligne ---->>> par rapport à "A1"
'               3 = 3  Colonnes de la 2éme colonnes à la colonnes 4éme ---->>> par rapport à "A1"
' Puis :
' Alors : Offset(10, 1) dans l'exemple : "A1:E100" - "A1" est la premiére cellule référence de la plage
'                10 = 10   décalage pour les lignes par rapport a "A1"
'                1 =   1   décalages de colonnes par rapport à "A1" soit 1 décalages commence à "B2"
        ActiveCell.Resize(10, 3).Value = Rgn.Offset(10, 1).Value ' Lignes 11 Lignes à la Ligne 20 sur 2 Colonnes
'        ActiveCell.Resize(10, 3).ClearContents
'
'
'
 ActiveCell.Offset(12, 0).Select  ' Decalage de 11 Lignes avec un décalage de 0 Colonnes vers la droite
'
'
' Je souhaite récupérer la Lignes (8) à la Lignes (8) sur la colonnes (B à D )
' Alors :
'       Resize(1,3)
'              1 = 1 lignes de la 8éme Lignes à la 8éme Ligne ---->>> par rapport à "A1"
'              3 = 3  Colonnes de la 2éme colonnes à la colonnes 4éme ---->>> par rapport à "A1"
' Alors : Offset(7, 1) dans l'exemple : "A1:E100" - "A1" est la premiére cellule référence de la plage
'                7 =   7   décalage pour les lignes par rapport a "A1"
'                1 =   1   décalages de colonnes par rapport à "A1" soit 1 décalages commence à "B2"
        ActiveCell.Resize(1, 3).Value = Rgn.Offset(7, 1).Resize(1, 1).Value ' Lignes 11 Lignes à la Ligne 20 sur 2 Colonnes
'        ActiveCell.Resize(1, 3).ClearContents
'
'
'
'
 ActiveCell.Offset(3, -4).Select  ' Decalage de 2 Lignes avec un décalage de 4 Colonnes vers la Gauche
'
'
'
'  Maintenant récupérer une plage au Milieux de cette plage
'  L'exemple
'  Plage a récupérer dans la plage "A1:E100"
'
'
'   Plage a récupérer est "B14:D29"
'
'
'  Il Faut Appliquer 2 RESIZE Maintenant ci dessous
'
'
' Je souhaite récupérer la Lignes (14) à la Lignes (29) sur la colonnes (B à D )
' Alors : soit (Lignes 29 - Lignes 14) = (15 + 1) soit (16 Lignes) sur 3 Colonnes
'       Resize(16,3)
'              16 = 16 lignes de la 14éme Lignes à la 29éme Lignes ---->>> par rapport à "A1"
'              3 = 3  Colonnes de la 2éme colonnes à la colonnes 4éme ---->>> par rapport à "A1"
' Alors : Offset(13, 1) dans l'exemple : "A1:E100" - "A1" est la premiére cellule référence de la plage
'                13 =   13   décalage pour les lignes par rapport a "A1"
'                1 =   1   décalages de colonnes par rapport à "A1" soit 1 décalages commence à "B2"
        ActiveCell.Resize(16, 3).Value = Rgn.Offset(13, 1).Resize(16, 3).Value ' Lignes 11 Lignes à la Ligne 20 sur 2 Colonnes
'        ActiveCell.Resize(16, 3).ClearContents
' Etc.
End Sub
 

Pièces jointes

  • Resize et Offset.xlsm
    25.8 KB · Affichages: 2

RyuAutodidacte

XLDnaute Impliqué
Bonjour le fil,

@Usine à gaz
J'ai voulu faire les explications autrement en partant de l'enregistreur de macro :

L'enregistreur de macro :
VB:
Sub Exemple()

' Exemple Macro

    Range("L2:L4").Select
    Selection.Copy
    Range("A2").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
End Sub

On commence à optimiser le code par évolution :
  1. VB:
    Sub ExempleEvolution1()
        Range("L2:L4").Copy
        ActiveSheet.Range("A2").PasteSpecial Paste:=xlPasteValues
    End Sub
  2. VB:
    Sub ExempleEvolution2()
        ActiveSheet.Range("A2:A4").Value = Range("L2:L4").Value ' A2:A4 et le même type de plage
      
        MsgBox "Le Nombre de lignes est identique : " & CStr([A2:A4].Rows.Count = [L2:L4].Rows.Count)
      
        MsgBox "Le Nombre de colonnes est identique : " & CStr([A2:A4].Columns.Count = [L2:L4].Columns.Count)
      
      MsgBox "Donc comme on a le même nombre de lignes et de colonnes," & vbNewLine & _
                "les 2 plages sont équivalentes et on peut faire correspondre" & vbNewLine & _
                "les valeurs de L2 à L4 en A2 à A4"
    End Sub
  3. VB:
    Sub ExempleEvolution3()
        'on fait correpondre les feuilles - ici noms identiques
        ' PS : jusqu'à évolution 3 on est sur le même classeur
        Sheets("Feuil1").Range("A2:A4").Value = Sheets("Feuil1").Range("L2:L4").Value
    End Sub
  4. VB:
    Sub ExempleEvolution4()
        'on fait correpondre en plus des feuilles, les classeurs - ici noms différents - les classeurs son ouverts
        Workbooks("test1.xlsm").Sheets("Feuil1").Range("A2:A4").Value = Workbooks("test2.xlsm").Sheets("Feuil1").Range("L2:L4").Value
    End Sub
  5. VB:
    Sub ExempleEvolution5()
    Dim MaPlageACopier As Range, Lignes As Integer, Colonnes As Integer
    'Ici on va assigner la plage que l'on veut copier et on va Faire le resize mais décortiqué
    
        Set MaPlageACopier = Workbooks("test2.xlsm").Sheets("Feuil1").Range("L2:L4") ' on assigne la plage
      
        ' pour le Resize on va prendre en compte la taille de MaPlageACopier (donc prendre en compte des ligne et colonnes)
        Lignes = MaPlageACopier.Rows.Count:     MsgBox "Nombre de lignes de MaPlageACopier est de : " & Lignes
        Colonnes = MaPlageACopier.Columns.Count:        MsgBox "Nombre de colonnes de MaPlageACopier est de : " & Colonnes
      
        'Si tu veux que cela se colle directement en A2 de test1 => Cells(ligne, colonne) => Cells(2,1)
        Workbooks("test1.xlsm").Sheets("Feuil1").Cells(2, 1).Resize(Lignes, Colonnes).Value = MaPlageACopier.Value
      
        'En schématisantle Resize peut être représenter comme cela :
        ' => Resize(NbLignesDeMaPlageACopier, NbColonnesDeMaPlageACopier)
      
        Set MaPlageACopier = Nothing 'on libère la mémoire en mettant MaPlageACopier à Nothing
    End Sub
La version de @job75 pourrait être ExempleEvolution6

Pour Offset en schématisant :
MaPlage.Offset(DecaleLigne, DecaleColonne)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir @RyuAutodidacte
Re

@Usine à gaz
Ceci aussi fonctionne
(mais ce n'est pas forcément judicieux)
Code:
Sub test_ok_bis()
With Workbooks("Classeur3").Worksheets("Feuil1").Range("I2:I100")
Workbooks("Classeur2").Worksheets("Feuil1").Cells(ActiveCell.Row, ActiveCell.Column).Resize(.Rows.Count) = .Value
End With
End Sub
Quid de cette version proche syntaxiquement d'Evolution6 ?
(la sécurité en moins)
(mais qui apparaissait dès le message#5)
A l'époque, où Lionel disait que cela ne fonctionnait pas
;)
 

Discussions similaires

  • Question
Microsoft 365 Code VBA
Réponses
2
Affichages
454

Statistiques des forums

Discussions
315 095
Messages
2 116 167
Membres
112 675
dernier inscrit
Tazra_IMOU