Bordure de cellule

Fanoo

XLDnaute Nouveau
Bonjour à tous,

Je débute en VBA et j'ai commencé à coder une fonction qui crée un tableau à 2 dimensions dans lesquel est inscrit des lettres aléatoires de A à Z. Je souhaite encadrer les cellules de mon tableau par des bordures hors je rencontre un problème(Excel plante) je pense de mémoire car mon tableau sera dynamique par la suite et je souhaite tester la feuille en entier pour savoir quelle cellule j'aurai à encadrer suivant la taille de mon tableau.(Une cellule pleine egale une case de mon tableau)
Voici mon code si quelqu'un à une explication à se plantage et si meilleur idée pour encadrer mon tableau avec des bordures:

Merci d'avance de me lire et de me répondre!

Option Explicit

Sub encadrer_tableau()

Dim i As Integer
Dim j As Integer
Dim cellule As Range
Dim VarTab(1 To 3, 1 To 6) As String

For i = 1 To UBound(VarTab, 1)
For j = 1 To UBound(VarTab, 2)
VarTab(i, j) = Chr(Int((26 * Rnd) + 1) + 64)
Debug.Print VarTab(i, j)
Next i
Next j

For Each cellule In Range("A1", Range("A1").End(xlToRight).End(xlDown))
If cellule.Value <> "" Then cellule.Borders.Weight = xlThin
Next

End Sub
 

laurent950

XLDnaute Accro
Re : Bordure de cellule

Bonsoir,

aprés révison de votre code cela pourrais donnée cela :

Option Explicit

Sub encadrer_tableau()

Dim i As Integer
Dim j As Integer
Dim cellule As Range
Dim VarTab(1 To 3, 1 To 6) As String

For i = 1 To UBound(VarTab, 1)
For j = 1 To UBound(VarTab, 2)
VarTab(i, j) = Chr(Int((26 * Rnd) + 1) + 64)
Debug.Print VarTab(i, j)
Bordure i, j
Next j ' ici j est pas i
Next i ' ici i est pas j

' Restitution du resultat
For i = 1 To UBound(VarTab, 2)
Cells(1, i).Resize(UBound(VarTab, 1)) = Application.Index(VarTab, , i)
Next i

End Sub

et la fonction pour les bordures

Function Bordure(i, j)

Cells(i, j).Borders.Weight = xlThin

End Function

Bien sur a adapté mais cela peux etre plus pratique

je vous join le fichier excel

laurent
 

Pièces jointes

  • BordurePlusDonnéAvecTableau.xlsm
    18.7 KB · Affichages: 59

ROGER2327

XLDnaute Barbatruc
Re : Bordure de cellule

Bonjour Fanoo, laurent950



Comme ça :​
VB:
Sub encadrer_tableau()

Dim i As Integer
Dim j As Integer
Dim cellule As Range
Dim VarTab(1 To 3, 1 To 6) As String

    For i = 1 To UBound(VarTab, 1)
        For j = 1 To UBound(VarTab, 2)
            VarTab(i, j) = Chr(Int(26 * Rnd) + 65)
        Next j
    Next i

    Range("A1").Resize(UBound(VarTab, 1), UBound(VarTab, 2)).Value = VarTab

    For Each cellule In Range("A1", Range("A1").End(xlToRight).End(xlDown))
        If cellule.Value <> "" Then cellule.Borders.Weight = xlThin
    Next

End Sub
ça fonctionne...

Ou encore :​
VB:
Sub encadrer_tableau_1()

Dim i As Integer
Dim j As Integer
Dim cellule As Range
Dim VarTab(1 To 3, 1 To 6) As String

    For i = 1 To UBound(VarTab, 1): For j = 1 To UBound(VarTab, 2)
        VarTab(i, j) = Chr(Int(26 * Rnd) + 65)
    Next j, i

    With Range("A1").Resize(UBound(VarTab, 1), UBound(VarTab, 2))
        .Value = VarTab
        .Borders.Weight = xlThin
    End With

End Sub



ROGER2327
#6039


Vendredi 20 Gidouille 139 (Saint Périnée, zélateur - fête Suprême Quarte)
16 Messidor An CCXX, 1,0130h - tabac
2012-W27-3T02:25:53Z
 

Fanoo

XLDnaute Nouveau
Re : Bordure de cellule

