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

14consultation.xlsm (40.47 Ko)

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

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é.

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.

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

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

Rechercher des sujets similaires à "sauvegarder userform utilisant numeros colonne"