Tester si classeur déjà utilisé.

Talzatior

XLDnaute Occasionnel
Bonjour les amis du forum ;)

Je viens à présent vers vous pour savoir s'il est possible, en vba, de vérifier si le classeur dans lequel ma macro envoie les données est déjà ouvert par un autre utilisateur ou non.
Nous travaillons à distance sur ces données, et donc les fichiers sont en lecture seule si déjà ouverts et donc ma macro ne passera pas si je ne peux pas tester si un autre utilisateur utilise déjà le tableau pour archiver ses données.

Ma macro :
Code:
Sub ArchiveFact()
Dim fact_num As Long
Dim fact_date As Date
Dim cmd_num As String
Dim cmd_date As Date
Dim nom_clt As String
Dim ech_date As Date
Dim tot_HT As Double
Dim num_ligne As Integer

Sheets("Facture").Activate

'collecte les infos de la facture
fact_num = Range("A14").Value
fact_date = Range("A16").Value
cmd_num = CStr(Range("C16").Value)
cmd_date = Range("D16").Value
nom_clt = CStr(Range("F9").Value)
ech_date = Range("H16").Value
tot_HT = Range("F43").Value

'teste si le classeur cible est déjà ouvert


'ouverture du classeur archive_facture2009.xls
Workbooks.Open "C:\Documents and Settings\Talzatior\Mes documents\Excel\Transfert de données par ADO dans un classeur fermé\Archives_test.xls"
Workbooks("Archives_test.xls").Activate
Sheets("Factures").Activate

'Cherche la première ligne vide
Range("A1").Select
While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Wend

'Défini le numéro de la première ligne vide dans la variable num_ligne
num_ligne = ActiveCell.Row

Worksheets("Factures").Cells(num_ligne, 1).Value = fact_num
Worksheets("Factures").Cells(num_ligne, 2).Value = fact_date
Worksheets("Factures").Cells(num_ligne, 3).Value = cmd_num
Worksheets("Factures").Cells(num_ligne, 4).Value = cmd_date
Worksheets("Factures").Cells(num_ligne, 5).Value = nom_clt
Worksheets("Factures").Cells(num_ligne, 6).Value = tot_HT
Worksheets("Factures").Cells(num_ligne, 9).Value = ech_date

Workbooks("Archives_test.xls").Save
Workbooks("Archives_test.xls").Close

Workbooks("Facture Source.xls").Activate
MsgBox "archivage de la facture n° " & fact_num & " effectué avec succès"

End Sub

Voilà ;)

Vous remerciant par avance ;)
 

Talzatior

XLDnaute Occasionnel
Re : Tester si classeur déjà utilisé.

Erf ...

Erreur d'exécution '9':
L'indice n'appartient pas à la sélection.

j'ai mis votre formule adaptée, c'est-à-dire :
Code:
If Workbooks("C:\Documents and Settings\Talzatior\Mes documents\Excel\Transfert de données par ADO dans un classeur fermé\Archives_test.xls").ReadOnly Then MsgBox "Le classeur d'archives est en lecture seule, veuillez recommencer votre manipulation svp."

avant la commande d'ouverture du classeur dans ma macro ...

D'où vient le souci ?
 

mromain

XLDnaute Barbatruc
Re : Tester si classeur déjà utilisé.

re bonjour,
Pierrot93,

essaye en remplaçant
"C:\Documents and Settings\Talzatior\Mes documents\Excel\Transfert de données par ADO dans un classeur fermé\Archives_test.xls"
par
"Archives_test.xls"

a+
 

liloucmoi

XLDnaute Occasionnel
Re : Tester si classeur déjà utilisé.

Si le classeur Archives_test.xls est fermé lors de ton test, il me semble que cela doit correspondre à ton erreur.

J'ai bien un truc pour tester si un classeur est ouvert, mais ca marche qu'en local je pense.

Code:
' Ouverture du fichier si il n'est pas déjà ouvert.
Dim w As Workbook, ouvert As Boolean
ouvert = False

For Each w In Workbooks
    If w.Name = Classeur1.xls Then
        ouvert = True
        Exit For
    End If
Next w

If Not ouvert Then
    Workbooks.Open Filename:="Classeur1.xls"
End If
 

Talzatior

XLDnaute Occasionnel
Re : Tester si classeur déjà utilisé.

Re tout le monde ...

mromain -> j'ai fait comme tu m'as dit, pas moyen, l'erreur persiste...
Lilou -> effectivement, d'après ton code, ta macro ne fonctionne qu'en local, et ce n'est donc pas approprié à ma situation, mais merci quand même ;)

Ai-je mal placé la commande ..?

Je ne sais pas trop quoi faire à vrai dire ...
 

Pierrot93

XLDnaute Barbatruc
Re : Tester si classeur déjà utilisé.

Re

Avec le code que je t'ai donné, il faut au préalable ouvrir le classeur, si il est déjà ouvert par un autre utilisateur, il s'ouvrira chez toi en "lecture seule", et le test proposé te renverra le message"classeur déjà ouvert"....

@+
 

Talzatior

XLDnaute Occasionnel
Re : Tester si classeur déjà utilisé.

Ok merci ^^

Comme je suis, pour le moment, à la maison, je souhaite savoir ... si j'ouvre mon classeur, que la macro fait le test, et que je dis ok à la msgbox, le classeur archives_test.xls reste-t-il ouvert ou alors est-ce possible de le refermer ?

Merci encore ;)
 

Talzatior

XLDnaute Occasionnel
Re : Tester si classeur déjà utilisé.

Et si je veux le fermer par macro, après que l'on ait cliqué sur le "OK" de la msgbox par exemple, comment dois-je m'y prendre ?

Je connais Workbook("archives_test.xls).close
par contre pour fermer en sauvegardant je sais faire mais sans sauvegarder je ne sais pas s'il y a une commande.
Et surtout faire que cela se fasse lors du click sur "ok" de la msgbox, alors là ... ;)
 

Pierrot93

XLDnaute Barbatruc
Re : Tester si classeur déjà utilisé.

Re

peut être comme ceci :

Code:
If Workbooks("nomclasseur.xls").ReadOnly Then
    If MsgBox("Classeur déjà ouvert !!!", vbYesNo) = vbYes Then _
        Workbooks("nomclasseur.xls").Close False
End If

mais il y a des choses de contradictoires, car si ouvert en lecture seule et si modifié... pas d'enregistrement possible en l'état, il faut donner un autre nom et / ou l'enregistrer sous aileurs...
 

liloucmoi

XLDnaute Occasionnel
Re : Tester si classeur déjà utilisé.

Code:
If MsgBox("Finit ?", 1) = 1 Then
    MsgBox ("Ok, je ferme") 
    ActiveWorkbook.Close SaveChanges:=False 'Ferme sans enregistrer.
End If

Ca ca ferme le classeur actif sur un clique sur OK.

Tu gagnerais à utiliser l'aide de VBA. Par exemple mets toi sur close puis fais "F1", tu verras toutes les options possible lorsque tu vas utiliser close.

Cordialement.

EDIT : Doublé par Pierrot :)
 

Statistiques des forums

Discussions
312 429
Messages
2 088 350
Membres
103 822
dernier inscrit
kader55