VBA sélection colonne vide du tableau

Bonjour, j'ai plusieurs "tableau".

excel

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

...

6classeur3.xlsm (44.25 Ko)

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 .

Rechercher des sujets similaires à "vba selection colonne vide tableau"