Microsoft 365 VBA: ouvrir un fichier en n'indiquant que le début du nom

Aloha

XLDnaute Accro
Bonjour,

J'ai réussi à fabriquer un code qui ouvre un certain fichier. Seulement, comme le nom du fichier change tous les mois j'ai dû renommer le fichier.

Deux situations:

1. il n'y a qu'un seul fichier dans le dossier et la première partie du nom est invariable
Comment dois-je modifier le code pour que le fichier présent à ce moment s'ouvre.
Le nom du fichier actuel: Var_0020_Jan; le mois prochain ce sera Var_0020_Fév, etc.
J'ai essayé avec
VB:
Dim strpfad As String
strpfad = ActiveWorkbook.Path
Workbooks.Open Filename:="Var_0020_*.xlsx"
mais ça ne fonctionne pas.

2. Autre situation alternative, un peu plus complexe: je laisse tous les fichiers ensemble dans le dossier et l'utilisateur choisit par VBA le fichier à ouvrir, ce qui n'obligerait pas à ranger les anciens fichiers.

J'aurais besoin de coup de main pour ça.

Bien à vous
Aloha
 

job75

XLDnaute Barbatruc
Bonsoir Aloha, sylvanu,

Pour la 1ère question :
VB:
Dim chemin As String, fichier As String
chemin = ThisWorkbook.Path & "\"
fichier = Dir(chemin & "Var_0020_*.xlsx")
If fichier <> "" Then Workbooks.Open chemin & fichier
A+
 

job75

XLDnaute Barbatruc
Pour la 2ème question :
VB:
Dim chemin As String, fichier As Variant
chemin = ThisWorkbook.Path & "\"
fichier = Format(Date, "mm/yy")
Do
    fichier = InputBox("Entrez le mois et l'année au format mm/aa :", "Ouvrir", fichier)
    If fichier = "" Then Exit Sub
Loop While Not fichier Like "##/##" Or Left(fichier, 2) > "12"
fichier = CDate("1/" & fichier) 'date
fichier = "Var_00" & Format(fichier, "yy") & "_" & Application.Proper(Left(Format(fichier, "mmm"), IIf(Month(fichier) = 7, 4, 3))) & ".xlsx"
If Dir(chemin & fichier) <> "" Then Workbooks.Open chemin & fichier Else MsgBox "'" & chemin & fichier & "' introuvable !", 48
 
Dernière édition:

Aloha

XLDnaute Accro
Bonjour,

Dans le même contexte:
J'ai une base de données qui s'étend de A2:BV2000 remplie au fur et à mesure de la progression de l'année.
Dans cette BD il y a en colonne A le mois et l'année, en colonne B nom et prénom, puis des chiffres dans toutes les autres colonnes, y collés par VBA.
Je dois copier certains chiffres dans le fichier "Var_0020_..." (Classeur1 dans cet exemple) en me basant non pas sur le nom et le prénom, parce qu'il y a des problèmes (irrésolubles manque de coopération efficace et fiable d'une tierce partie) de l'orthographe du nom et prénom, mais sur un code de 6 chiffres identifiant les personnes.

Ma tâche: introduire ces codes moyennant une formule bien lourde. A cause de cette lourdeur je voudrais alléger la tâche d'Excel en ne mettant les formules que dans l'aire remplie en dernier, pour les remplacer ensuite par leur valeur.

Ce qui fonctionne depuis belle lurette c'est la copie des données par VBA dans les colonnes A:BV, les groupes étant toujours séparés par un "/" en A.

Mettons que les données s'étendaient depuis la dernière copie de A3:BV17, et que les formules, aient été introduites dans BW3:BW17, puis remplacées par leur valeur.

Puis, de nouvelles données sont copiées dans A18:BV42.

Dans BW il manque donc les formules dans BW18:BW42.

