Me revoil=E0 avec une nouvelle question(ma dernier date de mercredi 27 mars=
2013)(http://groupes.codes-sources.com/articlefull.aspx?id=3D509786) et Mi=
chD m'a aid=E9 tr=E8s fort pour r=E9soudre mon probl=E8me. Un grand merci =
=E0 MichD!!!!
Je me re-pr=E9sente:
A Lyon je suis cadre de sant=E9 d'imagerie m=E9dicale mais je fais de la fo=
rmation bureautique et logiciels m=E9tiers aux agents du chu.
Je d=E9veloppe aussi des applications de gestion en vba.
Pour que vous compreniez l'objet de ma demande il faut que je vous explique=
, en gros, comment fonctionnent mes appli.
Toutes mes appli. se trouvent sur le r=E9seau du chu et fonctionnent selon =
le principe suivant:
Les utilisateurs clic sur un raccourci qui se trouve sur le bureau. Ce racc=
ourci pointe vers un fichier vbs qui ouvre une copie d'un fichier XLT.
Le fichier utilisent comme base de donn=E9es des classeurs ferm=E9s pour li=
re et =E9crire ce qui y est saisie..
A la fermeture cette copie s'auto d=E9truit pour qu'on ne puisse pas en gar=
der une copie. Elle s'auto d=E9truit pour que les utilisateurs travaillent=
toujours sur la derni=E8re version car je fais =E9voluer r=E9guli=E8rement=
mes applis.
Travailler avec des copies me permet d'avoir des applications multi-utilisa=
teurs(apparemment!!!).
Je m'explique:
A l'ouverture l'appli lit des classeurs ferm=E9s pour importer les donn=E9e=
s de param=E9trage, les donn=E9es de droits d'acc=E9s et les donn=E9es sais=
ies par les usagers.
Les saisis des agents sont envoy=E9s dans le classeur ferm=E9 des donn=E9es=
saisies par les usagers.
Lors de la lecture et l'=E9criture mon code Vba v=E9rifie que le fichier fe=
rm=E9 de destination n'est pas entrain d'=EAtre lu ou =E9crit si c'est le c=
as un timer de 2 secondes se d=E9clenche, au bout de ces 2 secondes une nou=
velle tentative est faite et ceci 5 fois.
Au bout de 5 fois en cas d'=E9chec un message demande =E0 l'usager de r=E9e=
ssayer.
En fait =E7a arrive tr=E8s rarement(1 fois sur plus de 1000 essais malgr=E9=
plus de 180.000 connexions annuelles)
Pour lire et =E9crire dans un classeur ferm=E9 j'utilise les ADO.
Jusqu'=E0 maintenant j'utilisai excel 2002-2003!!!!=20
2010 est arriv=E9!!!
Pr=E9sentation de ma probl=E9matique:
pour lire et =E9crire dans un classeur ferm=E9 excel version 2010 il n'y a =
pas de souci mais excel n'importe ou n'exporte que 255 colonnes.
Comment arriver =E0 =E9crire dans les colonnes sup=E9rieures =E0 255.
En fait pour les planning de travail des agents dans excel 2002-2003 il est=
impossible de faire tenir 365 jours dans une seule feuille, alors que c'es=
t possible dans 2010. Mais je ne peux pas lire ou =E9crire plus de 255 colo=
nnes.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
MichD
Bonjour,
Pour accéder aux colonnes au-delà de la colonne 255, une façon de faire est d'utiliser dans le fichier source d'où on veut extraire les données des plages nommées définies au niveau du classeur.
À titre d'exemple, on peut utiliser la fonction "Decaler()" dans fait référence à : Plage "Toto" ÞCALER($A$1;;;NBVAL($A:$A);255) pour les colonnes 1 à 255 Plage "Titi" ÞCALER($IV$1;;;NBVAL($A:$A);25)) pour les 25 autres colonnes au-delà de la colonne 255.
Et dans ADO, il s'agit de faire une boucle sur les 2 plages nommées
Bonjour,
Pour accéder aux colonnes au-delà de la colonne 255, une façon de faire est
d'utiliser dans le fichier source d'où on veut extraire les données des
plages nommées
définies au niveau du classeur.
À titre d'exemple, on peut utiliser la fonction "Decaler()" dans fait
référence à :
Plage "Toto" ÞCALER($A$1;;;NBVAL($A:$A);255) pour les colonnes 1 à 255
Plage "Titi" ÞCALER($IV$1;;;NBVAL($A:$A);25)) pour les 25 autres
colonnes au-delà de la colonne 255.
Et dans ADO, il s'agit de faire une boucle sur les 2 plages nommées
Pour accéder aux colonnes au-delà de la colonne 255, une façon de faire est d'utiliser dans le fichier source d'où on veut extraire les données des plages nommées définies au niveau du classeur.
À titre d'exemple, on peut utiliser la fonction "Decaler()" dans fait référence à : Plage "Toto" ÞCALER($A$1;;;NBVAL($A:$A);255) pour les colonnes 1 à 255 Plage "Titi" ÞCALER($IV$1;;;NBVAL($A:$A);25)) pour les 25 autres colonnes au-delà de la colonne 255.
Et dans ADO, il s'agit de faire une boucle sur les 2 plages nommées
MichD
Si tu veux un exemple de macro :
Requiert la référence "Microsoft Activex Data Objects 2.8 Library"
Extrais les données du fichier source vers la "feuil2" du classeur où est écrite la macro. Le fichier source à 2 plages nommées : Table1 et Table2 '----------------------------------------------------------- Sub test() 'Requiert la référence : 'Microsoft Activex Data Objects 2.8 Library"
Dim Cnn As New ADODB.Connection Dim Rst As New ADODB.Recordset Dim Nb As Long, Requete As String Dim Temp As Long, X As Long, K As Long Dim SourceFile As String, Elt As Variant
'Chemin & nom du fichier SourceFile = "c:UsersLe profilDocumentstoto.xlsm"
'Ouverture de la connection Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & SourceFile & ";" & _ "Extended Properties=""Excel 12.0;HDR=Yes"";"
'Boucle sur les 2 plages nommées du fichier source For Each Elt In Array("table1", "table2") 'Texte de la requête Requete = "SELECT * FROM " & Elt
'ouvrir le recordset Rst.Open Requete, Cnn, 1, 1, 1
'Obtenir le nombre d'enregistrements du recordset Nb = Rst.RecordCount If Nb > 0 Then T = Rst.GetRows() X = UBound(T, 1) + 1 If X < 255 Then K = X Else K = 255 End If 'Copie du recordset dans la feuille Feuil2 Worksheets("Feuil2").Range("A1").Offset(, Temp).Resize(19, K) = _ Application.Transpose(T) Temp = Temp + UBound(T, 1) + 1 End If Rst.Close Next
End Sub '-----------------------------------------------------------
Si tu veux un exemple de macro :
Requiert la référence "Microsoft Activex Data Objects 2.8 Library"
Extrais les données du fichier source vers la "feuil2" du classeur où est
écrite la macro.
Le fichier source à 2 plages nommées : Table1 et Table2
'-----------------------------------------------------------
Sub test()
'Requiert la référence :
'Microsoft Activex Data Objects 2.8 Library"
Dim Cnn As New ADODB.Connection
Dim Rst As New ADODB.Recordset
Dim Nb As Long, Requete As String
Dim Temp As Long, X As Long, K As Long
Dim SourceFile As String, Elt As Variant
'Chemin & nom du fichier
SourceFile = "c:UsersLe profilDocumentstoto.xlsm"
'Ouverture de la connection
Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";"
'Boucle sur les 2 plages nommées du fichier source
For Each Elt In Array("table1", "table2")
'Texte de la requête
Requete = "SELECT * FROM " & Elt
'ouvrir le recordset
Rst.Open Requete, Cnn, 1, 1, 1
'Obtenir le nombre d'enregistrements du recordset
Nb = Rst.RecordCount
If Nb > 0 Then
T = Rst.GetRows()
X = UBound(T, 1) + 1
If X < 255 Then
K = X
Else
K = 255
End If
'Copie du recordset dans la feuille Feuil2
Worksheets("Feuil2").Range("A1").Offset(, Temp).Resize(19, K) = _
Application.Transpose(T)
Temp = Temp + UBound(T, 1) + 1
End If
Rst.Close
Next
End Sub
'-----------------------------------------------------------
Requiert la référence "Microsoft Activex Data Objects 2.8 Library"
Extrais les données du fichier source vers la "feuil2" du classeur où est écrite la macro. Le fichier source à 2 plages nommées : Table1 et Table2 '----------------------------------------------------------- Sub test() 'Requiert la référence : 'Microsoft Activex Data Objects 2.8 Library"
Dim Cnn As New ADODB.Connection Dim Rst As New ADODB.Recordset Dim Nb As Long, Requete As String Dim Temp As Long, X As Long, K As Long Dim SourceFile As String, Elt As Variant
'Chemin & nom du fichier SourceFile = "c:UsersLe profilDocumentstoto.xlsm"
'Ouverture de la connection Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & SourceFile & ";" & _ "Extended Properties=""Excel 12.0;HDR=Yes"";"
'Boucle sur les 2 plages nommées du fichier source For Each Elt In Array("table1", "table2") 'Texte de la requête Requete = "SELECT * FROM " & Elt
'ouvrir le recordset Rst.Open Requete, Cnn, 1, 1, 1
'Obtenir le nombre d'enregistrements du recordset Nb = Rst.RecordCount If Nb > 0 Then T = Rst.GetRows() X = UBound(T, 1) + 1 If X < 255 Then K = X Else K = 255 End If 'Copie du recordset dans la feuille Feuil2 Worksheets("Feuil2").Range("A1").Offset(, Temp).Resize(19, K) = _ Application.Transpose(T) Temp = Temp + UBound(T, 1) + 1 End If Rst.Close Next
End Sub '-----------------------------------------------------------
Jacquouille
Bonsoir Denis, Si je lis bien, il semble que des utilisateurs aient encore 2003.
En fait pour les planning de travail des agents dans excel 2002-2003 il est impossible de faire tenir 365 jours dans une seule feuille, alors que c'est possible dans 2010. Mais je ne peux pas lire ou écrire plus de 255 colonnes.
- Ce procédé de 2 plages va-t-il fonctionner? Où va-t-on caser les colonnes
256 ?
Bonne soirée et merci pour tes explications. Jacques.
Jacquouille
" Le vin est au repas ce que le parfum est à la femme." "MichD" a écrit dans le message de groupe de discussion : m3b0am$1qs$
Si tu veux un exemple de macro :
Requiert la référence "Microsoft Activex Data Objects 2.8 Library"
Extrais les données du fichier source vers la "feuil2" du classeur où est écrite la macro. Le fichier source à 2 plages nommées : Table1 et Table2 '----------------------------------------------------------- Sub test() 'Requiert la référence : 'Microsoft Activex Data Objects 2.8 Library"
Dim Cnn As New ADODB.Connection Dim Rst As New ADODB.Recordset Dim Nb As Long, Requete As String Dim Temp As Long, X As Long, K As Long Dim SourceFile As String, Elt As Variant
'Chemin & nom du fichier SourceFile = "c:UsersLe profilDocumentstoto.xlsm"
'Ouverture de la connection Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & SourceFile & ";" & _ "Extended Properties=""Excel 12.0;HDR=Yes"";"
'Boucle sur les 2 plages nommées du fichier source For Each Elt In Array("table1", "table2") 'Texte de la requête Requete = "SELECT * FROM " & Elt
'ouvrir le recordset Rst.Open Requete, Cnn, 1, 1, 1
'Obtenir le nombre d'enregistrements du recordset Nb = Rst.RecordCount If Nb > 0 Then T = Rst.GetRows() X = UBound(T, 1) + 1 If X < 255 Then K = X Else K = 255 End If 'Copie du recordset dans la feuille Feuil2 Worksheets("Feuil2").Range("A1").Offset(, Temp).Resize(19, K) = _ Application.Transpose(T) Temp = Temp + UBound(T, 1) + 1 End If Rst.Close Next
End Sub '-----------------------------------------------------------
--- Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active. http://www.avast.com
Bonsoir Denis,
Si je lis bien, il semble que des utilisateurs aient encore 2003.
En fait pour les planning de travail des agents dans excel 2002-2003 il
est impossible de faire tenir 365 jours dans une seule feuille, alors
que c'est possible dans 2010. Mais je ne peux pas lire ou écrire plus de
255 colonnes.
- Ce procédé de 2 plages va-t-il fonctionner? Où va-t-on caser les colonnes
256 ?
Bonne soirée et merci pour tes explications.
Jacques.
Jacquouille
" Le vin est au repas ce que le parfum est à la femme."
"MichD" a écrit dans le message de groupe de discussion :
m3b0am$1qs$1@speranza.aioe.org...
Si tu veux un exemple de macro :
Requiert la référence "Microsoft Activex Data Objects 2.8 Library"
Extrais les données du fichier source vers la "feuil2" du classeur où est
écrite la macro.
Le fichier source à 2 plages nommées : Table1 et Table2
'-----------------------------------------------------------
Sub test()
'Requiert la référence :
'Microsoft Activex Data Objects 2.8 Library"
Dim Cnn As New ADODB.Connection
Dim Rst As New ADODB.Recordset
Dim Nb As Long, Requete As String
Dim Temp As Long, X As Long, K As Long
Dim SourceFile As String, Elt As Variant
'Chemin & nom du fichier
SourceFile = "c:UsersLe profilDocumentstoto.xlsm"
'Ouverture de la connection
Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";"
'Boucle sur les 2 plages nommées du fichier source
For Each Elt In Array("table1", "table2")
'Texte de la requête
Requete = "SELECT * FROM " & Elt
'ouvrir le recordset
Rst.Open Requete, Cnn, 1, 1, 1
'Obtenir le nombre d'enregistrements du recordset
Nb = Rst.RecordCount
If Nb > 0 Then
T = Rst.GetRows()
X = UBound(T, 1) + 1
If X < 255 Then
K = X
Else
K = 255
End If
'Copie du recordset dans la feuille Feuil2
Worksheets("Feuil2").Range("A1").Offset(, Temp).Resize(19, K) = _
Application.Transpose(T)
Temp = Temp + UBound(T, 1) + 1
End If
Rst.Close
Next
End Sub
'-----------------------------------------------------------
---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.
http://www.avast.com
Bonsoir Denis, Si je lis bien, il semble que des utilisateurs aient encore 2003.
En fait pour les planning de travail des agents dans excel 2002-2003 il est impossible de faire tenir 365 jours dans une seule feuille, alors que c'est possible dans 2010. Mais je ne peux pas lire ou écrire plus de 255 colonnes.
- Ce procédé de 2 plages va-t-il fonctionner? Où va-t-on caser les colonnes
256 ?
Bonne soirée et merci pour tes explications. Jacques.
Jacquouille
" Le vin est au repas ce que le parfum est à la femme." "MichD" a écrit dans le message de groupe de discussion : m3b0am$1qs$
Si tu veux un exemple de macro :
Requiert la référence "Microsoft Activex Data Objects 2.8 Library"
Extrais les données du fichier source vers la "feuil2" du classeur où est écrite la macro. Le fichier source à 2 plages nommées : Table1 et Table2 '----------------------------------------------------------- Sub test() 'Requiert la référence : 'Microsoft Activex Data Objects 2.8 Library"
Dim Cnn As New ADODB.Connection Dim Rst As New ADODB.Recordset Dim Nb As Long, Requete As String Dim Temp As Long, X As Long, K As Long Dim SourceFile As String, Elt As Variant
'Chemin & nom du fichier SourceFile = "c:UsersLe profilDocumentstoto.xlsm"
'Ouverture de la connection Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & SourceFile & ";" & _ "Extended Properties=""Excel 12.0;HDR=Yes"";"
'Boucle sur les 2 plages nommées du fichier source For Each Elt In Array("table1", "table2") 'Texte de la requête Requete = "SELECT * FROM " & Elt
'ouvrir le recordset Rst.Open Requete, Cnn, 1, 1, 1
'Obtenir le nombre d'enregistrements du recordset Nb = Rst.RecordCount If Nb > 0 Then T = Rst.GetRows() X = UBound(T, 1) + 1 If X < 255 Then K = X Else K = 255 End If 'Copie du recordset dans la feuille Feuil2 Worksheets("Feuil2").Range("A1").Offset(, Temp).Resize(19, K) = _ Application.Transpose(T) Temp = Temp + UBound(T, 1) + 1 End If Rst.Close Next
End Sub '-----------------------------------------------------------
--- Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active. http://www.avast.com
MichD
Je rectifie. On ne peut pas utiliser "Decaler" pour définir une plage nommée qui servira de table dans ADO. Désolé pour la méprise.
Comme Jacquouille le fait remarquer, on ne peut pas copier 300 colonnes que peut contenir un fichier depuis Excel 2007 vers un fichier .xls qui lui est limité à 255 colonnes. La plage de destination peut être répartie sur 2 feuilles pour les versions antérieures à Excel 2007. Il n'y a pas de solutions miracles pour cela!
Je rectifie. On ne peut pas utiliser "Decaler" pour définir une plage nommée
qui servira de table dans ADO. Désolé pour la méprise.
Comme Jacquouille le fait remarquer, on ne peut pas copier 300 colonnes que
peut contenir un fichier depuis Excel 2007 vers un fichier .xls qui lui est
limité à 255 colonnes. La plage de destination peut être répartie sur 2
feuilles pour les versions antérieures à Excel 2007. Il n'y a pas de
solutions miracles pour cela!
Je rectifie. On ne peut pas utiliser "Decaler" pour définir une plage nommée qui servira de table dans ADO. Désolé pour la méprise.
Comme Jacquouille le fait remarquer, on ne peut pas copier 300 colonnes que peut contenir un fichier depuis Excel 2007 vers un fichier .xls qui lui est limité à 255 colonnes. La plage de destination peut être répartie sur 2 feuilles pour les versions antérieures à Excel 2007. Il n'y a pas de solutions miracles pour cela!
MichD
Bonjour Jacquouille,
Je sais. Mais de toute manière, avec ADO, on ne peut pas pour le moment même avec les versions récentes d'Excel, extraire plus de 255 colonnes à la fois. C'est une limite d'ADO pour le moment. Ce pour quoi j'ai suggéré une boucle! Cela n'enlève pas non plus la limite du nombre de colonnes des versions antérieures à Excel 2007. Là, il n'y a pas moyen de faire appel à des astuces...
Bonjour Jacquouille,
Je sais. Mais de toute manière, avec ADO, on ne peut pas pour le moment même
avec les versions récentes d'Excel, extraire plus de 255 colonnes à la fois.
C'est une limite d'ADO pour le moment. Ce pour quoi j'ai suggéré une boucle!
Cela n'enlève pas non plus la limite du nombre de colonnes des versions
antérieures à Excel 2007. Là, il n'y a pas moyen de faire appel à des
astuces...
Je sais. Mais de toute manière, avec ADO, on ne peut pas pour le moment même avec les versions récentes d'Excel, extraire plus de 255 colonnes à la fois. C'est une limite d'ADO pour le moment. Ce pour quoi j'ai suggéré une boucle! Cela n'enlève pas non plus la limite du nombre de colonnes des versions antérieures à Excel 2007. Là, il n'y a pas moyen de faire appel à des astuces...
Jacquouille
Merci Denis Bonne soirée Jacques.
Jacquouille
" Le vin est au repas ce que le parfum est à la femme." "MichD" a écrit dans le message de groupe de discussion : m3b5r2$hff$
Bonjour Jacquouille,
Je sais. Mais de toute manière, avec ADO, on ne peut pas pour le moment même avec les versions récentes d'Excel, extraire plus de 255 colonnes à la fois. C'est une limite d'ADO pour le moment. Ce pour quoi j'ai suggéré une boucle! Cela n'enlève pas non plus la limite du nombre de colonnes des versions antérieures à Excel 2007. Là, il n'y a pas moyen de faire appel à des astuces...
--- Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active. http://www.avast.com
Merci Denis
Bonne soirée
Jacques.
Jacquouille
" Le vin est au repas ce que le parfum est à la femme."
"MichD" a écrit dans le message de groupe de discussion :
m3b5r2$hff$1@speranza.aioe.org...
Bonjour Jacquouille,
Je sais. Mais de toute manière, avec ADO, on ne peut pas pour le moment même
avec les versions récentes d'Excel, extraire plus de 255 colonnes à la fois.
C'est une limite d'ADO pour le moment. Ce pour quoi j'ai suggéré une boucle!
Cela n'enlève pas non plus la limite du nombre de colonnes des versions
antérieures à Excel 2007. Là, il n'y a pas moyen de faire appel à des
astuces...
---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.
http://www.avast.com
" Le vin est au repas ce que le parfum est à la femme." "MichD" a écrit dans le message de groupe de discussion : m3b5r2$hff$
Bonjour Jacquouille,
Je sais. Mais de toute manière, avec ADO, on ne peut pas pour le moment même avec les versions récentes d'Excel, extraire plus de 255 colonnes à la fois. C'est une limite d'ADO pour le moment. Ce pour quoi j'ai suggéré une boucle! Cela n'enlève pas non plus la limite du nombre de colonnes des versions antérieures à Excel 2007. Là, il n'y a pas moyen de faire appel à des astuces...
--- Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active. http://www.avast.com
Jacquouille
S'il n'y avait pas de réseau (avec des autres versions), j'aurais suggéré ce bricolage: Copier les 250 premières colonnes sur une feuille et les autres sur une seconde feuille. L'utilisateur pourrait les ouvrir toutes les 2 ...(flèche Windows + flèche gauche ou droite) .... C'est pas le paradis, mais c'est mieux que rien. La bonne soirée à vous tous
Jacquouille
" Le vin est au repas ce que le parfum est à la femme." "Jacquouille" a écrit dans le message de groupe de discussion : m3b5uh$hln$
Merci Denis Bonne soirée Jacques.
Jacquouille
" Le vin est au repas ce que le parfum est à la femme." "MichD" a écrit dans le message de groupe de discussion : m3b5r2$hff$
Bonjour Jacquouille,
Je sais. Mais de toute manière, avec ADO, on ne peut pas pour le moment même avec les versions récentes d'Excel, extraire plus de 255 colonnes à la fois. C'est une limite d'ADO pour le moment. Ce pour quoi j'ai suggéré une boucle! Cela n'enlève pas non plus la limite du nombre de colonnes des versions antérieures à Excel 2007. Là, il n'y a pas moyen de faire appel à des astuces...
--- Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active. http://www.avast.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.avast.com
--- Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active. http://www.avast.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.avast.com
S'il n'y avait pas de réseau (avec des autres versions), j'aurais suggéré ce
bricolage:
Copier les 250 premières colonnes sur une feuille et les autres sur une
seconde feuille.
L'utilisateur pourrait les ouvrir toutes les 2 ...(flèche Windows + flèche
gauche ou droite) ....
C'est pas le paradis, mais c'est mieux que rien.
La bonne soirée à vous tous
Jacquouille
" Le vin est au repas ce que le parfum est à la femme."
"Jacquouille" a écrit dans le message de groupe de discussion :
m3b5uh$hln$1@speranza.aioe.org...
Merci Denis
Bonne soirée
Jacques.
Jacquouille
" Le vin est au repas ce que le parfum est à la femme."
"MichD" a écrit dans le message de groupe de discussion :
m3b5r2$hff$1@speranza.aioe.org...
Bonjour Jacquouille,
Je sais. Mais de toute manière, avec ADO, on ne peut pas pour le moment même
avec les versions récentes d'Excel, extraire plus de 255 colonnes à la fois.
C'est une limite d'ADO pour le moment. Ce pour quoi j'ai suggéré une boucle!
Cela n'enlève pas non plus la limite du nombre de colonnes des versions
antérieures à Excel 2007. Là, il n'y a pas moyen de faire appel à des
astuces...
---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant
parce que la protection avast! Antivirus est active.
http://www.avast.com
---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.
http://www.avast.com
S'il n'y avait pas de réseau (avec des autres versions), j'aurais suggéré ce bricolage: Copier les 250 premières colonnes sur une feuille et les autres sur une seconde feuille. L'utilisateur pourrait les ouvrir toutes les 2 ...(flèche Windows + flèche gauche ou droite) .... C'est pas le paradis, mais c'est mieux que rien. La bonne soirée à vous tous
Jacquouille
" Le vin est au repas ce que le parfum est à la femme." "Jacquouille" a écrit dans le message de groupe de discussion : m3b5uh$hln$
Merci Denis Bonne soirée Jacques.
Jacquouille
" Le vin est au repas ce que le parfum est à la femme." "MichD" a écrit dans le message de groupe de discussion : m3b5r2$hff$
Bonjour Jacquouille,
Je sais. Mais de toute manière, avec ADO, on ne peut pas pour le moment même avec les versions récentes d'Excel, extraire plus de 255 colonnes à la fois. C'est une limite d'ADO pour le moment. Ce pour quoi j'ai suggéré une boucle! Cela n'enlève pas non plus la limite du nombre de colonnes des versions antérieures à Excel 2007. Là, il n'y a pas moyen de faire appel à des astuces...
--- Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active. http://www.avast.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.avast.com
--- Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active. http://www.avast.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.avast.com
A Lyon je suis cadre de sant d'imagerie mdicale mais je fais de la fo= rmation bureautique et logiciels mtiers aux agents du chu. Je dveloppe aussi des applications de gestion en vba.
Pour que vous compreniez l'objet de ma demande il faut que je vous explique= , en gros, comment fonctionnent mes appli.
Toutes mes appli. se trouvent sur le rseau du chu et fonctionnent selon = le principe suivant:
Les utilisateurs clic sur un raccourci qui se trouve sur le bureau. Ce racc= ourci pointe vers un fichier vbs qui ouvre une copie d'un fichier XLT.
Le fichier utilisent comme base de donnes des classeurs ferms pour li= re et crire ce qui y est saisie..
A la fermeture cette copie s'auto dtruit pour qu'on ne puisse pas en gar= der une copie. Elle s'auto dtruit pour que les utilisateurs travaillent= toujours sur la dernire version car je fais voluer rgulirement= mes applis. Travailler avec des copies me permet d'avoir des applications multi-utilisa= teurs(apparemment!!!).
Je m'explique:
A l'ouverture l'appli lit des classeurs ferms pour importer les donne= s de paramtrage, les donnes de droits d'accs et les donnes sais= ies par les usagers. Les saisis des agents sont envoys dans le classeur ferm des donnes= saisies par les usagers. Lors de la lecture et l'criture mon code Vba vrifie que le fichier fe= rm de destination n'est pas entrain d'tre lu ou crit si c'est le c= as un timer de 2 secondes se dclenche, au bout de ces 2 secondes une nou= velle tentative est faite et ceci 5 fois. Au bout de 5 fois en cas d'chec un message demande l'usager de re= ssayer. En fait a arrive trs rarement(1 fois sur plus de 1000 essais malgr= plus de 180.000 connexions annuelles)
Pour lire et crire dans un classeur ferm j'utilise les ADO. Jusqu' maintenant j'utilisai excel 2002-2003!!!! 2010 est arriv!!!
Prsentation de ma problmatique: pour lire et crire dans un classeur ferm excel version 2010 il n'y a = pas de souci mais excel n'importe ou n'exporte que 255 colonnes. Comment arriver crire dans les colonnes suprieures 255. En fait pour les planning de travail des agents dans excel 2002-2003 il est= impossible de faire tenir 365 jours dans une seule feuille, alors que c'es= t possible dans 2010. Mais je ne peux pas lire ou crire plus de 255 colo= nnes.
6 Set MaConnexion = New ADODB.Connection 7 MaConnexion.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source== " & Chemin & ";Extended Properties=""Excel 12.0;HDR=NO;"";" 8 Set MaCommande= New ADODB.Command 9 MaCommande.ActiveConnection = MaConnexion 10 For Each CellSource In ActiveWorkbook.Sheets(Feuille).Range(PlageSource) 11 MaDonnee= CellSource.Value 12 DestCellAdr = Cells(LigCibleAgt + ConfirmeExport, ColAgt).Address(0= , 0) 13 ConfirmeExport = ConfirmeExport + 1
14 RangeDest = DestCellAdr & ":" & DestCellAdr 15 MaCommande.CommandText = "SELECT * from `" & Feuille &= "$" & RangeDest & "`" 16 Set MonEnregistrement= New ADODB.Recordset 17 MonEnregistrement.Open MaCommande, , adOpenKeyset, adLockOptimistic 18 If MaDonnee= "" Then MaDonnee= " " 19 MonEnregistrement (0).Value = MaDonnee 20 MonEnregistrement.Update DoEvents 21 Next CellSource 22 MaConnexion.Close 23 Set MaConnexion = Nothing 24 Set MaCommande= Nothing 25 Set MonEnregistrement= Nothing 26 Exit Sub
End Sub
CODE POUR LIRE 20 Cellule = "A1:GI200" 'Ref de la cellule contenant la donne r= cuprer
21 Set MaConnexion = New ADODB.Connection 22 MaConnexion .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Sou= rce=" & Chemin & ";Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;"= ";"
23 Set MaCommande= New ADODB.Command 24 MaCommande.ActiveConnection = MaConnexion 25 MaCommande.CommandText = "SELECT * FROM [" & "AlerteS= em1" & "$" & Cellule & "]" 26 Set MonEnregistrement= New ADODB.Recordset 27 MonEnregistrement.Open MaCommande, , adOpenKeyset, adLo= ckOptimistic
28 Alertes1.Range("A1").CopyFromRecordset MonEnregistremen= t 29 MonEnregistrement.Close '****************************= *************************************************** 30 Set MaCommande= New ADODB.Command 31 MaCommande.ActiveConnection = Source 32 MaCommande.CommandText = "SELECT * FROM [" & "AlerteS= em2" & "$" & Cellule & "]" 33 Set MonEnregistrement= New ADODB.Recordset 34 MonEnregistrement.Open MaCommande, , adOpenKeyset, adLo= ckOptimistic
35 Alertes2.Range("A1").CopyFromRecordset MonEnregistremen= t 36 MonEnregistrement.Close '****************************************************************= *************** 37 MaConnexion.Close 38 Set MaConnexion = Nothing 39 Set MonEnregistrement= Nothing 40 Set MaCommande= Nothing
bonsoir a tous, je vous réponds un peu tard et je vous prie de m'excuser. prie par mon pojet j'en ai oublié de revenir sur le forum. excel 2010 est bien limiter en import de données d'un classeur fermé à 255 colonne, j'ai donc fait un boucle et c'est lourd mais ca marche et la voici: Sub Charge_ACTIVITESouMEDECINS() Set Source = New ADODB.Connection Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Chemin & ";Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;"";" '**************************************** CodeNameFeuil = "ACTIVITES": Charge_ACTIVITESouMEDECINS
1 If Sommaire.Range("A19") = 1 Then Stop '** Dim MaPlage 2 EventOff 3 On Error GoTo GereError_Charge_ACTIVITESouMEDECINS 4 Deprotege CodeNameFeuil 5 On Error Resume Next 6 Sheets(CodeNameFeuil).Range(Cells(3, 1), Cells(53, 3845)).SpecialCells(xlCellTypeAllValidation).Validation.Delete 7 On Error GoTo GereError_Charge_ACTIVITESouMEDECINS
8 With Sheets(CodeNameFeuil) 9 .Visible = xlSheetVisible 10 If CodeNameFeuil = "ACTIVITES" Then .Select 11 If CodeNameFeuil = "MEDECINS" Then .Select
'Stop 12 Quoi = "A1:IP53": ou = "A1": GoSub ExecuteRequete 13 Quoi = "IQ1:SF53": ou = "IQ1": GoSub ExecuteRequete 14 Quoi = "SG1:ABV53": ou = "SG1": GoSub ExecuteRequete 15 Quoi = "ABW1:ALL53": ou = "ABW1": GoSub ExecuteRequete 16 Quoi = "ALM1:AVB53": ou = "ALM1": GoSub ExecuteRequete 17 Quoi = "AVC1:BER53": ou = "AVC1": GoSub ExecuteRequete 18 Quoi = "BES1:BON53": ou = "BES1": GoSub ExecuteRequete 19 Quoi = "BOI1:BXX53": ou = "BOI1": GoSub ExecuteRequete 20 Quoi = "BXY1:CHN53": ou = "BXY1": GoSub ExecuteRequete 21 Quoi = "CHO1:CRD53": ou = "CHO1": GoSub ExecuteRequete 22 Quoi = "CRE:DAT53": ou = "CRE1": GoSub ExecuteRequete 23 Quoi = "DAU1:DKJ53": ou = "DAU1": GoSub ExecuteRequete 24 Quoi = "DKK1:DTZ53": ou = "DKK1": GoSub ExecuteRequete 25 Quoi = "DUA1:EDP53": ou = "DUA1": GoSub ExecuteRequete 26 Quoi = "EDQ1:ENF53": ou = "EDQ1": GoSub ExecuteRequete 27 Quoi = "ENG1:EQW53": ou = "ENG1": GoSub ExecuteRequete '21 Stop 28 Application.Calculation = xlCalculationAutomatic 29 If CodeNameFeuil = "ACTIVITES" Or CodeNameFeuil = "MEDECINS" Then 30 .Range("A1").Value = ACTIVITES.Range("A1").Value 31 .Range("C1").FormulaR1C1 = "TE(R1C1-1,12,1)" 32 .Range("F1:EQW1").FormulaR1C1 = "=RC[-3]+1" 33 .Range("C2:E2").NumberFormat = "d" 34 .Range("C2").FormulaR1C1 = "=R1C" 35 .Range("D2").FormulaR1C1 = "=R1C[-1]" 36 .Range("E2").FormulaR1C1 = "=R1C[-2]"
37 .Range("C2:E2").AutoFill Destination:=Range("C2:EQW2"), Type:=xlFillDefault 38 .Range(Cells(4, 1), Cells(53, 1284)).SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = xlNone 39 End If 40 EventOff 'a remmettre en service si export ne marche plus ' Dim raEnum As Range 'Dim CelluleTiret As Range 'Set MaPlage = Sheets("ACTIVITES").Columns.ColumnDifferences(Sheets("ACTIVITES").Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 1)) 'For Each raEnum In MaPlage.Areas ' CellSelect = raEnum.Address(0, 0) 'For Each CelluleTiret In ACTIVITES.Range(CellSelect)
'If ACTIVITES.Range(CelluleTiret.Address).Value = "_" Then ACTIVITES.Range(CelluleTiret.Address).Value = "" 'Next CelluleTiret 'Next raEnum 'Set MaPlage = Nothing 41 Set MaPlage = Nothing 42 End With 43 Protege CodeNameFeuil 44 EventOn 45 Exit Sub '*************************************************************** ExecuteRequete: 46 FlagSortDeLa = "sortdela" 47 texte_SQL = "SELECT * FROM [" & CodeNameFeuil & "$" & Quoi & "]" ' "col 250 48 Set Rst = New ADODB.Recordset 49 Set Rst = Source.Execute(texte_SQL) 50 Sheets(CodeNameFeuil).Range(ou).CopyFromRecordset Rst 51 DoEvents 52 Return 53 Exit Sub '********************************************************************************************* GereError_Charge_ACTIVITESouMEDECINS: 54 NomProcAppelante ("Charge_ACTIVITESouMEDECINS") 55 Resume Next End Sub Avec mes sinceres remerciements
Le mardi 04 Novembre 2014 à 13:19 par talllix :
Bonjour =E0 tous
Me revoil=E0 avec une nouvelle question(ma dernier date de mercredi 27 mars=
2013)(http://groupes.codes-sources.com/articlefull.aspx?id=3D509786) et Mi=
chD m'a aid=E9 tr=E8s fort pour r=E9soudre mon probl=E8me. Un grand merci =
=E0 MichD!!!!
Je me re-pr=E9sente:
A Lyon je suis cadre de sant=E9 d'imagerie m=E9dicale mais je fais de la fo=
rmation bureautique et logiciels m=E9tiers aux agents du chu.
Je d=E9veloppe aussi des applications de gestion en vba.
Pour que vous compreniez l'objet de ma demande il faut que je vous explique=
, en gros, comment fonctionnent mes appli.
Toutes mes appli. se trouvent sur le r=E9seau du chu et fonctionnent selon =
le principe suivant:
Les utilisateurs clic sur un raccourci qui se trouve sur le bureau. Ce racc=
ourci pointe vers un fichier vbs qui ouvre une copie d'un fichier XLT.
Le fichier utilisent comme base de donn=E9es des classeurs ferm=E9s pour li=
re et =E9crire ce qui y est saisie..
A la fermeture cette copie s'auto d=E9truit pour qu'on ne puisse pas en gar=
der une copie. Elle s'auto d=E9truit pour que les utilisateurs travaillent=
toujours sur la derni=E8re version car je fais =E9voluer r=E9guli=E8rement=
mes applis.
Travailler avec des copies me permet d'avoir des applications multi-utilisa=
teurs(apparemment!!!).
Je m'explique:
A l'ouverture l'appli lit des classeurs ferm=E9s pour importer les donn=E9e=
s de param=E9trage, les donn=E9es de droits d'acc=E9s et les donn=E9es sais=
ies par les usagers.
Les saisis des agents sont envoy=E9s dans le classeur ferm=E9 des donn=E9es=
saisies par les usagers.
Lors de la lecture et l'=E9criture mon code Vba v=E9rifie que le fichier fe=
rm=E9 de destination n'est pas entrain d'=EAtre lu ou =E9crit si c'est le c=
as un timer de 2 secondes se d=E9clenche, au bout de ces 2 secondes une nou=
velle tentative est faite et ceci 5 fois.
Au bout de 5 fois en cas d'=E9chec un message demande =E0 l'usager de r=E9e=
ssayer.
En fait =E7a arrive tr=E8s rarement(1 fois sur plus de 1000 essais malgr=E9=
plus de 180.000 connexions annuelles)
Pour lire et =E9crire dans un classeur ferm=E9 j'utilise les ADO.
Jusqu'=E0 maintenant j'utilisai excel 2002-2003!!!!=20
2010 est arriv=E9!!!
Pr=E9sentation de ma probl=E9matique:
pour lire et =E9crire dans un classeur ferm=E9 excel version 2010 il n'y a =
pas de souci mais excel n'importe ou n'exporte que 255 colonnes.
Comment arriver =E0 =E9crire dans les colonnes sup=E9rieures =E0 255.
En fait pour les planning de travail des agents dans excel 2002-2003 il est=
impossible de faire tenir 365 jours dans une seule feuille, alors que c'es=
t possible dans 2010. Mais je ne peux pas lire ou =E9crire plus de 255 colo=
nnes.
6 Set MaConnexion =3D New ADODB.Connection
7 MaConnexion.Open "Provider=3DMicrosoft.ACE.OLEDB.12.0;Data
Source=3D=
" & Chemin & ";Extended Properties=3D""Excel
12.0;HDR=3DNO;"";"
8 Set MaCommande=3D New ADODB.Command
9 MaCommande.ActiveConnection =3D MaConnexion
10 For Each CellSource In ActiveWorkbook.Sheets(Feuille).Range(PlageSource)
11 MaDonnee=3D CellSource.Value
12 DestCellAdr =3D Cells(LigCibleAgt + ConfirmeExport, ColAgt).Address(0=
, 0)
13 ConfirmeExport =3D ConfirmeExport + 1
14 RangeDest =3D DestCellAdr & ":" &
DestCellAdr
15 MaCommande.CommandText =3D "SELECT * from `" &
Feuille &=
"$" & RangeDest & "`"
16 Set MonEnregistrement=3D New ADODB.Recordset
17 MonEnregistrement.Open MaCommande, , adOpenKeyset, adLockOptimistic
18 If MaDonnee=3D "" Then MaDonnee=3D " "
19 MonEnregistrement (0).Value =3D MaDonnee
20 MonEnregistrement.Update
DoEvents
21 Next CellSource
22 MaConnexion.Close
23 Set MaConnexion =3D Nothing
24 Set MaCommande=3D Nothing
25 Set MonEnregistrement=3D Nothing
26 Exit Sub
End Sub
CODE POUR LIRE
20 Cellule =3D "A1:GI200" 'Ref de la cellule contenant la donn=E9e
=E0 r=
=E9cup=E9rer
=20
21 Set MaConnexion =3D New ADODB.Connection
22 MaConnexion .Open "Provider=3DMicrosoft.ACE.OLEDB.12.0;Data
Sou=
rce=3D" & Chemin & ";Extended Properties=3D""Excel
12.0;HDR=3DNO;IMEX=3D1;"=
";"
=20
23 Set MaCommande=3D New ADODB.Command
24 MaCommande.ActiveConnection =3D MaConnexion
25 MaCommande.CommandText =3D "SELECT * FROM ["
& "AlerteS=
em1" & "$" & Cellule & "]"
26 Set MonEnregistrement=3D New ADODB.Recordset
27 MonEnregistrement.Open MaCommande, , adOpenKeyset, adLo=
ckOptimistic
28 Alertes1.Range("A1").CopyFromRecordset
MonEnregistremen=
t
29 MonEnregistrement.Close '****************************=
***************************************************
30 Set MaCommande=3D New ADODB.Command
31 MaCommande.ActiveConnection =3D Source
32 MaCommande.CommandText =3D "SELECT * FROM ["
& "AlerteS=
em2" & "$" & Cellule & "]"
33 Set MonEnregistrement=3D New ADODB.Recordset
34 MonEnregistrement.Open MaCommande, , adOpenKeyset, adLo=
ckOptimistic
35 Alertes2.Range("A1").CopyFromRecordset
MonEnregistremen=
t
36 MonEnregistrement.Close
'****************************************************************=
***************
37 MaConnexion.Close
38 Set MaConnexion =3D Nothing
39 Set MonEnregistrement=3D Nothing
40 Set MaCommande=3D Nothing
bonsoir a tous,
je vous réponds un peu tard et je vous prie de m'excuser. prie par mon pojet j'en ai oublié de revenir sur le forum.
excel 2010 est bien limiter en import de données d'un classeur fermé à 255 colonne, j'ai donc fait un boucle et c'est lourd mais ca marche et la voici:
Sub Charge_ACTIVITESouMEDECINS()
Set Source = New ADODB.Connection
Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Chemin & ";Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;"";"
'****************************************
CodeNameFeuil = "ACTIVITES": Charge_ACTIVITESouMEDECINS
1 If Sommaire.Range("A19") = 1 Then Stop '**
Dim MaPlage
2 EventOff
3 On Error GoTo GereError_Charge_ACTIVITESouMEDECINS
4 Deprotege CodeNameFeuil
5 On Error Resume Next
6 Sheets(CodeNameFeuil).Range(Cells(3, 1), Cells(53, 3845)).SpecialCells(xlCellTypeAllValidation).Validation.Delete
7 On Error GoTo GereError_Charge_ACTIVITESouMEDECINS
8 With Sheets(CodeNameFeuil)
9 .Visible = xlSheetVisible
10 If CodeNameFeuil = "ACTIVITES" Then .Select
11 If CodeNameFeuil = "MEDECINS" Then .Select
'Stop
12 Quoi = "A1:IP53": ou = "A1": GoSub ExecuteRequete
13 Quoi = "IQ1:SF53": ou = "IQ1": GoSub ExecuteRequete
14 Quoi = "SG1:ABV53": ou = "SG1": GoSub ExecuteRequete
15 Quoi = "ABW1:ALL53": ou = "ABW1": GoSub ExecuteRequete
16 Quoi = "ALM1:AVB53": ou = "ALM1": GoSub ExecuteRequete
17 Quoi = "AVC1:BER53": ou = "AVC1": GoSub ExecuteRequete
18 Quoi = "BES1:BON53": ou = "BES1": GoSub ExecuteRequete
19 Quoi = "BOI1:BXX53": ou = "BOI1": GoSub ExecuteRequete
20 Quoi = "BXY1:CHN53": ou = "BXY1": GoSub ExecuteRequete
21 Quoi = "CHO1:CRD53": ou = "CHO1": GoSub ExecuteRequete
22 Quoi = "CRE:DAT53": ou = "CRE1": GoSub ExecuteRequete
23 Quoi = "DAU1:DKJ53": ou = "DAU1": GoSub ExecuteRequete
24 Quoi = "DKK1:DTZ53": ou = "DKK1": GoSub ExecuteRequete
25 Quoi = "DUA1:EDP53": ou = "DUA1": GoSub ExecuteRequete
26 Quoi = "EDQ1:ENF53": ou = "EDQ1": GoSub ExecuteRequete
27 Quoi = "ENG1:EQW53": ou = "ENG1": GoSub ExecuteRequete
'21 Stop
28 Application.Calculation = xlCalculationAutomatic
29 If CodeNameFeuil = "ACTIVITES" Or CodeNameFeuil = "MEDECINS" Then
30 .Range("A1").Value = ACTIVITES.Range("A1").Value
31 .Range("C1").FormulaR1C1 = "=DATE(R1C1-1,12,1)"
32 .Range("F1:EQW1").FormulaR1C1 = "=RC[-3]+1"
33 .Range("C2:E2").NumberFormat = "d"
34 .Range("C2").FormulaR1C1 = "=R1C"
35 .Range("D2").FormulaR1C1 = "=R1C[-1]"
36 .Range("E2").FormulaR1C1 = "=R1C[-2]"
37 .Range("C2:E2").AutoFill Destination:=Range("C2:EQW2"), Type:=xlFillDefault
38 .Range(Cells(4, 1), Cells(53, 1284)).SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = xlNone
39 End If
40 EventOff
'a remmettre en service si export ne marche plus
' Dim raEnum As Range
'Dim CelluleTiret As Range
'Set MaPlage = Sheets("ACTIVITES").Columns.ColumnDifferences(Sheets("ACTIVITES").Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 1))
'For Each raEnum In MaPlage.Areas
' CellSelect = raEnum.Address(0, 0)
'For Each CelluleTiret In ACTIVITES.Range(CellSelect)
'If ACTIVITES.Range(CelluleTiret.Address).Value = "_" Then ACTIVITES.Range(CelluleTiret.Address).Value = ""
'Next CelluleTiret
'Next raEnum
'Set MaPlage = Nothing
41 Set MaPlage = Nothing
42 End With
43 Protege CodeNameFeuil
44 EventOn
45 Exit Sub
'***************************************************************
ExecuteRequete:
46 FlagSortDeLa = "sortdela"
47 texte_SQL = "SELECT * FROM [" & CodeNameFeuil & "$" & Quoi & "]" ' "col 250
48 Set Rst = New ADODB.Recordset
49 Set Rst = Source.Execute(texte_SQL)
50 Sheets(CodeNameFeuil).Range(ou).CopyFromRecordset Rst
51 DoEvents
52 Return
53 Exit Sub
'*********************************************************************************************
GereError_Charge_ACTIVITESouMEDECINS:
54 NomProcAppelante ("Charge_ACTIVITESouMEDECINS")
55 Resume Next
End Sub
Avec mes sinceres remerciements
A Lyon je suis cadre de sant d'imagerie mdicale mais je fais de la fo= rmation bureautique et logiciels mtiers aux agents du chu. Je dveloppe aussi des applications de gestion en vba.
Pour que vous compreniez l'objet de ma demande il faut que je vous explique= , en gros, comment fonctionnent mes appli.
Toutes mes appli. se trouvent sur le rseau du chu et fonctionnent selon = le principe suivant:
Les utilisateurs clic sur un raccourci qui se trouve sur le bureau. Ce racc= ourci pointe vers un fichier vbs qui ouvre une copie d'un fichier XLT.
Le fichier utilisent comme base de donnes des classeurs ferms pour li= re et crire ce qui y est saisie..
A la fermeture cette copie s'auto dtruit pour qu'on ne puisse pas en gar= der une copie. Elle s'auto dtruit pour que les utilisateurs travaillent= toujours sur la dernire version car je fais voluer rgulirement= mes applis. Travailler avec des copies me permet d'avoir des applications multi-utilisa= teurs(apparemment!!!).
Je m'explique:
A l'ouverture l'appli lit des classeurs ferms pour importer les donne= s de paramtrage, les donnes de droits d'accs et les donnes sais= ies par les usagers. Les saisis des agents sont envoys dans le classeur ferm des donnes= saisies par les usagers. Lors de la lecture et l'criture mon code Vba vrifie que le fichier fe= rm de destination n'est pas entrain d'tre lu ou crit si c'est le c= as un timer de 2 secondes se dclenche, au bout de ces 2 secondes une nou= velle tentative est faite et ceci 5 fois. Au bout de 5 fois en cas d'chec un message demande l'usager de re= ssayer. En fait a arrive trs rarement(1 fois sur plus de 1000 essais malgr= plus de 180.000 connexions annuelles)
Pour lire et crire dans un classeur ferm j'utilise les ADO. Jusqu' maintenant j'utilisai excel 2002-2003!!!! 2010 est arriv!!!
Prsentation de ma problmatique: pour lire et crire dans un classeur ferm excel version 2010 il n'y a = pas de souci mais excel n'importe ou n'exporte que 255 colonnes. Comment arriver crire dans les colonnes suprieures 255. En fait pour les planning de travail des agents dans excel 2002-2003 il est= impossible de faire tenir 365 jours dans une seule feuille, alors que c'es= t possible dans 2010. Mais je ne peux pas lire ou crire plus de 255 colo= nnes.
6 Set MaConnexion = New ADODB.Connection 7 MaConnexion.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source== " & Chemin & ";Extended Properties=""Excel 12.0;HDR=NO;"";" 8 Set MaCommande= New ADODB.Command 9 MaCommande.ActiveConnection = MaConnexion 10 For Each CellSource In ActiveWorkbook.Sheets(Feuille).Range(PlageSource) 11 MaDonnee= CellSource.Value 12 DestCellAdr = Cells(LigCibleAgt + ConfirmeExport, ColAgt).Address(0= , 0) 13 ConfirmeExport = ConfirmeExport + 1
14 RangeDest = DestCellAdr & ":" & DestCellAdr 15 MaCommande.CommandText = "SELECT * from `" & Feuille &= "$" & RangeDest & "`" 16 Set MonEnregistrement= New ADODB.Recordset 17 MonEnregistrement.Open MaCommande, , adOpenKeyset, adLockOptimistic 18 If MaDonnee= "" Then MaDonnee= " " 19 MonEnregistrement (0).Value = MaDonnee 20 MonEnregistrement.Update DoEvents 21 Next CellSource 22 MaConnexion.Close 23 Set MaConnexion = Nothing 24 Set MaCommande= Nothing 25 Set MonEnregistrement= Nothing 26 Exit Sub
End Sub
CODE POUR LIRE 20 Cellule = "A1:GI200" 'Ref de la cellule contenant la donne r= cuprer
21 Set MaConnexion = New ADODB.Connection 22 MaConnexion .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Sou= rce=" & Chemin & ";Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;"= ";"
23 Set MaCommande= New ADODB.Command 24 MaCommande.ActiveConnection = MaConnexion 25 MaCommande.CommandText = "SELECT * FROM [" & "AlerteS= em1" & "$" & Cellule & "]" 26 Set MonEnregistrement= New ADODB.Recordset 27 MonEnregistrement.Open MaCommande, , adOpenKeyset, adLo= ckOptimistic
28 Alertes1.Range("A1").CopyFromRecordset MonEnregistremen= t 29 MonEnregistrement.Close '****************************= *************************************************** 30 Set MaCommande= New ADODB.Command 31 MaCommande.ActiveConnection = Source 32 MaCommande.CommandText = "SELECT * FROM [" & "AlerteS= em2" & "$" & Cellule & "]" 33 Set MonEnregistrement= New ADODB.Recordset 34 MonEnregistrement.Open MaCommande, , adOpenKeyset, adLo= ckOptimistic
35 Alertes2.Range("A1").CopyFromRecordset MonEnregistremen= t 36 MonEnregistrement.Close '****************************************************************= *************** 37 MaConnexion.Close 38 Set MaConnexion = Nothing 39 Set MonEnregistrement= Nothing 40 Set MaCommande= Nothing
bonsoir a tous, je vous réponds un peu tard et je vous prie de m'excuser. prie par mon pojet j'en ai oublié de revenir sur le forum. excel 2010 est bien limiter en import de données d'un classeur fermé à 255 colonne, j'ai donc fait un boucle et c'est lourd mais ca marche et la voici: Sub Charge_ACTIVITESouMEDECINS() Set Source = New ADODB.Connection Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Chemin & ";Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;"";" '**************************************** CodeNameFeuil = "ACTIVITES": Charge_ACTIVITESouMEDECINS
1 If Sommaire.Range("A19") = 1 Then Stop '** Dim MaPlage 2 EventOff 3 On Error GoTo GereError_Charge_ACTIVITESouMEDECINS 4 Deprotege CodeNameFeuil 5 On Error Resume Next 6 Sheets(CodeNameFeuil).Range(Cells(3, 1), Cells(53, 3845)).SpecialCells(xlCellTypeAllValidation).Validation.Delete 7 On Error GoTo GereError_Charge_ACTIVITESouMEDECINS
8 With Sheets(CodeNameFeuil) 9 .Visible = xlSheetVisible 10 If CodeNameFeuil = "ACTIVITES" Then .Select 11 If CodeNameFeuil = "MEDECINS" Then .Select
'Stop 12 Quoi = "A1:IP53": ou = "A1": GoSub ExecuteRequete 13 Quoi = "IQ1:SF53": ou = "IQ1": GoSub ExecuteRequete 14 Quoi = "SG1:ABV53": ou = "SG1": GoSub ExecuteRequete 15 Quoi = "ABW1:ALL53": ou = "ABW1": GoSub ExecuteRequete 16 Quoi = "ALM1:AVB53": ou = "ALM1": GoSub ExecuteRequete 17 Quoi = "AVC1:BER53": ou = "AVC1": GoSub ExecuteRequete 18 Quoi = "BES1:BON53": ou = "BES1": GoSub ExecuteRequete 19 Quoi = "BOI1:BXX53": ou = "BOI1": GoSub ExecuteRequete 20 Quoi = "BXY1:CHN53": ou = "BXY1": GoSub ExecuteRequete 21 Quoi = "CHO1:CRD53": ou = "CHO1": GoSub ExecuteRequete 22 Quoi = "CRE:DAT53": ou = "CRE1": GoSub ExecuteRequete 23 Quoi = "DAU1:DKJ53": ou = "DAU1": GoSub ExecuteRequete 24 Quoi = "DKK1:DTZ53": ou = "DKK1": GoSub ExecuteRequete 25 Quoi = "DUA1:EDP53": ou = "DUA1": GoSub ExecuteRequete 26 Quoi = "EDQ1:ENF53": ou = "EDQ1": GoSub ExecuteRequete 27 Quoi = "ENG1:EQW53": ou = "ENG1": GoSub ExecuteRequete '21 Stop 28 Application.Calculation = xlCalculationAutomatic 29 If CodeNameFeuil = "ACTIVITES" Or CodeNameFeuil = "MEDECINS" Then 30 .Range("A1").Value = ACTIVITES.Range("A1").Value 31 .Range("C1").FormulaR1C1 = "TE(R1C1-1,12,1)" 32 .Range("F1:EQW1").FormulaR1C1 = "=RC[-3]+1" 33 .Range("C2:E2").NumberFormat = "d" 34 .Range("C2").FormulaR1C1 = "=R1C" 35 .Range("D2").FormulaR1C1 = "=R1C[-1]" 36 .Range("E2").FormulaR1C1 = "=R1C[-2]"
37 .Range("C2:E2").AutoFill Destination:=Range("C2:EQW2"), Type:=xlFillDefault 38 .Range(Cells(4, 1), Cells(53, 1284)).SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = xlNone 39 End If 40 EventOff 'a remmettre en service si export ne marche plus ' Dim raEnum As Range 'Dim CelluleTiret As Range 'Set MaPlage = Sheets("ACTIVITES").Columns.ColumnDifferences(Sheets("ACTIVITES").Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 1)) 'For Each raEnum In MaPlage.Areas ' CellSelect = raEnum.Address(0, 0) 'For Each CelluleTiret In ACTIVITES.Range(CellSelect)
'If ACTIVITES.Range(CelluleTiret.Address).Value = "_" Then ACTIVITES.Range(CelluleTiret.Address).Value = "" 'Next CelluleTiret 'Next raEnum 'Set MaPlage = Nothing 41 Set MaPlage = Nothing 42 End With 43 Protege CodeNameFeuil 44 EventOn 45 Exit Sub '*************************************************************** ExecuteRequete: 46 FlagSortDeLa = "sortdela" 47 texte_SQL = "SELECT * FROM [" & CodeNameFeuil & "$" & Quoi & "]" ' "col 250 48 Set Rst = New ADODB.Recordset 49 Set Rst = Source.Execute(texte_SQL) 50 Sheets(CodeNameFeuil).Range(ou).CopyFromRecordset Rst 51 DoEvents 52 Return 53 Exit Sub '********************************************************************************************* GereError_Charge_ACTIVITESouMEDECINS: 54 NomProcAppelante ("Charge_ACTIVITESouMEDECINS") 55 Resume Next End Sub Avec mes sinceres remerciements