Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
728 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Macro de "mise en forme"

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Macro de "mise en forme"

n°1576341
barca-powa
Posté le 18-06-2007 à 16:06:08  profilanswer
 

Bonjour!
 
J'ai une macro qui me fait pleins de jolie chose (import .csv, supprime 2 caractaires, compare 2 colones et mais OK ou NOK selon s'elles sont différentes)
 
Voici la macro:

Code :
  1. Option Explicit
  2.  
  3. Sub Csv()
  4. Dim Fichier As Variant
  5.     ChDir ThisWorkbook.Path
  6.     Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv" )
  7.     If Fichier <> False Then
  8.         LireVerifier Fichier
  9.     End If
  10. End Sub
  11.  
  12. Function LireVerifier(ByVal NomFichier As String)
  13. Dim Chaine As String
  14. Dim Ar() As String
  15. Dim i As Long
  16. Dim iRow As Long, iCol As Long
  17. Dim NumFichier As Integer
  18. Dim Separateur  As String * 1
  19.  
  20.     Separateur = ";"
  21.      
  22.     Cells.Clear
  23.     Application.ScreenUpdating = False
  24.     NumFichier = FreeFile
  25.     iRow = 10
  26.    
  27.     Open NomFichier For Input As #NumFichier
  28.         Do While Not EOF(NumFichier)
  29.             iCol = 1
  30.             Line Input #NumFichier, Chaine
  31.             Ar = Split(Chaine, Separateur)
  32.             For i = LBound(Ar) To UBound(Ar)
  33.                 Ar(i) = Replace(Ar(i), "M-", "" )
  34.                 Cells(iRow, iCol) = Ar(i)
  35.                 iCol = iCol + 1
  36.             Next
  37.            
  38.             Select Case Cells(iRow, 1)
  39.                 Case Is = Cells(iRow, 2): Cells(iRow, 3) = "OK"
  40.                 Case Else: Cells(iRow, 3) = "NOK"
  41.             End Select
  42.            
  43.             iRow = iRow + 1
  44.         Loop
  45.     Close #NumFichier
  46.    
  47.     Application.ScreenUpdating = True
  48. End Function


Maintenant j'ai besoin de mettre en vert et gras le OK et rouge et gras le NOK, j'ai bien trouvé des truk a peu prés bon mais j'ai pas reussi a les adapter.
Et j'aimerais que la liste s'arrete au bout de 30 lignes traité puis reprénne sur une seconde feuille a cause d'une mise en page autour de mes données traité.
Pour la mise en page je pense y arrivé tout seul  :whistle: .
 
Merci a ceux qui pourront m'aider!

mood
Publicité
Posté le 18-06-2007 à 16:06:08  profilanswer
 

n°1576345
jpcheck
Pioupiou
Posté le 18-06-2007 à 16:12:45  profilanswer
 

Case Is = Cells(iRow, 2): Cells(iRow, 3).value = "OK"
Cells(iRow, 3).Interior.ColorIndex = 4
Cells(iRow, 3).Font.Bold = True
 
Case Else: Cells(iRow, 3) = "NOK"
Cells(iRow, 3).Interior.ColorIndex = 3
Cells(iRow, 3).Font.Bold = True
end select

n°1576351
barca-powa
Posté le 18-06-2007 à 16:20:31  profilanswer
 

Super quelle rapidité! Par contre c'est possible de colorer la police au lieu de la case?
 
EDIT: Biensur en mettant Font a la place de Interior...


Message édité par barca-powa le 18-06-2007 à 16:21:18
n°1576608
barca-powa
Posté le 19-06-2007 à 08:49:09  profilanswer
 

Sinon pour que la liste s'arrete au bout de 30 lignes traiter (soit la 40e environ) et reprenne sur une seconde feuille A4 et ainsi de suite une idée?

n°1576646
tegu
Posté le 19-06-2007 à 10:21:03  profilanswer
 