J'ai réussi à déterminer par VBA la première cellule vide en BW, donc BW18, par prem_ligne_vide_BW et la dernière à devoir être remplie de la formule, qui correspond donc à la dernière remplie en A (dern_ligne_remplie_A).
J'ai réussi à placer la première formule en BW18, mais mon code pour remplir vers le bas cloche:

Donc, si je remplissais à la main et que je copierais vers le bas de la première à la dernière cellule en donnant les références des cellules, cela donnerait:

Selection.AutoFill Destination:=Range("BW332:BW445"), Type:=xlFillDefault

J'ai essayé différents codes, le dernier étant:

Selection.AutoFill Destination:=Range("BW" & prem_ligne_vide_BW & ":" & "BW" & dern_ligne_remplie_A), Type:=xlFillDefault

Ma question:
Comment dois-je définir la Range dans le cas où les références à 2 cellules déterminées BW18:BW42 sont remplacées par les deux variables prem_ligne_vide_BW et dern_ligne_remplie_A?

Bien à vous
Aloha
 

Pièces jointes

  • Classeur1.xlsm
    29.2 KB · Affichages: 4
Dernière édition:

Aloha

XLDnaute Accro
Re,
J'ai trouvé moi-même:

VB:
Selection.AutoFill Destination:=Range("BW" & prem_ligne_vide_BW & ":BW" & dern_ligne_remplie_A), Type:=xlFillDefault

Seulement, je me rends compte d'un autre problème, qui est évident mais auquel je n'avais pas pensé:
C'est toujours la même formule qui est collée, sans adaptation à la ligne actuelle.

Que dois-je changer dans la formule pour que, si je la colle p. ex. dans la cellule BW18, les références soient celles de la ligne 18 et non pas celles telles qu'indiquées dans la formule dans VBA?

Le bout de code qui colle la formule provient de l'enregistreur macro Il se peut que je m'y sois mal pris: j'ai copié la formule, l'enregistreur tournant, et je l'ai collée dans la première cellule.
J'aurais peut-être dû la coller dans un éditeur, la copier de là et la coller dans le code enregistré telle qu'elle apparaît dans la cellule?
 
Dernière édition:

Aloha

XLDnaute Accro
Bonsoir,

J'ai aussi résolu ce problème.

J'avais encore rencontré le problème survenant dans la situation où il n'y a pas encore de données en BW, mais seulement le titre en BW1; dans ce cas VBA considérait la dernière ligne possible, la ligne >1 000 000 comme première ligne.
En expérimentant j'avais découvert que, dans le cas où la cellule BW2 n'est pas vide, le code fonctionne. J'ai alors ajouté un bout de code inscrivant un espace en BW2; il le fait à chaque opération; j'avais encore expérimenté avec
VB:
If IsEmpty(Range("BW3").Value) = True Then [BW3 est la première cellule]
mais cela n'a pas fonctionné.
Pas très élégant mais ça marche.

Bonne nuit
Aloha
 

Pièces jointes

  • Classeur2.xlsm
    28.4 KB · Affichages: 4

eriiic

XLDnaute Barbatruc
Bonjour à à tous,

je suis resté sur la 1ère question, je n'avais pas vu tout ce qui s'était écrit ensuite.
Si tu veux avoir tous tes fichiers dans le même dossier :
VB:
Sub test()
    'Var_0020_Jan; le mois prochain ce sera Var_0020_Fév
    Const listeMois As String = "Jan,Fév,Mar,Avr,Mai,Jun,Jui,Aou,Sep,Oct,Nov,Déc"
    Dim mois As Long
    mois = 2
    Debug.Print "Var_0020_" & Split(listeMois, ",")(mois - 1)
End Sub
Si 20 est l'année, tu peux variabiliser cette partie.
eric
 

Aloha