Je rencontre un nouveau problème dont je voudrai vous faire part. je souhaite récupérer les valeur de deux cellules d'une feuille différente pour dimensionner mon tableau hors avec mon code Visual Basic me renvoi une erreur l'indice n'appartient pas à la sélection ou alors quand je le déclare le tableau avec les valeurs de ces cellules directement l'erreur est 'constante requise dans la déclaration du tableau je ne comprend pas pourquoi??
Merci d'avance!!

Sub encadrer_tableau()

Dim i As Integer
Dim j As Integer
Dim cellule As Range
Dim VarTabLigne As Integer
Dim VarTabColonne As Integer
Dim VarTab() As String

VarTabLigne = Worksheets("Feuill2").Range("H6").Value
VarTabColonne = Worksheets("Feuill2").Range("H7").Value

ReDim VarTab(1 To VarTabLigne, 1 To VarTabColonne)

For i = 1 To UBound(VarTab, 1)
For j = 1 To UBound(VarTab, 2)
VarTab(i, j) = Chr(Int((26 * Rnd) + 1) + 64)
Debug.Print VarTab(i, j)
Next j
Next i

Range("B3").Resize(UBound(VarTab, 1), UBound(VarTab, 2)).Value = VarTab

For Each cellule In Range("B3", Range("B3").End(xlToRight).End(xlDown))
If cellule.Value <> "" Then cellule.Borders.Weight = xlThin
Next

End Sub
 

ROGER2327

XLDnaute Barbatruc
Re : Bordure de cellule

Re...


Je rencontre un nouveau problème dont je voudrai vous faire part. je souhaite récupérer les valeur de deux cellules d'une feuille différente pour dimensionner mon tableau hors avec mon code Visual Basic me renvoi une erreur l'indice n'appartient pas à la sélection ou alors quand je le déclare le tableau avec les valeurs de ces cellules directement l'erreur est 'constante requise dans la déclaration du tableau je ne comprend pas pourquoi??
(...)
Difficile de se faire une opinion sans le support du code... À tout hasard, avez-vous un onglet nommé Feuill2 dans votre classeur ? les cellules H6 et H7 contiennent-elles des entiers strictement positifs ?
Je ne vois guère d'autre raison qui empêche l'exécution du code.​


Bon courage.



ROGER2327
#6040


Vendredi 20 Gidouille 139 (Saint Périnée, zélateur - fête Suprême Quarte)
16 Messidor An CCXX, 4,2995h - tabac
2012-W27-3T10:19:08Z
 

Fanoo

XLDnaute Nouveau
Re : Bordure de cellule

oui, j'ai une feuille nommé Feuille2 et des entiers strictement positifs dans H6 et H7... Du coup je ne comprends pas pourquoi le code ne marche pas...
En piece jointe le fichier Excel si ca peut aider..
 

Pièces jointes

  • Test.xlsm
    25.3 KB · Affichages: 50
  • Test.xlsm
    25.3 KB · Affichages: 53
  • Test.xlsm
    25.3 KB · Affichages: 52

Fanoo

XLDnaute Nouveau
Re : Bordure de cellule

Re Roger,

Avec ce code cela fonctionne parfaitement

Sub encadrer_tableau()

Dim i As Integer
Dim j As Integer
Dim cellule As Range
Dim VarTabLigne As Integer
Dim VarTabColonne As Integer
Dim VarTab() As String

VarTabLigne = Worksheets("Feuil2").Range("H7").Value
VarTabColonne = Worksheets("Feuil2").Range("H6").Value


ReDim VarTab(VarTabLigne, VarTabColonne)

For i = 1 To UBound(VarTab, 1)
For j = 1 To UBound(VarTab, 2)
VarTab(i, j) = Chr(Int((26 * Rnd) + 1) + 64)
Debug.Print VarTab(i, j)
Next j
Next i

With Range("B3").Resize(UBound(VarTab, 1), UBound(VarTab, 2))
.Value = VarTab
.Borders.Weight = xlThin

End With

End Sub

alors qu'avec celui la le programme reboucle indéfiniment au niveau du remplissage des bordures:

Sub encadrer_tableau()

Dim i As Integer
Dim j As Integer
Dim cellule As Range
Dim VarTabLigne As Integer
Dim VarTabColonne As Integer
Dim VarTab() As String

VarTabLigne = Worksheets("Feuil2").Range("H7").Value
VarTabColonne = Worksheets("Feuil2").Range("H6").Value


ReDim VarTab(VarTabLigne, VarTabColonne)

For i = 1 To UBound(VarTab, 1)
For j = 1 To UBound(VarTab, 2)
VarTab(i, j) = Chr(Int((26 * Rnd) + 1) + 64)
Debug.Print VarTab(i, j)
Next j
Next i

Range("B3").Resize(UBound(VarTab, 1), UBound(VarTab, 2)).Value = VarTab

For Each cellule In Range("B3", Range("B3").End(xlToRight).End(xlDown))
If cellule.Value <> "" Then cellule.Borders.Weight = xlThin
Next

End Sub

Si vous savez pourquoi j'aimerais bien connaitre la raison..
 

ROGER2327

XLDnaute Barbatruc
Re : Bordure de cellule

Re...


oui, j'ai une feuille nommé Feuille2 et des entiers strictement positifs dans H6 et H7... Du coup je ne comprends pas pourquoi le code ne marche pas...
En piece jointe le fichier Excel si ca peut aider..
Si vous avez une feuille Feuille2 dans le classeur, faites y référence dans le code avec Feuille2.
Dans le code du message #5, vous ne faites pas référence à une feuille Feuille2, mais à une feuille Feuill2, d'où le problème...

Par ailleurs, dans le classeur joint, vous n'avez ni Feuille2, ni Feuill2. Mais vous une feuille Feuil2. Comme le code utilise cette dernière dénomination, il devrait fonctionner. Mais il ne fonctionne pas...

Pourquoi ? Tout simplement parce que le code qui ne fonctionne pas dans votre classeur n'est pas celui que vous donnez au message #5. Celui du message fonctionne (à la double condition qu'il existe réellement une feuille Feuill2 et que les contenus de H6 et H7 soient supérieurs à 1), je l'ai essayé.

Par contre, le code qui est dans votre classeur est bien différent : vous y avez remplacé Feuill2 par Feuil2 (ce qui est une bonne idée puisque le classeur contient justement une feuille Feuil2) et, surtout, remplacé
Code:
ReDim VarTab(1 To VarTabLigne, 1 To VarTabColonne)
par
Code:
ReDim VarTab(VarTabLigne, VarTabColonne)
ce qui est une moins bonne idée.

En effet, ce faisant, l'indiçage de votre tableau commence par 0 et non par 1. Par conséquent, la boucle de remplissage qui suit laisse vides la première ligne et la première colonne du tableau. Il s'ensuit que, fixant l'affichage du tableau à la cellule B3, la ligne 3 et la colonne B restent vides.
Et la catastrophe arrive ici :
Code:
For Each cellule In Range("B3", Range("B3").End(xlToRight).End(xlDown))
... et la plage de travail devient B3:XFD1048576 soit une plage de, excusez du peu,
17 178 787 842 cellules.​
Ca risque de traîner un peu (surtout, sait-on jamais, s'il se trouve par ailleurs une petite procédure évènementielle de derrière les fagots...)

Il convient donc d'une part d'être rigoureux dans l'écriture du code, d'autre part de préciser ce que vous voulez réeelement faire avec cette procédure. En l'état, il me semble qu'écrire
Code:
With Range("B3").Resize(UBound(VarTab, 1), UBound(VarTab, 2))
   .Resize(UBound(VarTab, 1), UBound(VarTab, 2)).Value = VarTab
   .Resize(UBound(VarTab, 1) - 1, UBound(VarTab, 2)- 1).Offset(1, 1).Borders.Weight = xlThin
End With
au lieu d'utiliser la boucle For Each cellule ... Next donnera bien plus rapidement le résultat souhaité.

À moins qu'il y ait encore des contraintes qui nous échappent...​


À suivre ?



ROGER2327
#6042


Vendredi 20 Gidouille 139 (Saint Périnée, zélateur - fête Suprême Quarte)
16 Messidor An CCXX, 6,1971h - tabac
2012-W27-3T14:52:23Z
 

Fanoo

XLDnaute Nouveau
Re : Bordure de cellule

Merci encore pour l'aide et pour vos explications!

J'ai essayé de modifier mon code en prenant compte de vos instruction mais je rencontre toujours un problème de compilation que j'ai du mal à saisir voila le code modifié je ne sais pas si mes changements sont correctes?(je ne pense pas vu que ça ne compile pas...)

Ensuite pour ce qui est de cette procédure je veux juste créer un tableau dynamique(avec bordure sur la plage définis) par le biais des cellules qui donnent le nombre de lignes et de colonnes.

Par la suite je souhaite remplir ce tableau avec d'autres informations que des lettres aléatoires pour réaliser une planification automatique:
-mettre de la couleur dans certaines cases
-Fusionner des cellules
-Rajouter des contraintes(exemple on ne peut pas faire une même activité avec 2 groupe en même temps...)

Donc je suis au début du projet, et votre aide m'est très précieuse cela me permet d'avancer et de mieux comprendre la programmation en VBA.

Voici une version du classeur qui vous aidera peut-être à mieux comprendre le principe..(avec le code enFeuil3 qui ne compile pas et sur lequel je ne comprend pas l'erreur alors que le code en feuille 2 est assez similaire...)

Merci encore!
 

Pièces jointes

  • TestPlannif.xlsm
    60.2 KB · Affichages: 48

ROGER2327

XLDnaute Barbatruc
Re : Bordure de cellule

Bonjour à tous, bonjour Fanoo



Ce nouveau classeur n'a pas grand chose à voir avec le précédent. J'avoue que je ne comprends pas bien votre but et le sens des paramètres recensés dans l'onglet Feuil2.

Par contre, ce que je vois bien, c'est que vous cherchez les dimensions d'un tableau dans l'onglet Feuil2, cellules H6 et H7 :
Code:
VarTabLigne = Worksheets("Feuil2").Range("H7").Value
VarTabColonne = Worksheets("Feuil2").Range("H6").Value
Malheureusement, ces cellules sont vides, d'où plantage...
Je vois aussi un dimensionnement bizarre, compte tenu des messages précédents :
Code:
ReDim VarTab(VarTabLigne, VarTabColonne)
À moins que vous ayez besoin d'un tableau avec une première ligne et une première colonne vide, ce qu'il faudrait préciser.

Bref, je n'y comprends plus rien... Désolé.​


ROGER2327
#6052


Samedi 21 Gidouille 139 (Saint Spéculum, confesseur - fête Suprême Quarte)
17 Messidor An CCXX, 7,2709h - groseille
2012-W27-4T17:27:01Z
 

Fanoo

XLDnaute Nouveau
Re : Bordure de cellule

Bonjour roger,

Je suis désolé si mes explications ne sont pas très claires mais c'est que ce n'est pas si évident à expliquer c'est pour ça que j'avance pas à pas dans le projet.Au niveau de la création du tableau je n'ai plus de soucis et non je ne voulais pas de colonnes vide c'est juste que j'ai modifié mon fichier pour l'envoyer sur le forum et bien sur je suis allé un peu vite d'où les petites erreurs..

Pour la feuill2 je l'utilise pour recenser les résultats des mes calculs pour faciliter le code lorsque je crée d'autre fonction car étant novice je trouve cela plus simple...Ne pas regarder le code de la feuil2 c'était juste un début d'idée mais qui n'est pas intéressante.

Maintenant que j'arrive à créer le tableau en Feuil3 avec la fonction que vous m'avez aider à coder je souhaite calculer le temps total de chaque activité: ex ds le fichier joint l'activité match de foot dur 5 + 5 donc 10 min de même pour le golf.. et de les insérer dans les paramètres de la feuille2.

Pour ce faire je pense qu'il faut parcourir colonne par colonne le tableau de la feuille 1 et si la cellule de la colonne parcouru n'est pas vide on prend la valeur de la cellule correspondant dans la colonne E et on additionne si l'on trouve plusieurs cellule non vide dans la colonne.

Cependant j'ai du mal à mettre en œuvre cette logique au niveau du code donc si vous avez une idée n'hésitez pas!

Merci pour vos réponses
 

Pièces jointes

  • Xl0000018.xls
    120 KB · Affichages: 40

Discussions similaires

Réponses
11
Affichages
336

Statistiques des forums

Discussions
312 392
Messages
2 088 004
Membres
103 693
dernier inscrit
vincs