VBA sélection colonne vide du tableau
Bonjour, j'ai plusieurs "tableau".
j'ai fais un userform qui enregistre les données sur H2 à H5.
MaLigneEcriture = 2
If .Range("H2") = "" Then
.Range("H" & MaLigneEcriture).Value = Champ1
.Range("H" & MaLigneEcriture + 1).Value = Champ2
.Range("H" & MaLigneEcriture + 2).Value = Champ3
.Range("H" & MaLigneEcriture + 3).Value = Champ4
Else: MsgBox "déjà rempli la colonne"
End If
J'aimerais que si H2 est déjà rempli, il faut remplir à partir de I2.
Je vois bien comment le faire en "moche" avec elseif et en recopiant à chaque fois les .Range.
Est ce que c'est possible de savoir la première colonne vide du Range("H2:P5") et donc écrire dans cette première colonne vide
Cette formule sera utilisé pleins de fois suivant le tableau que je vais utilisé.
Merci de bien vouloir m'aider dans ce blocage.
Bonne journée
Bonjour,
un essai
Dim MaCol As Integer, FinP As Integer, MaLigneEcriture As Integer
'.../....
MaLigneEcriture = 2
FinP = 17 'N° colonne suivant la Fin de la Plage
MaCol = .Cells(MaLigneEcriture, FinP).End(xlToLeft).Column + 1
If MaCol > 16 Then 'vérification colonne libre
MsgBox "toutes les colonnes sont remplies"
Exit Sub
End If
.Cells(MaLigneEcriture, MaCol).Value = Champ1
.Cells(MaLigneEcriture + 1, MaCol).Value = Champ2
.Cells(MaLigneEcriture + 2, MaCol).Value = Champ3
.Cells(MaLigneEcriture + 3, MaCol).Value = Champ4
'.../...
A+
Merci beaucoup pour la réponse.
J'arrive bien a remplir la colonne. Ca commence bien à la colonne 8 mais je ne comprends pas comment le code le sait?
Pour le deuxième contrôle, Les champs font S2:AI9.
Avec le même code, je peux écrire aussi en S11:S18
Edit: je pense que c'est juste car j'ai déjà les cases de rempli à gauche. Quand je retire les écritures sur les colonnes avant, ca écrit donc avant.
Donc je pense qu'il faut que je rajoute que
if MaCol<8 Then MaCol = 8
Comme ça, j'écris forcément sur la bonne colonne minimum
Juste une question par rapport à mon précédent code
If MaCol<8 Then MaCol = 8
Ce n'est pas bien écrit normalement. Il devrait y avoir une End If après?
Mais si je l'ajouter, j'ai un soucis avec trop de End If alors que non? Je l'ai peut-etre mal écrit mais il fonctionne bien sans le End If d'où ma question
Si je met
If MaCol<8 Then
MaCol = 8
End If
Là, ca ne pose plus de soucis. C'est normal?
Je voulais simplifier en mettant des Tableaux.
Comme ça, je pense que ça sera plus simple pour le codage. mais la formule ne fonctionne plus.
Cela me dit que même si le tableau est vide, que MaCol est sur la colonne 17.
L'avantage pour moi du tableau est que s'il y a des ajouts en lignes ou en colonne, c'est plus facile que ça s'adapte automatiquement sur certains tableaux.
.../... Ca commence bien à la colonne 8 mais je ne comprends pas comment le code le sait? .../...
.Cells(MaLigneEcriture, FinP).End(xlToLeft).Column
se positionne à l'intersection de la ligne MaLigneEcriture et de la colonne FinP, et "recherche" vers la gauche la première cellule renseignée et renvoie son N° de colonne. On rajoute +1 pour avoir le N° de colonne de la cellule vide juste après.
Ca marchait car il me semblait apercevoir des "titres" en colonne 7. S'il n'y a désormais plus de titre il faudra utiliser ce genre de code:
If MaCol<8 Then MaCol = 8
Pour l'utilisation des tableaux structurés, joignez un classeur pour y mener quelques tests
...
Bonjour, d'accord je comprends mieux. J'ai joins un fichier d'où j'ai mis un tableau (Tableau 7) sur la feuille config et donc la formule ne fonctionne plus.
Après tant pis si je ne met pas sous forme de tableau. Je me suis dis que ça serait plus simple de faire un .Range("Tableau 7[Premiers Controles] ")
Comme ça, si des colonnes se rajoute, pas besoin de modifier le code à chaque fois.
En gros, tableau de bord bordure Rouge => Formulaire 1er controle, bordure Orange => 2eme controle, Bordure Vert => pas fait encore et on enregistre toutes les informations dans config.
Dans le formulaire controle 2, faut remplir les cases car j'ai mis une sécurité
En gros le code est une sécurité
If MaCol<8 Then MaCol = 8
Car si dans la cellule il n'y a pas de texte à gauche, il ne copiera pas au bon endroit.
Edit: je n'arrive pas avec un code
For i = 1 To 9
txtNiv = "txtNiv" & i
txtNiv = ""
Next i
En faite, je veux réduire les lignes et donc faire effacer le formulaire avec une boucle vu que chaque nom a juste un numéro d'écart :
txtNiv1,txtNiv2,txtNiv3, etc
Mais ce code n'efface pas mon formulaire
If Not IsNumeric(.txtNiv1) Then
Message = "Le champ Niveau 1 n'est pas un nombre"
Réponse = MsgBox(Message, vbOKOnly, "Controle de saisie")
errorlevel = 1
End If
Dans le fichier final, les erreurs sont fait par un champs erreurlevel et donc si =0, on peut enregistré les valeurs.
Je voudrais bien aussi faire le i avec une boucle pour que le fichier ne fasse pas 1000 lignes. Après, peut-être vaut mieux laisser chaque champs pour plus de facilité quand on relit le code (même si je met beaucoup de commentaire pour m'en souvenir de ce que je fait.)
J'ai essayé plusieurs choses sur les tableaux structurés, le mieux serait ceci qui permet de s'affranchir des N° de lignes et colonnes en dur :
Dim T As ListObject, Lig As Long, Col As Long, DerCol As Long
With Worksheets("config")
Set T = .ListObjects("Tableau7")
Lig = T.ListRows(1).Range.Row 'N° première ligne
Col = T.ListColumns(1).Range.Column 'N° première colonne
DerCol = T.ListColumns(T.ListColumns.Count).Range.Column 'N° dernière colonne
MaCol = .Cells(Lig, DerCol).End(xlToLeft).Column
If .Cells(Lig, MaCol).Value <> "" Then MaCol = MaCol + 1
If MaCol > DerCol Then 'vérification colonne libre
MsgBox "toutes les colonnes sont remplies"
Exit Sub
End If
.Cells(Lig, MaCol).Value = "Champ1"
.Cells(Lig + 1, MaCol).Value = "Champ2"
.Cells(Lig + 2, MaCol).Value = "Champ3"
.Cells(Lig + 3, MaCol).Value = "Champ4"
End With
Mais la ligne de code :
MaCol = .Cells(Lig, DerCol).End(xlToLeft).Column
renvoie, (pour le Tableau7) :
- 8 si le tableau est vide
- 8 si la première colonne est remplie
- 9 si tout le tableau est rempli
- valeurs correctes entre ces extrêmes
J'abandonne .....
Pour les questions annexes, le mieux est sans doute de poster une nouvelles discussion...
Bonne suite
une solution qui fonctionne :
Dim T As ListObject, Lig As Long, Col As Long, DerCol As Long, Vide As Boolean
With Worksheets("config")
Set T = .ListObjects("Tableau7")
Lig = T.ListRows(1).Range.Row 'N° première ligne
Col = T.ListColumns(1).Range.Column 'N° première colonne
DerCol = T.ListColumns(T.ListColumns.Count).Range.Column 'N° dernière colonne
For i = Col To DerCol
If .Cells(Lig, i) = "" Then
Vide = True
Exit For
End If
Next
If Vide Then
MaCol = i
Else
MsgBox "toutes les colonnes sont remplies"
Exit Sub
End If
.Cells(Lig, MaCol).Value = "Champ1"
.Cells(Lig + 1, MaCol).Value = "Champ2"
.Cells(Lig + 2, MaCol).Value = "Champ3"
.Cells(Lig + 3, MaCol).Value = "Champ4"
End With
Merci énormément pour ce travail.
Cela fonctionne à merveille.
Je regardais pour faire la même chose avec les tableaux du dessous comme sur l'image du premier post mais ca sera trop compliqué.
Comme ça, c'est top et donc meme si les lignes et colonnes ne sont plus les mêmes, cela restera identique (sauf si des lignes se rajoute dans config entre les tableaux mais bon, on va pas non plus complexifier la chose)
J'ai ajouté un Dim i as integer pour le i utilisé
J'ai remplacé "champ1" en champ1 pour avoir mes données.
Set T = .ListObjects("Tableau7")
Pour que ça fonctionne avec les autres tableaux, il suffit de modifier le nom du tableau dans la ligne de code ci dessus, le reste du code est sans changement .