2010-07-13 8 views
2

Je travaille donc sur un outil de reporting dans Access. Il interroge les tables locales et crée un document Excel (via VBA) et crée un fichier Excel.alternance de couleurs/numéros de lignes dans Excel - VBA

J'utilise le code suivant à un code couleur alternatif et il fonctionne à merveille

For a = 1 To rs.RecordCount 
    With ExcelSheet   
     .Cells(a + 1, 1) = a 
     .Cells(a + 1, 1).EntireRow.Interior.ColorIndex = IIf((a + 1) Mod 2 = 0, 2, 15) 
    End With 
Next 

note que je dois faire a + 1 parce que a = 1 est la ligne de titre, et qui est la ligne de titre.

Note: .Cells(a + 1, 1) = 1 nombre des rangées (1, 2, 3, ...)

Note: IIf((a + 1) Mod 2 = 0, 2, 15) Le 2 et 15 sont des codes de couleur. Maintenant, ma question est que quand quelqu'un obtient le rapport Excel, il peut supprimer une ligne, ou faire une opération de tri ou autre chose et quand il le fait, cela gâche les lignes.

ex:

1 white row 
2 grey row 
3 white row 
4 grey row 

si je sorte les je reçois

3 white row 
1 white row 
2 grey row 
4 grey row 

qui est pas ce que je veux, je veux garder le formatage et la numérotation Toute personne d'y arriver en utilisant VBA en accès?

Tech: Office 2007

Répondre

3

Ceci peut être accompli avec la fonction ROW() et une mise en forme conditionnelle. La fonction ROW() renvoie la ligne courante de la cellule dans laquelle elle se trouve, de sorte qu'elle change chaque fois que des cellules sont supprimées, déplacées ou triées. La mise en forme conditionnelle est réappliquée chaque fois que ses conditions changent. Par conséquent, le déplacement ou le tri des lignes informerait Excel pour mettre à jour les couleurs en conséquence. Le code ressemblerait comme suit:

Dim a As Integer 
Dim oneRow As Range 

For a = 1 To rs.RecordCount 
    With ExcelSheet 

     ''// show the row number in the first cell 
     .Cells(a + 1, 1).Formula = "=ROW()" 

     ''// set formatting to alternate row colors 
     Set oneRow = .Cells(a + 1, 1).EntireRow 
     oneRow.FormatConditions.Delete 
     oneRow.FormatConditions.Add Type:=xlExpression, Formula1:= _ 
      "=MOD(ROW()-1, 2)=0" 
     oneRow.FormatConditions(1).Interior.ColorIndex = 2 
     oneRow.FormatConditions.Add Type:=xlExpression, Formula1:= _ 
      "=MOD(ROW()-1,2)=1" 
     oneRow.FormatConditions(2).Interior.ColorIndex = 15 

    End With 
Next a 
+0

Comment puis-je entrer manuellement le numéro de ligne? Qu'en est-il de la colonne des numéros? Je ne veux pas 1, 2, 3 à 2, 3, 1 quand les rangées sont triées. – masfenix

+0

@edit, cela a été fait pour quelqu'un d'autre qui a commenté, mais supprimé il commentaire. Je vais partir ici pour référence. Je pense que je me suis peut-être trompé. Ce code est en Access, je crée le document, tout le formatage, les données sont effectuées via VBA sur Access. Ensuite, je viens d'appeler ExcelObject.save pour enregistrer le fichier. Si je les numérote à partir de l'Access DBA, c'est bien, mais un utilisateur peut ouvrir la feuille Excel et re-commander les lignes.Puisqu'il n'y a pas de macro dans Excel, il va gâcher la numérotation des lignes – masfenix

+0

Les utilisateurs ne sont pas très excités. Ils veulent juste trier et imprimer. Aucun d'entre eux ne connaît une seule ligne de code. – masfenix

1

@ e.James

Dim rowRange As Range 


ExcelSheet.Cells(1, 1).EntireColumn.ColumnWidth = 4 
ExcelSheet.Cells(1, 1) = "#" 
Set rowRange = Range("2:2", rs.RecordCount & ":" & rs.RecordCount) 
rowRange.Select 
With ExcelApp.Selection 
    .FormatConditions.Delete 
    .FormatConditions.Add xlExpression, Formula1:="=MOD(ROW(),2)" 
    .FormatConditions(1).Interior.ColorIndex = 15 
End With 

Ce travail dosnt. Il met juste en évidence la ligne supérieure (la ligne du titre) grise.

EDIT NEVERMIND Son supposé être

Set rowRange = ExcelSheet.Range("2:2", rs.RecordCount & ":" & rs.RecordCount) 

EDIT NUMÉRO 2: Savez-vous comment je peux insérer les numéros de ligne dans chaque ligne en utilisant cette méthode?

RÉPONSE:

ExcelSheet.Cells(1, 1).EntireColumn.ColumnWidth = 4 
Set RowRange = Range("2:2", rs.RecordCount & ":" & rs.RecordCount) 
RowRange.Columns(1).Formula = "=ROW()-1" 
With RowRange 
    .FormatConditions.Delete 
    .FormatConditions.Add xlExpression, Formula1:="=MOD(ROW(),2)" 
    .FormatConditions(1).Interior.ColorIndex = 15 
End With 
+0

répondu en ligne –

+0

oh mon dieu, c'était si facile mdr. Peut-être que c'est la fin de la journée de travail et que je manque juste ma caféine. – masfenix

+0

Il a également réduit mon temps de 25 secondes secondes à 10 - 13 secondes en enlevant 3 boucles – masfenix