Bonjour le groupe,
Décidement, quand on veut développer une petite application, on se retrouve avec
des montagnes de questions :oÞ
Je souhaiterais savoir s'il est possible de détecter si un fichier excel est
ouvert sur un poste particulier et de pouvoir récupérer/inscrire des données à
l'interieur de celui ci. Eventuellemnt, sans connaitre le nom du fichier (en
partant du principe qu'un seul fichier est ouvert)
Merci pour vos réponses
Bonjour le groupe,
Décidement, quand on veut développer une petite application, on se retrouve avec
des montagnes de questions :oÞ
Je souhaiterais savoir s'il est possible de détecter si un fichier excel est
ouvert sur un poste particulier et de pouvoir récupérer/inscrire des données à
l'interieur de celui ci. Eventuellemnt, sans connaitre le nom du fichier (en
partant du principe qu'un seul fichier est ouvert)
Merci pour vos réponses
Bonjour le groupe,
Décidement, quand on veut développer une petite application, on se retrouve avec
des montagnes de questions :oÞ
Je souhaiterais savoir s'il est possible de détecter si un fichier excel est
ouvert sur un poste particulier et de pouvoir récupérer/inscrire des données à
l'interieur de celui ci. Eventuellemnt, sans connaitre le nom du fichier (en
partant du principe qu'un seul fichier est ouvert)
Merci pour vos réponses
bonjour JLuc,
il y un exemple ici:
http://www.mdf-xlpages.com/modules/smartfaq/faq.php?faqidG
isabelle
Le 2015-04-04 12:09, JLuc69 a écrit :Bonjour le groupe,
Décidement, quand on veut développer une petite application, on se retrouve
avec
des montagnes de questions :oÞ
Je souhaiterais savoir s'il est possible de détecter si un fichier excel
est
ouvert sur un poste particulier et de pouvoir récupérer/inscrire des
données à
l'interieur de celui ci. Eventuellemnt, sans connaitre le nom du fichier
(en
partant du principe qu'un seul fichier est ouvert)
Merci pour vos réponses
bonjour JLuc,
il y un exemple ici:
http://www.mdf-xlpages.com/modules/smartfaq/faq.php?faqidG
isabelle
Le 2015-04-04 12:09, JLuc69 a écrit :
Bonjour le groupe,
Décidement, quand on veut développer une petite application, on se retrouve
avec
des montagnes de questions :oÞ
Je souhaiterais savoir s'il est possible de détecter si un fichier excel
est
ouvert sur un poste particulier et de pouvoir récupérer/inscrire des
données à
l'interieur de celui ci. Eventuellemnt, sans connaitre le nom du fichier
(en
partant du principe qu'un seul fichier est ouvert)
Merci pour vos réponses
bonjour JLuc,
il y un exemple ici:
http://www.mdf-xlpages.com/modules/smartfaq/faq.php?faqidG
isabelle
Le 2015-04-04 12:09, JLuc69 a écrit :Bonjour le groupe,
Décidement, quand on veut développer une petite application, on se retrouve
avec
des montagnes de questions :oÞ
Je souhaiterais savoir s'il est possible de détecter si un fichier excel
est
ouvert sur un poste particulier et de pouvoir récupérer/inscrire des
données à
l'interieur de celui ci. Eventuellemnt, sans connaitre le nom du fichier
(en
partant du principe qu'un seul fichier est ouvert)
Merci pour vos réponses
Bonjour,
Pour simplifier la tâche, tu devrais créer un répertoire sur le réseau où il
y a un fichier pour chaque billard. Chaque billard utilise leur fichier
respectif pour saisir leur résultat. Chaque fichier d'Excel doit avoir la
même structure organisationnelle des données et utiliser le même nom pour les
onglets des feuilles.
Dans le fichier de compilation, tu crées une macro utilisant "ADO" (Activex
Data Object) et en cliquant sur un bouton, tu importes toutes les données des
différents billards. Cette exécution peut se faire au moment que tu le
désires et tu peux répéter cela aussi souvent que tu le désires. Dans ta
question, tu ne définis pas comment tu veux compiler les différents
résultats... Une feuille par billard? On peut même automatiser la mise à jour
du fichier en utilisant l'événement "Workbook_Open" du ThisWorkbook.
Écrire dans un fichier sans l'ouvrir n'est pas une mise tâche. Quand c'est
possible, il est préférable d'importer ces données.
Bonjour,
Pour simplifier la tâche, tu devrais créer un répertoire sur le réseau où il
y a un fichier pour chaque billard. Chaque billard utilise leur fichier
respectif pour saisir leur résultat. Chaque fichier d'Excel doit avoir la
même structure organisationnelle des données et utiliser le même nom pour les
onglets des feuilles.
Dans le fichier de compilation, tu crées une macro utilisant "ADO" (Activex
Data Object) et en cliquant sur un bouton, tu importes toutes les données des
différents billards. Cette exécution peut se faire au moment que tu le
désires et tu peux répéter cela aussi souvent que tu le désires. Dans ta
question, tu ne définis pas comment tu veux compiler les différents
résultats... Une feuille par billard? On peut même automatiser la mise à jour
du fichier en utilisant l'événement "Workbook_Open" du ThisWorkbook.
Écrire dans un fichier sans l'ouvrir n'est pas une mise tâche. Quand c'est
possible, il est préférable d'importer ces données.
Bonjour,
Pour simplifier la tâche, tu devrais créer un répertoire sur le réseau où il
y a un fichier pour chaque billard. Chaque billard utilise leur fichier
respectif pour saisir leur résultat. Chaque fichier d'Excel doit avoir la
même structure organisationnelle des données et utiliser le même nom pour les
onglets des feuilles.
Dans le fichier de compilation, tu crées une macro utilisant "ADO" (Activex
Data Object) et en cliquant sur un bouton, tu importes toutes les données des
différents billards. Cette exécution peut se faire au moment que tu le
désires et tu peux répéter cela aussi souvent que tu le désires. Dans ta
question, tu ne définis pas comment tu veux compiler les différents
résultats... Une feuille par billard? On peut même automatiser la mise à jour
du fichier en utilisant l'événement "Workbook_Open" du ThisWorkbook.
Écrire dans un fichier sans l'ouvrir n'est pas une mise tâche. Quand c'est
possible, il est préférable d'importer ces données.
Désolé, une photo ne suffit pas. Cela prend les 2 classeurs.
Le classeur par département et le classeur de compilation.
Dans le classeur de département, remplis-le avec des pointages
hypothétiques afin de voir vraiment de quoi à l'air les données.
Pour publier les classeurs, utilise le site Cjoint.com. Tu nous retournes
ici l'adresse que tu obtiendras.
Désolé, une photo ne suffit pas. Cela prend les 2 classeurs.
Le classeur par département et le classeur de compilation.
Dans le classeur de département, remplis-le avec des pointages
hypothétiques afin de voir vraiment de quoi à l'air les données.
Pour publier les classeurs, utilise le site Cjoint.com. Tu nous retournes
ici l'adresse que tu obtiendras.
Désolé, une photo ne suffit pas. Cela prend les 2 classeurs.
Le classeur par département et le classeur de compilation.
Dans le classeur de département, remplis-le avec des pointages
hypothétiques afin de voir vraiment de quoi à l'air les données.
Pour publier les classeurs, utilise le site Cjoint.com. Tu nous retournes
ici l'adresse que tu obtiendras.
Désolé, mais j'ai un temps très limité que je peux consacrer à
ce type de questions. Selon ce que tu veux faire exactement,
cela peut prendre au moins quelques heures à réaliser....
je n'ai pas ce temps-là, mais je te propose ceci si cela peut t'aider!
'------------------------------------------------
Ce que je souhaite, c'est, avant la partie, récupérer les noms des
joueurs sur la feuille "Engagement" en fonction du numéro du billard,
et en fin de partie, mettre les résultats de la partie dans la feuille
"Résultats" toujours en fonction du numéro de billard ET du tour de
jeu.
'------------------------------------------------
Ne perds pas ton temps à tout m'expliquer.
Que veux-tu que la macro fasse?
Supposons que tu veuilles extraire les données de la feuille
"Synthèse-Remarques"
de chaque classeur placé dans le même répertoire en supposant que dans tous
les classeurs la feuille porte le même nom et que la structure de la plage à
extraire
est identique, je te propose ce type de macro.
Attention, tu dois adapter la valeur des variables selon ton application.
Pour exécuter ce type de macro, tu dois ajouter au projetVBA du classeur
la référence suivante : "Microsoft Data Objects 2.8 library". Pour faire
cela,
barre des menus / outils / références / et tu coches la référence indiquée
dans la liste.
ATTENTION : Dans ta feuille "Synthèse-Remarques",
Supprime la ligne 1 et les lignes 22-23. Conserve seulement
les données.
Cette macro devrait fonctionner pour la version Excel 1997 à 2003.
Pour les versions plus récentes d'Excel, il faut modifier
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""
Pour adapter cette procédure à ton projet, tu dois définir :
A ) Le Chemin de ton répertoire
B ) Le nom de l'onglet de la feuille où sont les données
C ) Il te reste à écrire la requête pour extraire les données.
D ) Il est tenu pour acquis que le classeur d'où sera exécuté
cette macro ne fait pas partie du répertoire visé... sinon
il faut modifier légèrement la macro.
Tu dois ajouter à ton fichier Excel, la bibliothèque suivante :
"Microsoft Activex Data Objects 2.0 Librairy
Ceci a été testé avec Excel 97 et c'est OK
pour les autres versions -> adapter la méthode CopyFromRecordset
'-------------------------------------------
Sub MaRequêteAvecADO()
Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String, Rg As Range
Dim File As String, C As Integer, Ok As Integer
Dim Chemin As String, Nb As Long
NomFeuille = "Feuil1" 'A déterminer
Chemin = "C:test" 'à déterminer
RangeDest = Range("A:H")
'La requête qui sera exécutée ' `a déterminer
Requete = "SELECT * From [" & NomFeuille & "$" & RangeDest & "] WHERE Nom IS
NOT NULL"
'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
'Récupérer dans un tableau, la liste des
'fichiers Excel du répertoire.
File = Dir(Chemin & "*.xls")
Do While File <> ""
'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Feuil2")
If .Range("A1") = "" Then
Set Rg = .Range("A1")
Else
Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2)
Ok = 1
End If
End With
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""
Rst.Open Requete, Conn, adOpenStatic, adLockOptimistic
Nb = Rst.RecordCount
'Copie les étiquettes du recordset vers Excel
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
Rg.Offset(1).Resize(Nb, Rst.Fields.Count) = _
TransposeSpecial2(Rst.GetRows)
Else
Rg.Resize(Nb, Rst.Fields.Count) = _
TransposeSpecial2(Rst.GetRows)
End If
File = Dir()
Rst.Close
Conn.Close
Loop
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'----------------------------------
Function TransposeSpecial2(ByRef Arr As Variant) As Variant
Dim A As Integer, B As Integer, Arr1() As Variant
Dim C As Integer, D As Integer
A = UBound(Arr, 1): B = UBound(Arr, 2)
ReDim Arr1(B, A)
For C = 0 To A
For D = 0 To B
Arr1(D, C) = Arr(C, D)
Next
Next
TransposeSpecial2 = (Arr1)
End Function
'-------------------------------------------
Désolé, mais j'ai un temps très limité que je peux consacrer à
ce type de questions. Selon ce que tu veux faire exactement,
cela peut prendre au moins quelques heures à réaliser....
je n'ai pas ce temps-là, mais je te propose ceci si cela peut t'aider!
'------------------------------------------------
Ce que je souhaite, c'est, avant la partie, récupérer les noms des
joueurs sur la feuille "Engagement" en fonction du numéro du billard,
et en fin de partie, mettre les résultats de la partie dans la feuille
"Résultats" toujours en fonction du numéro de billard ET du tour de
jeu.
'------------------------------------------------
Ne perds pas ton temps à tout m'expliquer.
Que veux-tu que la macro fasse?
Supposons que tu veuilles extraire les données de la feuille
"Synthèse-Remarques"
de chaque classeur placé dans le même répertoire en supposant que dans tous
les classeurs la feuille porte le même nom et que la structure de la plage à
extraire
est identique, je te propose ce type de macro.
Attention, tu dois adapter la valeur des variables selon ton application.
Pour exécuter ce type de macro, tu dois ajouter au projetVBA du classeur
la référence suivante : "Microsoft Data Objects 2.8 library". Pour faire
cela,
barre des menus / outils / références / et tu coches la référence indiquée
dans la liste.
ATTENTION : Dans ta feuille "Synthèse-Remarques",
Supprime la ligne 1 et les lignes 22-23. Conserve seulement
les données.
Cette macro devrait fonctionner pour la version Excel 1997 à 2003.
Pour les versions plus récentes d'Excel, il faut modifier
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""
Pour adapter cette procédure à ton projet, tu dois définir :
A ) Le Chemin de ton répertoire
B ) Le nom de l'onglet de la feuille où sont les données
C ) Il te reste à écrire la requête pour extraire les données.
D ) Il est tenu pour acquis que le classeur d'où sera exécuté
cette macro ne fait pas partie du répertoire visé... sinon
il faut modifier légèrement la macro.
Tu dois ajouter à ton fichier Excel, la bibliothèque suivante :
"Microsoft Activex Data Objects 2.0 Librairy
Ceci a été testé avec Excel 97 et c'est OK
pour les autres versions -> adapter la méthode CopyFromRecordset
'-------------------------------------------
Sub MaRequêteAvecADO()
Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String, Rg As Range
Dim File As String, C As Integer, Ok As Integer
Dim Chemin As String, Nb As Long
NomFeuille = "Feuil1" 'A déterminer
Chemin = "C:test" 'à déterminer
RangeDest = Range("A:H")
'La requête qui sera exécutée ' `a déterminer
Requete = "SELECT * From [" & NomFeuille & "$" & RangeDest & "] WHERE Nom IS
NOT NULL"
'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
'Récupérer dans un tableau, la liste des
'fichiers Excel du répertoire.
File = Dir(Chemin & "*.xls")
Do While File <> ""
'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Feuil2")
If .Range("A1") = "" Then
Set Rg = .Range("A1")
Else
Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2)
Ok = 1
End If
End With
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""
Rst.Open Requete, Conn, adOpenStatic, adLockOptimistic
Nb = Rst.RecordCount
'Copie les étiquettes du recordset vers Excel
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
Rg.Offset(1).Resize(Nb, Rst.Fields.Count) = _
TransposeSpecial2(Rst.GetRows)
Else
Rg.Resize(Nb, Rst.Fields.Count) = _
TransposeSpecial2(Rst.GetRows)
End If
File = Dir()
Rst.Close
Conn.Close
Loop
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'----------------------------------
Function TransposeSpecial2(ByRef Arr As Variant) As Variant
Dim A As Integer, B As Integer, Arr1() As Variant
Dim C As Integer, D As Integer
A = UBound(Arr, 1): B = UBound(Arr, 2)
ReDim Arr1(B, A)
For C = 0 To A
For D = 0 To B
Arr1(D, C) = Arr(C, D)
Next
Next
TransposeSpecial2 = (Arr1)
End Function
'-------------------------------------------
Désolé, mais j'ai un temps très limité que je peux consacrer à
ce type de questions. Selon ce que tu veux faire exactement,
cela peut prendre au moins quelques heures à réaliser....
je n'ai pas ce temps-là, mais je te propose ceci si cela peut t'aider!
'------------------------------------------------
Ce que je souhaite, c'est, avant la partie, récupérer les noms des
joueurs sur la feuille "Engagement" en fonction du numéro du billard,
et en fin de partie, mettre les résultats de la partie dans la feuille
"Résultats" toujours en fonction du numéro de billard ET du tour de
jeu.
'------------------------------------------------
Ne perds pas ton temps à tout m'expliquer.
Que veux-tu que la macro fasse?
Supposons que tu veuilles extraire les données de la feuille
"Synthèse-Remarques"
de chaque classeur placé dans le même répertoire en supposant que dans tous
les classeurs la feuille porte le même nom et que la structure de la plage à
extraire
est identique, je te propose ce type de macro.
Attention, tu dois adapter la valeur des variables selon ton application.
Pour exécuter ce type de macro, tu dois ajouter au projetVBA du classeur
la référence suivante : "Microsoft Data Objects 2.8 library". Pour faire
cela,
barre des menus / outils / références / et tu coches la référence indiquée
dans la liste.
ATTENTION : Dans ta feuille "Synthèse-Remarques",
Supprime la ligne 1 et les lignes 22-23. Conserve seulement
les données.
Cette macro devrait fonctionner pour la version Excel 1997 à 2003.
Pour les versions plus récentes d'Excel, il faut modifier
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""
Pour adapter cette procédure à ton projet, tu dois définir :
A ) Le Chemin de ton répertoire
B ) Le nom de l'onglet de la feuille où sont les données
C ) Il te reste à écrire la requête pour extraire les données.
D ) Il est tenu pour acquis que le classeur d'où sera exécuté
cette macro ne fait pas partie du répertoire visé... sinon
il faut modifier légèrement la macro.
Tu dois ajouter à ton fichier Excel, la bibliothèque suivante :
"Microsoft Activex Data Objects 2.0 Librairy
Ceci a été testé avec Excel 97 et c'est OK
pour les autres versions -> adapter la méthode CopyFromRecordset
'-------------------------------------------
Sub MaRequêteAvecADO()
Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String, Rg As Range
Dim File As String, C As Integer, Ok As Integer
Dim Chemin As String, Nb As Long
NomFeuille = "Feuil1" 'A déterminer
Chemin = "C:test" 'à déterminer
RangeDest = Range("A:H")
'La requête qui sera exécutée ' `a déterminer
Requete = "SELECT * From [" & NomFeuille & "$" & RangeDest & "] WHERE Nom IS
NOT NULL"
'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
'Récupérer dans un tableau, la liste des
'fichiers Excel du répertoire.
File = Dir(Chemin & "*.xls")
Do While File <> ""
'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Feuil2")
If .Range("A1") = "" Then
Set Rg = .Range("A1")
Else
Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2)
Ok = 1
End If
End With
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""
Rst.Open Requete, Conn, adOpenStatic, adLockOptimistic
Nb = Rst.RecordCount
'Copie les étiquettes du recordset vers Excel
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
Rg.Offset(1).Resize(Nb, Rst.Fields.Count) = _
TransposeSpecial2(Rst.GetRows)
Else
Rg.Resize(Nb, Rst.Fields.Count) = _
TransposeSpecial2(Rst.GetRows)
End If
File = Dir()
Rst.Close
Conn.Close
Loop
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'----------------------------------
Function TransposeSpecial2(ByRef Arr As Variant) As Variant
Dim A As Integer, B As Integer, Arr1() As Variant
Dim C As Integer, D As Integer
A = UBound(Arr, 1): B = UBound(Arr, 2)
ReDim Arr1(B, A)
For C = 0 To A
For D = 0 To B
Arr1(D, C) = Arr(C, D)
Next
Next
TransposeSpecial2 = (Arr1)
End Function
'-------------------------------------------