XLDnaute Accro
Bonjour,
Merci pour ce code que je viens d'adapter et qui fonctionne.
Seulement, il manque l'ouverture du fichier.
Lorsque j'ajoute
VB:
Workbooks.Open ("Var_0020_" & Split(listeMois, ",")(mois - 1) & ".XLSX")
alors je reçois un message d'erreur disant que Excel ne trouve pas le fichier Var_0020_Fév.xlsx, alors que le nom est bien correct, que le fichier est présent et qu'Excel cherche bien dans le bon dossier (...ActiveWorkbook.Path & "\").
La fenêtre "Exécution" affiche aussi le nom correct du fichier. "xlsx" est aussi le format correct.
Où peut-être l'erreur?
Bonne journée
Aloha
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Aloha, eriiiic,

Ah oui mon post #4 ne permettait pas de distinguer Juin et Juillet.

Pour y parvenir je viens de remplacer :
VB:
fichier = "Var_00" & Format(fichier, "yy") & "_" & Application.Proper(Left(Format(fichier, "mmm"), 3)) & ".xlsx"
par :
VB:
fichier = "Var_00" & Format(fichier, "yy") & "_" & Application.Proper(Left(Format(fichier, "mmm"), IIf(Month(fichier) = 7, 4, 3))) & ".xlsx"
qui utilise les 4 lettres Juil en Juillet au lieu de 3 les autres mois.

A+
 

Aloha

XLDnaute Accro
Bonsoir,

Merci!
Nouveau problème, toujours dans le même contexte: remplacer dans une formule la référence à un fichier par une variable définissant le fichier.

VB:
ActiveCell.FormulaR1C1 = _
        "=IF(ISNA(VLOOKUP(--RC1,NDJF.xlsx!R6C1:R100C10,4,0)),0,VLOOKUP(--RC1,NDJF.xlsx!R6C1:R100C10,4,0))"

Admettons que la variable s'appelle TEST, comment puis-je remplacer la référence au fichier NDF.xlsx par la variable dans cette formule?
Donc TEST = NDJF.xlsx

J'ai essayé
Code:
ActiveCell.FormulaR1C1 = _  "=IF(ISNA(VLOOKUP("RC1," & TEST & "!R6C1:R100C10,4,0)),0,VLOOKUP(--RC1," & TEST & "!R6C1:R100C10,4,0))""
mais ça ne fonctionne pas.

UPDATE:
J'ai trouvé:

Code:
ActiveCell.FormulaR1C1 = _  "=IF(ISNA(VLOOKUP(RC1," & TEST & "!R6C1:R100C10,4,0)),0,VLOOKUP(--RC1," & TEST & "!R6C1:R100C10,4,0))"

et ça marche!
A+
Aloha
 
Dernière édition:

eriiic

XLDnaute Barbatruc
<re,
je reçois un message d'erreur disant que Excel ne trouve pas le fichier Var_0020_Fév.xlsx, alors que le nom est bien correct, que le fichier est présent et qu'Excel cherche bien dans le bon dossier (...ActiveWorkbook.Path & "\").
La fenêtre "Exécution" affiche aussi le nom correct du fichier. "xlsx" est aussi le format correct.
Je ne vois pas le chemin dans :
VB:
Workbooks.Open ("Var_0020_" & Split(listeMois, ",")(mois - 1) & ".XLSX")
et pourquoi .XLSX à la place de .xlsx ?
eric
 

Aloha

XLDnaute Accro
Re,
Et tout d'un coup ça ne marche plus: le code ne trouve pas le fichier à ouvrir bien qu'il soit bien présent dans le dossier et que le chemin soit défini avant (ActiveWorkbook.Path) En recherchant dans ce thème j'ai constaté que dans le message #3 il y a ThisWorkbook.Path & "\"
chemin = ThisWorkbook.Path & "\"
J'ai essayé les deux; des fois ça marche, des fois pas.
Où peut être la faute?
D'ailleurs, ce que je trouve bizarre c'est que, quand ça marche, ça n'a pas d'importance qu'il y ait le "\" à la fin ou non.
Bien à vous
Aloha
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 184
dernier inscrit
Di Martino