Sauvegarder un Userform en utilisant les numéros de colonne
Bonjour à toutes et à tous,
J'ai un tableau Excel avec des noms dans la colonne A, puis des données administratives et médicales dans les colonnes suivantes (aucun accès au tableau, tout est géré par l'intermédiaire de différents Userform).
J'arrive (en colonne BQ) à l'enregistrement des données de la consultation (de BQ à CR = 28 items). Mais bien entendu il y aura plusieurs consultations par personne, avec la nécessité de dupliquer les données de BQ à CR afin de pouvoir les modifier.
J'utilisais jusqu'à présent le classique :
Pour la consultation n° 1
Sheets("BASE").Range("BQ" & J).Value = CbConsult1 ' le ComboBox CbConsult1 étant l'objet de la consultation ; Sheets("BASE").Range("BR" & J).Value = CbConsult2 ' les Signes fonctionnels ...
Pour pouvoir enregistrer la consultation n° 2, je pensais utiliser le n° de consultation comme variable + 28 (les 28 items à enregistrer) et pour cela utiliser les numéros de colonne, soit colonne 96 (CR) + 28, mais je ne vois pas du tout comment le formuler
Sheets("BASE").Range(Cell.Offset(0, 28("BQ" & J).Value) = CbConsult1 ?
Et ensuite comment faire défiler les consultations avec le SpinButton ?
Un grand merci à celles ou ceux qui voudront bien prêter attention à mon problème.
Pedro89
Re-bonjour à toutes et à tous,
je n'avais pas assez réfléchi et maintenant j'ai compris la sauvegarde simple de la consultation 1 en utilisant le n° de colonne :
Sheets("BASE").Cells(J, 69).Value = CbConsultu1 'Objet
Sheets("BASE").Cells(J, 70).Value = CbConsultu2 'Signes cliniques....
mais c'est les suivantes qui posent problème : faut-il utiliser la fonction Offset pour décaler l'enregistrement de 28 colonnes (nombre d'items à sauvegarder) ou directement introduire dans l'adresse de la cellule de destination la valeur du décalage :
Dim i As Long 'numéro d'ordre de la consultation
Sheets("BASE").Cells(J, (69 + (i x28))).Value = CbConsultu1 'Objet
et en écrivant non pas Cells(J, (69 + (i * 28))).Value, mais Sheets("BASE").Cells(J, (41 + (i * 28))).Value (41 = 69 - 28) puisque la première consultation commence à 1 et non pas 0
Mais ça ne marche PAS ! Rien n'est enregistré
Cordialement
Re-Re-Bonjour à toutes et à tous,
Avec Offset, ça enregistre correctement pour la deuxième consultation :
Sheets("BASE").Cells(J, 69).Offset(0, 28).Value = CbConsultu1 'Objet
Sheets("BASE").Cells(J, 70).Offset(0, 28).Value = CbConsultu2 'Signes cliniques...
Mais je ne sais pas indexer pour aller au-delà. En mettant une variable NC (numéro de la consult) à la place de 28 : (NC * 28)
Sheets("BASE").Cells(J, 69).Offset(0, (NC * 28)).Value = CbConsultu1, l'Offset ne fonctionne plus
De même si j'ajoute une variable dans Cells :
Dim i As Long
i = NC * 28 'Numéro de consult * 28
Sheets("BASE").Cells(J, (69 + i)).Value = CbConsultu1, l'Offset ne fonctionne pas non plus.
Cordialement
bonjour,
Cette construction ne me semble pas viable avec Excel :
Il faut absolument utiliser ACCESS ou SGBD pour ce genre de données.
A+
Merci pour cet encouragement qui est peut-être la voie de la raison,
Mais j'ai déjà franchi énormément d'obstacles et je me suis pris de passion pour le VBA, débutant depuis 4 mois, ça m'embêterait vraiment de devoir abandonner aussi près du but alors que tout le reste fonctionne parfaitement
De plus il n'y a pas Access là où je travaille : on en est encore au papier
J'avais aussi songé à enregistrer dans des ListBox (une ligne par consult), mais ça me semble encore plus compliqué, pour que ça reste cohérent, il faudrait renseigner aussi les items non cochés...
Je continue à chercher
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
VBA n'est pas en cause mais j'irai un peu dans le même sens que Galopin01.
Après avoir jeté un œil sur ta base de données Excel, j'avoue ne pas avoir compris quelles étaient les données rattachées à une consultation, d'autant plus que certaines vont de 1 à 6 et d'autres de 1 à 10.
Il me semble tout de même qu'une certaine rationalisation de ta base de données serait nécessaire pour un meilleur fonctionnement de ton application ou pour une obtention d'aide.
Bonjour,
je n'ai fourni qu'une toute petite partie de la base qui contient actuellement 11 Userform. Ca commence avec la saisie de l'identité et du mots de passe et la gestion des autorisations. l'Userform suivant gère les identités des patients et leurs renseignements administratifs (j'ai supprimé volontairement toute une partie des en-têtes de colonnes par discrétion. Un autre Userform gère le dossier médical proprement-dit avec les antécédents, les traitements... Un autre gère des tests et des examens particuliers. Un autre établi des bilans, un autre une fiche de liaison directement imprimable...
Les données dans la base vont de 1 à 6 pour les Combobox, 1 à 11 pour les TextBox et 1 à 10 pour les CheckBox, ce qui fait bien 28.
Bref, à partir du nom d'une personne tous les renseignements et examens tiennent sur la même ligne et on arrive ainsi à la colonne BQ (69). Mais là on a des saisies répétitives qui doivent rester enregistrées avec chaque fois le même nombre d'items (28) mais différents. D'ou mon idée de sauvegarder ces items toujours sur la même ligne (J) avec un décalage de 28, chaque consultation correspondant à une plage de 28 colonnes sur la même ligne J.
J'avais aussi songé à des ListBox multicolonnes, mais ça me semble encore plus compliqué.
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Au vu du grand nombre de tes champs de données (69) , il serait plus judicieux au niveau VBA de travailler avec des références de nom plutôt qu'avec des identifications de colonne. Si des colonnes sont ajoutées ou supprimées ultérieurement, la mise à jour de ton code risque d'être compliquée.
c'est vrai, j'en ai fait l'expérience bien des fois !
En fait il y a 96 champs de données avec la consultation (28 items) que j'ai placés en dernier dans l'idée de pouvoir les ajouter à chaque nouvelle consultation.
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bien.
Alors nomme tes champs individuellement ou par groupe cohérent. A priori déjà 3 noms pour ces 3 ensembles
pedro89 a écrit :Les données dans la base vont de 1 à 6 pour les Combobox, 1 à 11 pour les TextBox et 1 à 10 pour les CheckBox, ce qui fait bien 28.
Puis, effectue les changements nécessaires dans ton code.
Pour les champs individuels, utiliser :
Range("nom_n").rows(i)
où i est l'indice de la ligne
Pour les champs groupés, utiliser :
Range("nom_n").cells(i,j)
où i est l'indice de la ligne et j l'indice de colonne du groupe.
Je me suis sans doute mal exprimé. En fait, on peut très bien faire abstraction des 67 colonnes précédant Bq et ne garder que la colonne A pour les nom. J étant le n° de la ligne correspondant au nom.
La difficulté est de dupliquer les 28 cellules de la Ligne J vers la droite à chaque nouvelle consultation.
Puisque ça ne marche pas - enfin, je ne sais pas le faire - en ajoutant une variable dans le calcul de l'Offset, je vais faire ce calcul sur une autre feuille de paramétrage et mettre le résultat directement dans l'Offset. Ce résultat sera incrémenté de 28 à chaque nouvelle consultation par le n° de la consult.
Est-ce cohérent ?
Merci pour vos conseils.
Pedro89
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonsoir,
Après réflexion, je ne pense pas que vous soyez sous Excel dans la meilleure organisation de données, ce qui complexifie votre code.
Une solution pourrait être d'avoir 2 onglets :
1- une base patients avec ses données médicales : une ligne par patient identifié par exemple par son N° SS,
2- une base consultations : une ligne par consultation avec l'identification du patient. Un lien hypertexte vers cette base serait ajouté dans la première base pour chaque consultation du patient.
Je pense que cette disposition des données simplifierait votre code.
Bonjour,
Votre proposition de lien hypertexte semble très intéressante et permettrait d'étendre ainsi la base dans une 3ème dimension avec une gestion beaucoup plus facile des consultations (le lien se fera avec le NumRef unique qui est attribué à chaque patient par la base et plus court que le NSS)
Je vais m'y mettre dès ce soir en rentrant du travail
Merci pour votre suggestion.
Je vous tiens au courant
pedro89
Bonjour,
Finalement, pas besoin de lien hypertexte, j'ai transposé les colonnes "BQ" à "CR" dans une nouvelle feuille de "A" à "AC".
Pour le lien, j'utilise le NumRef de chaque patient concaténé avec le n° de la consultation (on passe de 5 à 6 chiffres). Ce LbConcat (c'est un Label dont le Caption est le n° de la consultation) se trouve en colonne A et permet de faire classement par N°.
Mais j'ai un problème : j'arrive bien à sauvegarder tous les items de l'Userform de la consultation dans les cellules correspondantes de la ligne L, mai je n'arrive pas à faire l'inverse pour alimenter les contrôles de l'Userform. je fais :
Dim i As Long
Dim L As Long
Set Ws = Sheets("CONSULT")
For L = 2 To Ws.Range("A" & Rows.Count).End(xlUp)
Me.Controls("LbConcat") = Ws.Cells(L, "A")
For i = 1 To 27
Me.Controls("TxConsultu" & i) = Ws.Cells(L, i + 1)
Next i
Il doit manquer quelque chose
A l'aide !
pedro89
Désolé, mauvais copier-coller :
With Me.LbConcat
For L = 2 To Ws.Range("A" & Rows.Count).End(xlUp) '.Row.Range("A" & L)
Next L
Me.Controls("LbConcat") = Ws.Cells(L, "A")
For i = 1 To 11
Me.Controls("TxConsultu" & i) = Ws.Cells(L, i + 1)
Next i
End With
pedro89
... Suite
J'ai trouvé en définissant la ligne active par le nombre concaténé en colonne A
L = Columns("A").Find(N, lookat:=xlWhole).Row
With Me.LbConcat
Me.Controls("LbConcat") = Ws.Cells(L, "A")
For i = 1 To 11
Me.Controls("TxConsultu" & i) = Ws.Cells(L, i + 1)
Next i
End With
Maintenant comment passer d'une consultation à l'autre ? C'est à dire passer d'une ligne à l'autre dont dont les 5 premiers chiffres du LbConcat sont identiques et dont seul le 6ème et dernier chiffre permettrait de passer d'une consultation à l'autre ?
pedro89
Voilà, tout fonctionne :
les fiches Identité sont classées par nom en colonne A de la feuille Identité,
les fiches de consultation sont classées par n° de référence en colonne A de la feuille Consultation.
Un grand merci à thev qui m'a suggéré cette disposition.
Bonne journée à tous.
pedro89