Je constate que ton traitement semble s'appliquer à la feuille de calcul active.
D'autre part, dans ta boucle « Do While » tu as une variable iRow qui compte les lignes.
Il suffit de créer une nouvelle feuille quand iRow atteint le seuil adéquat (vu qu'elle commence à 10, faut tester autour de 40) et rendre cette feuille active.
La boucle se poursuivra sur la nouvelle feuille.
En gros.

n°1578664
barca-powa
Posté le 25-06-2007 à 08:53:36  profilanswer
 

Ok je vois ce que tu veux dire.  
Pour l'instant je suis sur la validité du document si tout est OK ou NOK.
En gros je souhaite faire ca:

Code :
  1. If « entre C10 et C40 tout est OK » then
  2. « mettre un fond vert de E23 à F28 »
  3. else
  4. « mettre un fond rouge de E23 à F28 »
  5. endif


D'aprés ce que j'ai trouvé, la forme est bonne mais je vois pas quoi mettre dans les conditions  :( .
Une idée?

n°1579823
barca-powa
Posté le 27-06-2007 à 11:33:27  profilanswer
 

Bon j'ai décidé de faire des enregistrements de macro avec des mise en forme conditionnel.
Mais je but sur la mise en page.
 
Donc j'ouvre un fichier.csv qui contient un nombre indeterminé de ligne de donnée. J'ai besoin que sur une feuille format A4 il y est 31 lignes (de 10 à 40) pour mettre l'entête de l'entreprise et des informations autour.
Donc j'aimerais un code qui sorte 31 lignes sur chaque format A4 et qu'il repete le reste de mon code.
En gros un code qui duplique ma mise en page et qui prend 31ligne par 31.
 
Merci de votre aide!

n°1579824
chacal gp
Posté le 27-06-2007 à 11:33:46  profilanswer
 

bjr,
vous qui maitrisez excel allez peut etre pouvoir m'aider :
quel est la routine pour définir une boucle avec un pas sous excel ?
for i = 1 to 10 + pas ?
dsl pour le hs.

Message cité 1 fois
Message édité par chacal gp le 27-06-2007 à 11:34:14
n°1579829
barca-powa
Posté le 27-06-2007 à 11:39:54  profilanswer
 

Qui moi? Non je métrise pas.
Mais par contre je vais chercher dans ce sens cette formule m'a l'air pas mal!

n°1580096
kiki29
Posté le 27-06-2007 à 18:27:51  profilanswer
 

Voila pour le tronçonnage du fichier,à toi pour le reste


Private Sub LireVerifier(ByVal NomFichier As String)
Dim Chaine As String
Dim Ar() As String
Dim i As Long
Dim iRow As Long, iCol As Long
Dim NumFichier As Integer
Dim Separateur  As String * 1
Const Pas As Integer = 9
 
    Separateur = ";"
    Cells.Clear
    Application.ScreenUpdating = False
    NumFichier = FreeFile
     
    iRow = Pas
     
    Open NomFichier For Input As #NumFichier
       Do While Not EOF(NumFichier)
            iCol = 1
            iRow = iRow + 1
            Line Input #NumFichier, Chaine
            Ar = Split(Chaine, Separateur)
            For i = LBound(Ar) To UBound(Ar)
                Ar(i) = Replace(Ar(i), "M-", "" )
                Cells(iRow, iCol) = Ar(i)
                iCol = iCol + 1
            Next
             
            Select Case Cells(iRow, 1)
                Case Is = Cells(iRow, 2):
                    Cells(iRow, 3) = "OK"
                    Cells(iRow, 3).Font.Bold = True
                    Cells(iRow, 3).Font.ColorIndex = 4
                Case Else:
                    Cells(iRow, 3) = "NOK"
                    Cells(iRow, 3).Font.Bold = True
                    Cells(iRow, 3).Font.ColorIndex = 3
            End Select
             
            If iRow Mod 40 = 0 Then iRow = iRow + Pas
        Loop
    Close #NumFichier
     
    Application.ScreenUpdating = True
End Sub

mood
Publicité
Posté le 27-06-2007 à 18:27:51  profilanswer
 

n°1580106
barca-powa
Posté le 27-06-2007 à 19:15:30  profilanswer
 

MERCI. Vraiment merci beaucoup! Je test ca demain mais j'ai compris le principe avec le pas.

n°1580196
Paul Hood
Posté le 28-06-2007 à 08:25:53  profilanswer
 

chacal gp a écrit :

bjr,
vous qui maitrisez excel allez peut etre pouvoir m'aider :
quel est la routine pour définir une boucle avec un pas sous excel ?
for i = 1 to 10 + pas ?
dsl pour le hs.


Tu peux faire
For i=1 to 10
  blablabla...
  i=i+1
next
 
Tu pars de 1(suivant ou est ton blablabla) et puis de 2 en 2. (1-3-5-7-9) à adapter en fonction de ton pas
 
Tu peux aussi utiliser : Do while
i=1
Do while i<10
 blablabla...
i=i+2
loop

n°1580281
barca-powa
Posté le 28-06-2007 à 11:34:00  profilanswer
 

Bon pour le "tronçonnage" du fichier ca fonctionne.
J'ai essayé de bidouillet pour que le coupage ce face de tel maniére que le découpage ce facepour que les ligne traité ce trouve toujours au milieu d'une page A4 mais sans y parvenir...
 
Je cherche a obtenir 10 ligne vide avant et 7 aprés sur le modéle A4.
J'ai pensé mettre un +7 sur une ligne

If iRow Mod 45 = 0 Then iRow = iRow + pas + 7


J'ai obtenu ce que je veux mais maintenant il faut que les données traité de s'arrete pas a 45*2 (à la ligne 90) et mette les 17 ligne vide car 90+17=107 et comme la 3e feuille commence a 105 là je n'est plus mes 10 ligne de vide et sur la 2e feuille je n'est plus mes 7 ligne de vide a la fin mais j'en est 14...
 
Je pense que vous voyez ce que je veux dire. J'ai essayé de triché mais au bout d'un moment le decalage devient trop grand et empiete sur mon en-tête...
 
Un as du VBA pour m'aider?  :bounce:

n°1580361
kiki29
Posté le 28-06-2007 à 14:16:44  profilanswer
 

A adapter
Sur la base de mon code de départ + macro recorder + adaptation manuelle du code ( imprimante par défaut : Adobe PDF )


Sub Mep()
Dim LastRow As Long
Dim i As Long
Dim NbPages As Long
Dim iRowDep As Long, iRowFin As Long
Dim Debut As Variant
 
    LastRow = Range("A65536" ).End(xlUp).Row
    NbPages = Application.WorksheetFunction.RoundUp(LastRow / 40, 0)
    Debut = Time
    iRowDep = 1
    iRowFin = 40
    Application.ScreenUpdating = False
    For i = 1 To NbPages
        Range("A" & iRowDep & ":C" & iRowFin).Select
        ActiveSheet.PageSetup.PrintArea = "$A$" & iRowDep & ":$C$" & iRowFin
        With ActiveSheet.PageSetup
            .LeftHeader = ""
            .CenterHeader = ""
            .RightHeader = ""
            .LeftFooter = ""
            .CenterFooter = ""
            .RightFooter = ""
            .LeftMargin = Application.InchesToPoints(0.393700787401575)
            .RightMargin = Application.InchesToPoints(0.393700787401575)
            .TopMargin = Application.InchesToPoints(0.393700787401575)
            .BottomMargin = Application.InchesToPoints(0.393700787401575)
            .HeaderMargin = 0
            .FooterMargin = 0
            .PrintHeadings = False
            .PrintGridlines = False
            .PrintComments = xlPrintNoComments
            .PrintQuality = 1200
            .CenterHorizontally = True
            .CenterVertically = True
            .Orientation = xlPortrait
            .Draft = False
            .PaperSize = xlPaperA4
            .FirstPageNumber = xlAutomatic
            .Order = xlDownThenOver
            .BlackAndWhite = False
            .Zoom = False
            .FitToPagesWide = 1
            .FitToPagesTall = 1
            .PrintErrors = xlPrintErrorsDisplayed
        End With
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
        Application.StatusBar = i & " / " & NbPages
        iRowDep = iRowFin + 1
        iRowFin = iRowFin + 40
    Next i
    Application.ScreenUpdating = True
    Application.StatusBar = "Terminé : " & Format((Time() - Debut) * 100000, "0.00" )
End Sub


Message édité par kiki29 le 28-06-2007 à 14:29:29
n°1581767
barca-powa
Posté le 03-07-2007 à 09:27:58  profilanswer
 

Bonjour!
Désolé de ne pas avoir répondu plutôt.
Déjà merci pour ce code qui fonctionne parfaitement, juste:
 

'.PrintQuality = 1200
'.PrintErrors = xlPrintErrorsDisplayed


Que j'ai du retirer.
 
J'ai réussi pour la présentation. Le seule truck qui me reste à faire c'est un carré de couleur sur chaque page qui sert a facilité le contrôle. Si les 40 valeurs sont OK le carré doit être vert ou si il y a un NOK il doit être rouge.
Ca je sais le faire mais pour qu'il le répete toute les 40 ligne je pige pas. J'ai essayé avec des enregistrement de macro en faisant un NB.SI sur les 40 lignes puis une mise en forme conditionel en fonction du résultat du NB.SI mais déjà c'est trés lourd et en plus avec ce systeme je ne peut pas contrôler en fonction du nombre reel qu'il y aura de ligne.  
Quelqu'un  peut m'aider? Je sais ca fait beaucoup d'aide mais j'y connais presque rien.  :whistle:

n°1581815
kiki29
Posté le 03-07-2007 à 11:43:26  profilanswer
 

Tu as déjà une bonne partie de la réponse dans la routine de Mise en Page, il suffit d'en reprendre la boucle principale et d'y incorporer qqch comme


        .........
        For j = iRowDep To iRowFin
            If Cells(j, 3) = "OK" Then Cpt = Cpt + 1
        Next j
        If Cpt >= NbOk Then
            Range("A" & iRowDep & ":C" & iRowFin).Interior.ColorIndex = 35
        Else
            Range("A" & iRowDep & ":C" & iRowFin).Interior.ColorIndex = 40
        End If
        Cpt = 0
        ...........

n°1581965
barca-powa
Posté le 03-07-2007 à 15:56:18  profilanswer
 

Bon alors big merci a kiki!!  :D  :D  
 
Par contre avec ce code il m'imprime qu'une seule page  :heink:  

Sub Mep()
Dim LastRow As Long
Dim i As Long
Dim NbPages As Long
Dim iRowDep As Long, iRowFin As Long
Dim Debut As Variant
 
    LastRow = Range("A65536" ).End(xlUp).Row
    NbPages = Application.WorksheetFunction.RoundUp(LastRow / 40, 0)
    Debut = Time
    iRowDep = 1
    iRowFin = 40
    Application.ScreenUpdating = False
    For i = 1 To NbPages
        Range("A" & iRowDep & ":G" & iRowFin).Select
        ActiveSheet.PageSetup.PrintArea = "$A$" & iRowDep & ":$G$" & iRowFin
        With ActiveSheet.PageSetup
            .LeftHeader = ""  
            .CenterHeader = ""
            .RightHeader = _
            ""  
            .LeftFooter = ""
            .CenterFooter = ""
            .RightFooter = ""
            .LeftMargin = Application.InchesToPoints(0.393700787401575)
            .RightMargin = Application.InchesToPoints(0.393700787401575)
            .TopMargin = Application.InchesToPoints(0.393700787401575)
            .BottomMargin = Application.InchesToPoints(0.393700787401575)
            .HeaderMargin = 0
            .FooterMargin = 0
            .PrintHeadings = False
            .PrintGridlines = False
            .PrintComments = xlPrintNoComments
            '.PrintQuality = 1200
            .CenterHorizontally = True
            .CenterVertically = True
            .Orientation = xlPortrait
            .Draft = False
            .PaperSize = xlPaperA4
            .FirstPageNumber = xlAutomatic
            .Order = xlDownThenOver
            .BlackAndWhite = False
            .Zoom = False
            .FitToPagesWide = 1
            .FitToPagesTall = 1
            '.PrintErrors = xlPrintErrorsDisplayed
        End With
 
    Next i
        For j = iRowDep To iRowFin
            If Cells(j, 3) = "OK" Then Cpt = Cpt + 1
        Next j
        If Cpt = 40 Then
            Range("E" & iRowDep + 17 & ":E" & iRowFin - 17).Interior.ColorIndex = 10
        Else
            Range("E" & iRowDep + 17 & ":E" & iRowFin - 17).Interior.ColorIndex = 3
        End If
        Cpt = 0
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
        Application.StatusBar = i & " / " & NbPages
        iRowDep = iRowFin + 1
        iRowFin = iRowFin + 40
    Application.ScreenUpdating = True
    Application.StatusBar = "Terminé : " & Format((Time() - Debut) * 100000, "0.00" )
End Sub


 
J'ai pas tout compris...

n°1581989
kiki29
Posté le 03-07-2007 à 16:25:39  profilanswer
 

N'importe quoi, tu ne comprends rien , je t'ai dit de reprendre la boucle principale pas l'ensemble du code

n°1582000
kiki29
Posté le 03-07-2007 à 16:31:21  profilanswer
 


Sub DecompteOK()
Dim LastRow As Long
Dim i As Long, j As Long
Dim NbPages As Long
Dim iRowDep As Long, iRowFin As Long
Dim Cpt As Long
Const NbOk As Integer = 31
 
    LastRow = Range("A65536" ).End(xlUp).Row
    NbPages = Application.WorksheetFunction.RoundUp(LastRow / 40, 0)
    iRowDep = 1
    iRowFin = 40
    Cpt = 0
    Application.ScreenUpdating = False
    For i = 1 To NbPages
        For j = iRowDep To iRowFin
            If Cells(j, 3) = "OK" Then Cpt = Cpt + 1
        Next j
        If Cpt >= NbOk Then
            Range("A" & iRowDep & ":C" & iRowFin).Interior.ColorIndex = 35
        Else
            Range("A" & iRowDep & ":C" & iRowFin).Interior.ColorIndex = 40
        End If
        Cpt = 0
        iRowDep = iRowFin + 1
        iRowFin = iRowFin + 40
    Next i
    Application.ScreenUpdating = True
    Application.StatusBar = "Terminé"
End Sub

n°1582015
barca-powa
Posté le 03-07-2007 à 16:41:01  profilanswer
 

Merci de ta patience.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Macro de "mise en forme"

 

Sujets relatifs
Mise en page pour base de données de fichiersprobleme de mise en page d'un formulaire
Urgent - Please Macro Help me !!!!!Macro Excel : enregistrer feuille en PDF et envoi pièce jointe
Ecrire un entier sous la forme d'un doublecréation macro pour envoie fichier excel par mail
aide pour cration d'un macro svp!!!!![WORD, ACCESS]Lié des requêtes SQL à l'aide d'une macro sous word
[Résolu] Créer macro importé un .csv dans excelMise en forme avec macro sous excel (Résolu)
Plus de sujets relatifs à : Macro de "mise en forme"


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR