Microsoft 365 Variable sans guillemets

etpisculrien

XLDnaute Occasionnel
Bonjour à toutes et à tous

J'ai un petit problème de variable dans une formule RechercheV, et j'aurais besoin de l'intelligence collective de ce salon.
Je vous explique :
Je demande à l'utilisateur de choisir un fichier Excel
'Appel à ouvrir le fichier
FichierMACRO = ThisWorkbook.Name
alerte = MsgBox("Veuillez selectionner le fichier ACCOR", vbOKCancel + vbQuestion)
If alerte = vbCancel Then GoTo fin

FichierACCOR = Application.GetOpenFilename("Fichiers Excel (*.xl*), *.xl*")
If FichierACCOR = False Then
MsgBox "Vous n'avez pas sélectionné de fichier, la procédure est arrêtée"
GoTo fin
End If
Application.ScreenUpdating = False
Workbooks.Open Filename:=FichierACCOR
nomfichierACCOR = Right(FichierACCOR, Len(FichierACCOR) - InStrRev(FichierACCOR, "\"))
Workbooks(nomfichierACCOR).Activate
nomfeuilACCOR = ActiveSheet.Name

Puis je souhaite executer la macro qui me permet de faire une rechercheV dans ma feuille
ActiveCell.FormulaR1C1 ="=VLOOKUP(RC[-4],'[Facturation_ACCOR - 4ème trimestre 2022.xls]Feuil1'!C1:C3,2,FALSE)"

Je souhaite intégrer mon nomfichierACCOR à la place de Facturation_ACCOR - 4ème trimestre 2022.xls mais ma variable contient des guillemets, ce qui fait que ça plante ma formule. Si quelqu'un a une idée, je suis preneur

Merci à tous pour votre aide
 
Solution
Notez donc les entités impliquées elles mêmes par des Set dans des variables objet appropriées plutôt que leurs noms Excel, lesquels obligent à les reconstituer par consultation de leurs collections pour pouvoir les appliquer. Ce n'est toujours pas clair, parce qu'on a toujours l'impression que vous appliquer la formule dans le classeur même qui vient d'être ouvert et qu'il est donc inutile d'y employer une référence externe.
Au début :
VB:
    Dim RngRapport As Range
    Workbooks.Open Filename:=FichierRAPPORT
    Set RngRapport = ActiveSheet.[A5].Resize(ActiveSheet.[A65000].End(xlUp).Row - 4, 3)
Pour mettre une référence externe quand ce ne sera plus le classeur actif vous n'aurez plus qu'à utiliser RngRapport.Address(True, True, xlR1C1...

Dranreb

XLDnaute Barbatruc
Bonjour.
Essayez ça :
VB:
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-4],'[" & Replace(FichierACCOR, "'", "''') & "]Feuil1'!C1:C3,2,FALSE)"
Mais je crois que je préfèrerais encore quelque chose du genre
Code:
Target.FormulaR1C1 = "=VLOOKUP(RC[-4]," & ActiveSheet[A:C].Address(True, True, xlR1C1, True) & ",2,FALSE)"
Target, As Range, ayant été initialisé par un Set à une expression représentant la cellule où on veut mettre la formule.
 

etpisculrien

XLDnaute Occasionnel
Bonjour,
Peut être comme ceci
ActiveCell.FormulaR1C1 ="=VLOOKUP(RC[-4],'[" & nomfichierACCOR & ".xls]Feuil1'!C1:C3,2,FALSE)"

Le nomfichierACCOR restant une variable
Bruno
Bonjour Bruno

Malheureusement, j'ai essayé comme ça mais ça ne fonctionne pas car la variable est "Facturation_ACCOR - 4ème trimestre 2022.xls" (avec des guillemets) alors qu'il n'y en a pas dans la formule Excel
 

etpisculrien

XLDnaute Occasionnel
Bonjour.
Essayez ça :
VB:
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-4],'[" & Replace(FichierACCOR, "'", "''') & "]Feuil1'!C1:C3,2,FALSE)"
Mais je crois que je préfèrerais encore quelque chose du genre
Code:
Target.FormulaR1C1 = "=VLOOKUP(RC[-4]," & ActiveSheet[A:C].Address(True, True, xlR1C1, True) & ",2,FALSE)"
Target, As Range, ayant été initialisé par un Set à une expression représentant la cellule où on veut mettre la formule.
Bonjour

Merci pour vos proposition mais cela ne fonctionne pas, j'ai des erreurs d'execution...
 

Dranreb

XLDnaute Barbatruc
Joignez votre classeur.
Ce n'est pas clair votre histoire. Vous mettez votre formule dans ActiveCell, or celle ci a changé puisque vous avez ouvert un fichier. Il faudrait la noter préalablement dans une variable déclarée As Range.
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Non, il n'y a pas de guillemets dans ta variable.

VB:
' Ouverture du fichier
Workbooks.Open Filename:=FichierACCOR

' Récupération du nom du fichier qui vient d'être ouvert
' ActiveWorkbook.Name fait peut-être la même chose
nomfichierACCOR = Right(FichierACCOR, Len(FichierACCOR) - InStrRev(FichierACCOR, "\"))

' Activation du fichier qui vient d'être ouvert
' Pas sûr que ce soit utile car je crois que ça se fait automatiquement
Workbooks(nomfichierACCOR).Activate

' Récupération du nom de la feuille active du fichier qui vient d'être ouvert
nomfeuilACCOR = ActiveSheet.Name

' Puis je souhaite executer la macro qui me permet de faire une rechercheV dans ma feuille
ActiveCell.FormulaR1C1 ="=VLOOKUP(RC[-4],'[[B]Facturation_ACCOR - 4ème trimestre 2022.xls[/B]]Feuil1'!C1:C3,2,FALSE)"
Il me semble qu'il n'y a pas d'intérêt à mettre le nom du classeur puisque la formule se trouve dans ledit classeur. Ça alourdi la formule pour rien.

Écrire directement dans la cellule active du fichier qui vient d'être ouvert est pour le moins étonnant puisque, si je ne me trompe, la cellule active c'est celle qui était active lors du dernier enregistrement du classeur, donc ça peut être n'importe quelle cellule du classeur.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui mais je crois que quand il met ActiveCell, il pense encore à la cellule qui était active avant qu'il n'ouvre ce classeur !
Exemple de code :
VB:
Option Explicit

Sub VLookUpACCOR()
   Dim CelCible As Range, FichierACCOR As Variant, NomFicACCOR As String, RngSource As Range
   Set CelCible = ActiveCell
   FichierACCOR = Application.GetOpenFilename("Fichiers Excel (*.xl*), *.xl*", _
      Title:="Fichier ACCOR pour RECHERCHEV")
   If VarType(FichierACCOR) = vbString Then
      On Error Resume Next
      NomFicACCOR = Mid$(FichierACCOR, InStrRev(FichierACCOR, "\") + 1)
      Workbooks(NomFicACCOR).Activate
      If Err Then
         Err.Clear: Workbooks.Open Filename:=FichierACCOR
      ElseIf ActiveWorkbook.FullName <> FichierACCOR Then
         Workbooks(NomFicACCOR).Close SaveChanges:=False
         Err.Clear: Workbooks.Open Filename:=FichierACCOR
         End If
      If Err Then MsgBox Err.Description, vbCritical, "VLookUpACCOR": Exit Sub
      On Error GoTo 0
      Set RngSource = Cells(1, 1).Resize(Cells(1000000, 1).End(xlUp).Row, 2)
      CelCible.FormulaR1C1 = "=VLOOKUP(RC[-4]," & RngSource.Address(RowAbsolute:=True, ColumnAbsolute:=True, _
         ReferenceStyle:=xlR1C1, External:=True) & ",2,FALSE)"
      Application.Goto CelCible
   Else
      MsgBox "Pas de fichier ACCOR sélectionné", vbCritical, "VLookUpACCOR"
      End If
   End Sub
 

etpisculrien

XLDnaute Occasionnel
Vous avez raison, ce sera p-e plus simple avec le fichier
Je joins donc la macro, le fichier SQL (premier fichier à aller chercher) et le fichier ACCOR (le deuxième fichier à ouvrir)...

là où je bloque, c'est sur les 2 dernières lignes, dans lesquelles je voudrais ne pas avoir le nom du fichier en "dur" mais plutot le nom du fichier que l'on vient de télécharger
 

Pièces jointes

  • Fichier ACCOR.xlsx
    175.8 KB · Affichages: 1
  • Fichier SQL.xls
    46 KB · Affichages: 1
  • Macro ACCOR v3.xlsm
    22.7 KB · Affichages: 1

Dranreb

XLDnaute Barbatruc
Notez donc les entités impliquées elles mêmes par des Set dans des variables objet appropriées plutôt que leurs noms Excel, lesquels obligent à les reconstituer par consultation de leurs collections pour pouvoir les appliquer. Ce n'est toujours pas clair, parce qu'on a toujours l'impression que vous appliquer la formule dans le classeur même qui vient d'être ouvert et qu'il est donc inutile d'y employer une référence externe.
Au début :
VB:
    Dim RngRapport As Range
    Workbooks.Open Filename:=FichierRAPPORT
    Set RngRapport = ActiveSheet.[A5].Resize(ActiveSheet.[A65000].End(xlUp).Row - 4, 3)
Pour mettre une référence externe quand ce ne sera plus le classeur actif vous n'aurez plus qu'à utiliser RngRapport.Address(True, True, xlR1C1, External:=True)
Code:
    Range("E2").Formula2R1C1 = "=VLOOKUP(RC1," & RngRapport.Address(True, True, xlR1C1, True) & ",2,FALSE)"
    Range("F2").FormulaR1C1 = "=VLOOKUP(RC1," & RngRapport.Address(True, True, xlR1C1, True) & ",3,FALSE)"
 
Dernière édition:

etpisculrien

XLDnaute Occasionnel
Notez donc les entités impliquées elles mêmes par des Set dans des variables objet appropriées plutôt que leurs noms Excel, lesquels obligent à les reconstituer par consultation de leurs collections pour pouvoir les appliquer. Ce n'est toujours pas clair, parce qu'on a toujours l'impression que vous appliquer la formule dans le classeur même qui vient d'être ouvert et qu'il est donc inutile d'y employer une référence externe.
Au début :
VB:
    Dim RngRapport As Range
    Workbooks.Open Filename:=FichierRAPPORT
    Set RngRapport = ActiveSheet.[A5].Resize(ActiveSheet.[A65000].End(xlUp).Row - 4, 3)
Pour mettre une référence externe quand ce ne sera plus le classeur actif vous n'aurez plus qu'à utiliser RngRapport.Address(True, True, xlR1C1, External:=True)
Code:
    Range("E2").Formula2R1C1 = "=VLOOKUP(RC1," & RngRapport.Address(True, True, xlR1C1, True) & ",2,FALSE)"
    Range("F2").FormulaR1C1 = "=VLOOKUP(RC1," & RngRapport.Address(True, True, xlR1C1, True) & ",3,FALSE)"
Merci beaucoup pour ton aide, ça marche au poil!
Et merci aux autres de s'être penché sur mon problème
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 491
Messages
2 110 180
Membres
110 690
dernier inscrit
Zeppelin