EXCEL

Un bouton de barre d'outils pour faciliter la navigation entre les feuilles d'un classeur

RECOVER un utilitaire Microsoft pour réparer les fichiers excel endommagés (macro complémentaire)

Password Excel
Quoi de plus désagréable que de ne pouvoir modifier une feuille de calcul ou un classeur Excel parce qu'on ne se rappelle plus du mot de passe de protection que l'on avait pourtant inventé quelques jours auparavant !
Imaginez par ailleurs que vous devez accéder, dans l'urgence, au travail d'un collègue de bureau qui est parti en vacances, en retraite ou chez la concurrence !
Il existe plusieurs sortes de mot de passe sous Excel. Le mot de passe d'ouverture d'un fichier Excel, le mot de passe d'une feuille de calcul, d'un classeur ou d'une macro (VBA). Avec l'utilitaire Password Excel vous supprimerez très facilement les mots de passe de classeurs et de feuilles de calcul, mais pas ceux qui ont été définis pour protéger un fichier "VBAProject Mot de passe".
Password Excel
Ce logiciel peut être utilisé sur les versions Excel 97 et 2000 et ne pèse que 218 Ko. Alors n'hésitez pas à le stocker chez vous et à le garder précieusement. Vous serez certainement très heureux de le tester le jour où vous en aurez besoin !

PolyKromy
Ce site propose des trucs et astuces animés sur Excel, de nombreux cours avancés, une newsletter bi-hebdomadaire et des applications en VBA.

Excel-downloads www.excel-downloads.com
Voici près d'une centaine de programmes pour Excel à télécharger pour diverses utilisations: gestion, jeu, programmation, business...

Macro auto sous Excel 97
Il faut modifier le code de l'ouverture du classeur ( Worksheet_Open ) et y mettre l'appel à notre macro ou codifier les actions de la macro dedans.
Pour ce faire, clic droit sur le label de la feuille 1 ( Feuil1 par défaut ), Option "Visualiser le code", puis double clic sur ThisWorkbook à gauche puis sélectionner "Workbook" dans la fenêtre de
visualisation du code située à droite.
Et voilà, il n'y a plus qu'à coder ce que l'on veut et enregistrer le document Excel.

Créer une liste déroulante
1) Il faut créer la liste dans ta feuille excel
2) Sélectionner la cellule ou on veut qu'apparaisse la liste déroulante.
3) Aller dans Données, puis dans validation, dans l'onglet option à
autoriser à la place de Tout choisir Liste, puis dans source sélectionner la zone de liste et faire OK.
(La liste et la cellule déroulante doivent se trouver dans la même
feuille, c'est pourquoi il est important pour la présentation de mettre la liste dans un endroit isolé.

dans diverses questions ou réponses, il est souvent fait allusion au fichier perso.xls. Qui pourrait me renseigner sur ce fichier ?
c'est un fichier qui permet de créer des macros qui sont actives à chaque lancement d'excel

Macro pour mettre en surbrillance les doublons:
Private Sub Worksheet_Change(ByVal Target As Range)
'désactive l'affichage
Application.ScreenUpdating = False
If Target.Column = 1 Then 'colonne A
Target.CurrentRegion.Select
For Each c In Selection
If c = Target And c.Address <> Target.Address Then
c.Interior.ColorIndex = 6
' colorie en jaune la précédente valeur identique
End If
Next c
End If
Target.Select
'réactive l'affichage
Application.ScreenUpdating = True
End Sub


Afficher une boite de dialogue Rechercher
Application.Dialogs(xlDialogFormulaFind).Show

J'ai un problème lorsque j'ouvre excel, il essaie d'ouvrir un fichier xxx.xla qui n'existe plus. Je voudrais enlever cette liaison avec cette macro d'ouverture, mais je ne sais pas où aller.
regarde au menu, Outils, Macro complémentaire, décoche le xla en question.

Dénombrer des cellules non vides
NBVAL compte aussi bien les vraies vides que les "fausses" cellules vides,
résultat d'une formule du style =Si(blabla;"";blabla)
Pour dénombrer en excluant les vraies/fausses vides :
=SOMMEPROD((A4:A6<>"")*1)
Une autre peut être
ND(A:A)-1 ' Pour toute une colonne
ND(A5:A15) ' Pour une partie

Compter le nombre de lignes utilisées (non vides)
Worksheets("tutu").Usedrange.Columns("D:D").select
Selection.rows.count

c'est possible de le faire sans sélectionner la colonne
NbrNonVide = Application.CountA(Columns("D"))
Sur la première ligne de la colonne testée
ND(D:D)-1
Ou sur une ligne quelconque d'une autre colonne
ND(D:D)

Obtenir la somme des 7 plus grandes valeurs sur une colonne
=SOMME(GRANDE.VALEUR(A1:A12;{1;2;3;4;5;6;7}))
Ou la formule suivante (non-matricielle):
=SOMMEPROD(GRANDE.VALEUR(A1:A12;{1;2;3;4;5;6;7}))

Coder une plage de cellules paramétrable
Range(Cells(valCol1, varLigne1),cells(varCol2,varLigne2)).value

Remplir un combobox avec 2 colonnes à partir d'un fichier texte
Private Sub UserForm_Activate()
Dim Code1,code2
Open "C:\Excel\Tarif\clients.txt" For Input As #1
Do While Not EOF(1)
Input #1, Code
With ComboBox1
Code1 = left(Code, instr(code, ","))
Code2 = Mid(Code, instr(code, ","+1))
.AddItem Code1
End With
Loop
Close #1
End Sub


Programmation VBA pour excel

Créer une page web avec la feuille active
Attribute VB_Name = "CreerPageWeb"
Sub PublishObjectExample()
Dim oPO As PublishObject

'Set a reference to the Publish object
Set oPO = ActiveWorkbook.PublishObjects.Add(xlSourceSheet, _
"C:\My Documents\LABRCR\ExcelData\Page.htm", "District A", "", xlHtmlCalc)
'Publish it (Save it as HTML)
oPO.Publish True
'Display the unique identifier number
'This will be different each time this code is run.
MsgBox oPO.DivID
End Sub

Afficher un popup
Attribute VB_Name = "MsgPopup"
Sub MessagePopUp()
Set oSH = CreateObject("WScript.Shell")
Const nSecToWait = 3
Const typButtonless = 7 '&HB ' undoc constant
Dim sMsg
sMsg = vbLf & "Ce message SANS BOUTON" & vbCrLf & vbCrLf _
& "va se fermer dans : " & CStr(nSecToWait) & " secs... "

' display popup with NO button (only on Win9X/ME)...
oSH.Popup sMsg, nSecToWait, "Popup Sans Bouton", typButtonless
End Sub

Un petit simulateur de vol dans Excel 97
1. Lancez Excel 97.
2. Appuyez sur F5.
3. Dans la zone référence, mettez X97:L97, cliquez sur OK.
4. Appuyez sur la touche "Tabulation", normalement, on se retrouve en M97.
5. Gardez appuyées les touches "CTRL" et "SHIFT" puis cliquez sur l'icône assistant graphes (c'est une icône avec un graphique en barres).
Le petit simulateur fonctionne avec la souris et les boutons gauche/droite pour marche avant/arrière.

Un site avec plein d'infos sur le VBA

Cours de formation excel

http://xlbysteph.free.fr/aideinformatique/actionvba
http://cherbe.free.fr/xl_debutant1999.htm
http://intendant.free.fr/vba.htm
http://jacxl.free.fr/cours_xl/cadres.html
http://www.polykromy.com/html/astuces.html

Selectionner la dernière cellule en bas a droite du tableau:
Range("a1").End(xlDown).End(xlToRight).Select
ou
Cells(Cells.Count).Select

Comment empecher de saisir dans des cellules tant qu'une cellule principale n'est pas renseignée?
A copier dans le module de la feuille concernée
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not IsNull(Intersect(Range("e17:e32"), Target)) Then _
If Range("a1") = "" Then Range("a1").Select
End Sub

Comment supprimer des liaisons obsolètes?
Edition / Liaisons / Modifier la source et dans la liste qui apparaît,
choisir le classeur dans lequel on veut supprimer la liaison.

Pour imprimer une feuille masquée
Sub Impression_masquée()
Application.ScreenUpdating = False
Sheets("Facture").Visible = True

' -------------------------------------------
'actions sur la feuille

' ------------------------------------------
' ATTENTION : pour masquer une feuille il faut que
' le classeur en comporte au moins 2
Sheets("Facture").Visible = False
Sheets("Feuill_base").Select
Application.ScreenUpdating = True
End Sub

Je cherche une fonction qui m'informerait si les caractères dans une
autre cellule sont en GRAS

Function isgras(cellule) As Boolean
Application.Volatile True
isgras = cellule.Font.Bold
End Function

ou
Function GRAS(Adresse As Range) As Boolean
GRAS = Adresse.Font.Bold
End Function

ou
Function FormatGras(MaPlage As Range)
Application.Volatile
If MaPlage.Font.Bold = True Then
FormatGras = True
else
FormatGras = False
End If
End Function

progressbar
Public I_progression
sub lirefichier()
S_FichierLire = "chemin:\le nom de ton fichier"
I_NoFichier = FreeFile()
Open S_FichierLire For Input As #I_NoFichier
Taillefichier= LOF(I_NoFichier) 'Lit la taille du fichier
TailleLue=0
Do While Not EOF(I_NoFichier)
' La boucle est effectuée jusqu'à la fin du fichier.
Input #I_NoFichier, S_Donnéeslues
' Place les données lues dans la variable.
TailleLue=taillelue+len(S_Donnéeslues)
I_Progression = TailleLue/ TailleFichier
' ici tu obtiens un pourcentage
Application statusbar="déja "& format(I_progression,"0%")
Call LaRoutineProgressBar (i_progression)
'à toi de l'adapter à la variable du ProgressBar

' Là tu met tu met ton code de traitement de tes
données
'--------
'--------
Loop
End Sub

supprimer des lignes
Sub suplignes()
'désactiver l'affichage
Application.ScreenUpdating = False
Application.Goto Reference:="R1C1"
For a = 600 To 1 Step -1
If Cells(a, 1).Value = False Then
Cells(a, 1).EntireRow.Delete
End If
Next a
'réactiver l'affichage
Application.ScreenUpdating = True
End Sub

pour masquer une feuille
Menu -> Format -> Feuille -> Masquer
En revanche il en faut au moins une visible.

Sur une feuille Excel de la cellule A4 à A420 j'ai une série de code.
J'aimerai qu'en tapant un code dans la cellule A1 par exemple, la ligne
correspondante soit trouvée, et que mon curseur de saisie se positionne sur
cette ligne dans la colonne F.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("a1").Address Then
Cells.Find(What:=Range("a1").Value, After:=ActiveCell,
LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:=False) _
.Activate
End If
End Sub
autre
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cellule As Range
If Target.Address = "$A$1" Then
For Each Cellule In Range("A4:A420")
If Target = Cellule Then
Cells(Cellule.Row, 6).Select
End
End If
Next Cellule
End If
End Sub

savoir la ligne du dernier enregistrement (de la colonne A par exemple)...
Pour le moment je me débrouille avec une macro du style :

With Sheets("Listing CES brut").Range("A1:A5000")
Set c = .Find("", LookIn:=xlFormulas)
If Not c Is Nothing Then
firstaddress = c.Address
ligne = Right(firstaddress, Len(firstaddress) - 3)
End If
End With

réponse:
ligne = range("a65536").end(xlup).row

Pour trouver la dernière cellule tu peux utiliser le code suivant
v_derniereligne=Columns("A:A").Find("*", , , , , xlPrevious).Row

Cette formule va te renvoyer le numéro de la dernière ligne de la colonne A
Sub Roxane_modif()
For Each cell In ActiveSheet.UsedRange
If Not IsEmpty(cell) Then
cell.Select

'On explore chaque caractère un par un
For i = 1 To Len(cell.Value)
'On garde une trace de l'ancienne couleur de caractère
a = cell.Characters(i, 1).Font.Color
'On colorie en rouge le caractère courant...pour ne pas se perdre...
cell.Characters(i, 1).Font.Color = 255
MsgBox cell.Characters(i, 1).Font.Name
cell.Characters(i, 1).Font.Color = a
Next i
End If
Next
MsgBox "Y'en à plus..."
End Sub

ou
Tu as la fonction de feuille (a adapter) :
LIGNES(A1:C4) égale 4
et la fonction VBA :
Selection.Rows.Count ' ( Exemple)

J'ai une formule trop longue pour l'écrire dans la barre de formule, comment faire?
Tu ne peux pas passer outre la limite de caractères pour une formule.
Le contournement est de décomposer ta formule en utilisant la fonction
Indirect par exemple.
Exemple :
1/placer en A1 un texte correcpondant à une référence longue
2/remplacer dans la formule, la référence longue par : Indirect(A1)

Une sub ou une function peuvent recevoir plusieurs arguments.
Private Sub CommandButton1_Click()
Call SubEssai("Test", " encore", " réussi")
'Si Call utilisé, arguments entre parenthèses
ou :
SubEssai "Test", " encore", " réussi" 'sans les parenthèses
End Sub
Sub SubEssai(arg1 As String, Arg2 As String, Arg3 As String)
MsgBox arg1 & Arg2 & Arg3
End Sub

La différence entre Sub et Function est que tu ne doit pas mettre le signe "="
quand tu appelle une Sub.

la recherche sur une sous-partie d'un texte d'une cellule
Tu peux l'utiliser avec la fonction RECHERCHEV de la manière suivante :
=RECHERCHEV("*"&D5&"*",F5:F8,1,0)
Avec en D5 ton nom à chercher et en F5:F8 ta liste.
Pour une recherche insensible à la casse, vaut mieux:
=NB.SI($C$2:$C$20;"*"&A2&"*")>0
Complément pour éviter qques désagréments
Exemple :
Dans la liste des noms MARTIN
Dans la liste des prénoms/noms : Robert MARTINEAU ou Marcel MARTINE
Les solutions précédentes vont renvoyer VRAI car la chaîne MARTIN est
trouvée !
Une solution pour contourner (mêmes plage que dans le 1° exemple) :
Formule du format conditionnel :
=NON(ET(ESTERREUR(TROUVE(A2&"$¤£";$C$2:$C$20&"$¤£"))))
il va falloir utiliser plusieurs fonctions :
hypothèse de base : texte est la cellule contenant prénom.nom
1 - fonction CHERCHE qui va te permettre de savoir où se
trouve le nom dans ta cellule prénom.nom
ex : le nom est séparé par un espace
= cherche ( " "; texte )
2 - fonction NBCAR qui va te permettre de savoir combien
de caractère possède la cellule nom.prénom
ex : = nbcar ( texte )
3 - fonction DROITE qui va te permettre d'extraire les
caractères situés sur la droite de la cellule nom.prénom
ex : =droite ( texte ; nbcar(texte)-cherche(" ";texte) )
Voila on connaît maintenant le nom de ta cellule prénom.nom
tu n'as plus qu'à comparer les deux.

Controle de saisie: limiter le nombre de caractères a 3
Donnée validation autoriser personnalisé
la formule est =et(esttexte(a1);nbcar(a1)<4)
Méthode simple:
Tu sélectionnes les cellules, puis menu Données/Validation/longueur du
texte; minimum 1; maximum 3

J'ai cree un userform dans lequel j'ai des textbox dont les valeurs (prix en
$) sont recherchees dans une matrice lies par des listebox.
Malheureusement lorsque les donnees se collent sur la feuille, Excel ne
reconnait pas les data comme des nombres. Je doit a chaque fois cliquer
l'option convertir en nombre pour ensuite pouvoir imposer le format $ ##.00.
J'ai essaye de changer mon format de textbox sans aucun resultats
convainquants...

la difficulté peut provenir :
A ) Séparateur décimal.
Quand tu tapes une données dans un textbox, comme le contenu de ce textbox est toujours du "TEXTE", ce dernier accepte le point ou la virgule comme séparateur décimal malgré "le vrai séparateur décimal" défini dans le panneau de configuration.
A )
Pour chacun de tes textbox de ton formulaire , tu peux ajouter ceci :
Cela t'assure de toujours avoir dans le textbox, le bon séparateur décimal.
------------------------
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 44 Or KeyAscii = 46 Then
KeyAscii = Asc(Application.International(xlDecimalSeparator))
End If
End Sub

Pour afficher un format particulier dans le textbox :
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNumeric(TextBox2) = True Then
Me.TextBox2 = Format(Me.TextBox2, "# ##0.00 $")
End If
End Sub

Pour transférer le contenu d'un textbox vers une cellule :
En prenant pour acquis que dans le textbox, on a le bon
séparteur décimal du système... sinon il faut faire la substitution
avant la petite procédure... sinon ça va planter !
With Worksheets("Feuil1")
.range("A1").Numberformat = "# ##0.00 $"
.range("A1") = cdbl(textbox2.value)
End with
Sinon on devra utiliser ce qui suit :
Dim A As String, B As String
A = Application.International(xlDecimalSeparator)
B = Me.TextBox2
B = Application.WorksheetFunction.Substitute(B, ".", A)
B = Application.WorksheetFunction.Substitute(B, ",", A)
With Worksheets("Feuil1")
.Range("A1").NumberFormat = "# ##0.00 $"
.Range("A1") = CDbl(B)
End With

Mettre la date de dernière modification
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Range("A1") = Now
End Sub

Créer un userform en plein écran
Application.DisplayFullScreen = True
Load UserForm1
x = Application.UsableWidth
y = Application.UsableHeight
UserForm1.Top = 0
UserForm1.Left = 0
UserForm1.Width = x
UserForm1.Height = y
UserForm1.Show
ou
Dans le module de ton UserForm, place en tête de ton module les déclarations
suivantes:

Private Declare Function FindWindowA Lib "User32" (ByVal lpClassName As
String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLongA Lib "User32" (ByVal hWnd As Long,
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLongA Lib "User32" (ByVal hWnd As Long,
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Ensuite la procédure évènementielle (n'oublie sutout pas d'inclure un bouton
pour fermer l'UserForm car dans ce cas, tu n'auras même plus la barre de
titre de l'UserForm !) :
Private Sub UserForm_Initialize()
Dim hWnd As Long, exLong As Long, zFactor As Integer
hWnd = FindWindowA(vbNullString, Me.Caption)
exLong = GetWindowLongA(hWnd, -16)
If exLong And &H880000 Then SetWindowLongA hWnd, -16, exLong And
&HFF77FFFF
zFactor = 100 * CInt(Application.Width / Me.Width)
If zFactor > 400 Then zFactor = 400
MsgBox zFactor
Me.Width = Application.Width
Me.Height = Application.Height
Me.Zoom = zFactor
End Sub

Mettre un lien hypertexte
Sub Macro4()
ActiveWorkbook.FollowHyperlink Address:="http://intendant.free.fr/liens.htm"
End Sub

2 tableaux l'un L1C2:L11C1 contient nom et a droite un montant
l'autre L14C1:L17C1 nom a droite la somme des éléments de tableau1
correspondant au nom

Sub total()
For t = 0 To 3
For t1 = 0 To 10
If Cells(2 + t1, 1).Value = Cells(14 + t, 1).Value Then
Cells(14 + t, 2).Value = Cells(14 + t, 2).Value + Cells(2 + t1, 2).Value
End If
Next t1
Next t
End Sub

Méthode 2
Sub zzz()
[B14:B17] = "=SUMPRODUCT(($A$2:$A$11=A15)*$B$2:$B$11)"
[B14:B17] = [B14:B17].Value
End Sub

Voici des exemples de userform
http://disciplus.simplex.free.fr/xl/userforms.htm#demomisange
http://ericrenaud.free.fr/dlg.htm

inscrire la valeur d'un textbox dans une cellule
La valeur de ton textbox est inscrite dans la cellule à fur et à mesure.
Private Sub TextBox1_Change()
[B1].Value = TextBox1.Value
End Sub

Comment souver les feuilles d'un classeur en plusieurs classeurs d'une feuille?
Sub EclaterClasseur()
Dim Feuille As Worksheet
For Each Feuille In ThisWorkbook.Worksheets
Feuille.Copy
ActiveWorkbook.SaveAs Feuille.Name
ActiveWorkbook.Close
Next Feuille
End Sub

Les erreurs de type X

Nettoyer un classeur et redéfinir le used range

Pour accéder à l'environnement VBA
I
l faut appuyer sur les combinaison de touches Alt+F11

Calculer le numéro de la semaine pour une date donnée:
Public Function NoSem(UneDate As Date) As Integer
On Error Resume Next
NoSem = CInt(Format(UneDate, "ww", vbMonday, vbFirstFourDays))
End Function

Par formule , avec la date en A1:
'version français
="semaine: "&ENT((A1-(DATE(ANNEE(A1-JOURSEM(A1-1)+4);1;3)-
JOURSEM(DATE(ANNEE(A1-JOURSEM(A1-1)+4);1;3)))+5)/7)

'version anglais:
=INT((A1-(DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,3)-WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1
-1)+4),1,3)))+5)/7)
Par VBA:
Function ISOWeekNum(d1 As Date) As Integer
Dim d2 As Long
d2 = DateSerial(Year(d1 - WeekDay(d1 - 1) + 4), 1, 3)
ISOWeekNum = Int((d1 - d2 + WeekDay(d2) + 5) / 7)
End Function
Exemple: La date est saisie dans textbox1, on affiche la semaine dans label1 et la date complète dans label2
Private Sub textbox1_change()
Dim unedate As Date
On Error Resume Next
unedate = TextBox1.Text
If TextBox1.TextLength = 8 Then
Label2.Caption = unedate
NoSem = ISOWeekNum(unedate)
Label1.Caption = NoSem
End If
End Sub
Function ISOWeekNum(d1 As Date) As Integer
Dim d2 As Long
d2 = DateSerial(Year(d1 - Weekday(d1 - 1) + 4), 1, 3)
ISOWeekNum = Int((d1 - d2 + Weekday(d2) + 5) / 7)
End Function

Créer un combobox de couleurs à partir d'un tableau d'une feuille
Les listes sont définies dans le userform par leur nom entré à l'aide de insertion/nom/définir avec les formules suivantes dans la feuille feuil1
couleurs =DECALER(Feuil1!$A$2;;;NBVAL(Feuil1!$A:$A)-1;)
Dans le code du userform mettre
Private Sub UserForm_Initialize()
'vérifie que le classeur Démo est le classeur actif sinon l'initialisation échoue
Workbooks("Démo.xls").Activate
'remplit le Combobox
Combobox1.RowSource = "Feuil1!couleurs"
Combobox1.ListIndex = -1
End Sub

Lecture de répertoire de fichiers
Sub RecupNomFichier()
Dim Fichier As String
Dim Compteur As Integer
Dim Tableau() As String
Dim Chemin As String
On Error Resume Next
Chemin = Application.InputBox(Prompt _
:="Quel répertoire voulez-vous imprimer?")
Chemin = Chemin & "\*.*"
Range("B1") = Chemin
Compteur = 1
Fichier = Dir(Chemin)
Do While (Len(Fichier) > 0)
ReDim Preserve Tableau(1 To Compteur)
Tableau(Compteur) = Fichier
Compteur = Compteur + 1
Fichier = Dir()
Loop
ActiveSheet.Range("B2:B" & UBound(Tableau) + 1) _
= Application.WorksheetFunction.Transpose(Tableau)
End Sub
Sub ChercheFichier()
Dim Fs As FileSearch
Dim I As Integer
Set Fs = Application.FileSearch
With Fs
.LookIn = "C:"
.Filename = "*.pdf"
If .Execute > 0 Then
MsgBox .FoundFiles.Count & " Fichier(s) ont été trouvés."
For I = 1 To .FoundFiles.Count
ActiveSheet.Cells(I, 3) = .FoundFiles(I)
Next I
Else
MsgBox "Aucun fichier n'a été trouvé."
End If
End With
Set Fs = Nothing
End Sub

une macro comme celle ci-dessous qui élimine toutes les zones de texte
présentes sur une feuille.

Sub SupprimerZonesTexte()
For Each sh In ThisWorkbook.Sheets("Feuil1").Shapes
If sh.Type = 17 Then sh.Delete
Next sh
End Sub

Mettre un texte en gras
Sub MettreEnGras()
Dim Cellule As Range
For Each Cellule In Range("B1", Range("B65536").End(xlUp))
With Cellule
If .Offset(0, -1).Value <> "" Or _
.Offset(0, 1).Value <> "" Or _
.Offset(0, 2).Value <> "" Then
Cellule.Font.Bold = True
End If
End With
Next Cellule
Set Cellule = Nothing
End Sub


Plage de cellules dont on ne connait pas le nombre de lignes utilisées
Exemple: soit une plage B1:B10 qui pourrait a la prochaine execution B1:B30

Range("B1:B" & Sheets("Feuil1").Range("B65536").End(xlUp).Row)

Lecture d'un fichier texte
Sub OpenTXT(FileName$)
'ouvre un fichier texte (ou csv)
'Notez que: l'instruction 'magique' est TextToColumns.

'opentxt lit entièrement le fichier et le place dans un nouveau classeur.
'les données séparées par des ; sont mises en colones.
'le nouveau classeur porte le nom du fichier et l'onglet le nom sans .txt
Dim wb As Workbook
With Application
.DisplayAlerts = False
.ScreenUpdating = False
On Error GoTo GE
Set wb = .Workbooks.Open(FileName)
wb.Sheets(1).Columns(1).TextToColumns Range("A1"), , , False, , True
On Error GoTo 0
.DisplayAlerts = True
.ScreenUpdating = True
End With
Exit Sub
GE:
'Le fichier est introuvable
End Sub
Sub Test()
OpenTXT ("f:\excel\test.txt")
End Sub
On peut aussi utiliser
Workbooks.Open nomfichier, ReadOnly:=xlReadOnly, Format:=4

Comment peut-on exécuter automatiquement une macro au démarrage ou à
ouverture d'une feuille Excel ?

Si tu veux que ta macro s'exécute à l'ouverture de ton classeur, à mettre
dans le module "ThisWorkbook" :
Private Sub Workbook_Open()
Ici ton code...
End Sub
Si tu veux quelle s'exécute à l'activation d'une feuille, à mettre dans le
module de la feuille :
Private Sub Worksheet_Activate()
Ici ton code...
End Sub
Aussi tu peux créer une macro qui s'appelle AUTO OPEN

Afficher un label sur une courbe
Sub test()
e = 0
With ActiveChart.SeriesCollection(1)
.ApplyDataLabels ShowValue:=True
For i = 1 To .Points.Count
If (.Points(i).DataLabel.Text) * 1 > e Then
e = (.Points(i).DataLabel.Text) * 1
j = i
End If
Next
.DataLabels.Delete
.Points(j).ApplyDataLabels ShowValue:=True
End With
End Sub

pour concatener deux solutions :
CONCATENER ou &
=CONCATENER(C1;" ";G1)
= C1 & " " & G1

On ajoute " " ou & " " & pour obtenir un espace, sinon tes valeurs seront
collées

Trouver le 2e mot d'un texte en A1
=DROITE(A1;NBCAR(A1)-TROUVE(" ";A1))

Utiliser la fonction REDIM pour dimensionner dynamiquement ton tableau, voici
un petit exemple sur cette fonction :

Sub DimensionnerUnTableau()
Dim toto() As String
ReDim toto(5)
For a = 1 To 5
toto(a) = a
Next
For x = 1 To 5
msg = msg & "toto(" & x & ")" & "= " & toto(x) & vbCrLf
Next
MsgBox msg
ReDim Preserve toto(10)
For a = 6 To 10
toto(a) = a
Next
msg = ""
For x = 1 To 10
msg = msg & "toto(" & x & ")" & "= " & toto(x) & vbCrLf
Next
MsgBox msg
End Sub

Voici de bon exercisses sur les manipulations d'images
http://jacxl.free.fr/cours_xl/cours_xl_jac.html#images_api

Imprimer dans un fichier PDF
Pour convertir une feuille excel en fichier pdf, il faut avoir au préalable installé un driver qui ajoute une imprimante dédiée a cette tache.
Voir:
Sowedoo Easy PDF Converter
ou
win2pdf sur télécharger.com.
Essayez la macro suivante qui vous permet de choisir l'imprimante qui permettra de créer le PDF...
Sub Print_recap_messieurs()
Dim DefPrt ' ---- éventuellement déclarer la variable DefPrt en public
Dim rep
'----- memorisation imprimante active
DefPrt = Application.ActivePrinter
' rep = MsgBox(Application.ActivePrinter, vbInformation, "Avant")
' ------ dialogue pour changer l'imprimante
Application.Dialogs(xlDialogPrinterSetup).Show
' rep = MsgBox(Application.ActivePrinter, vbInformation, "A partir de Maintenant")
'______________
' ici la partie de code qui doit utiliser l'imprimante choisie
'--------------------------
Sheets("Feuilleàimprimer").Select
Msg = " La page est correcte, je peux imprimer ?"
Response = MsgBox(Msg, vbOKCancel)
If Response = vbCancel Then
GoTo sortie:
Else

' impression
With ActiveSheet
.PrintOut
.PageSetup.PrintArea = False
.DisplayPageBreaks = False

End With
sortie:

'----- reaffectation de l'imprimante d'origine
Application.ActivePrinter = DefPrt
' rep = MsgBox(Application.ActivePrinter, vbInformation, "Comme au
début")
End If
End Sub

Copier une plage de cellules
Sheets("Feuil1").Range("C6:C8").Value = _
Sheets("Feuil2").Range("A1:A3").Value

Comment mettre une image dans un commentaire
selectionner la cellule ou il y a le commentaire clic droit > modifier le commentaire
puis clic gauche sur la bordure du commentaires (sur la bordure, pas pour le
texte !! )
puis clic droit > format de commentaires choisir l'onglet "Couleurs et traits" et regarder dans Remplissage couleur, la, il y a "Motifs et texture" et enfin l'onglet IMAGE

Peut on écrire dans un classeur fermé?
Sub EcritDatas()
Dim Fich$, cell As Range

'nom et chemin du classeur fermé
Fich = "d:\TestAdo.xls" 'à adapter
'écrit dans le classeur fermé la valeur des cellules A1:A5
'du classeur actif
For Each cell In ActiveWorkbook.Sheets("Feuil1").Range("A1:A5")
SetExternalDatas Fich, "Feuil1", cell.Address(0, 0), cell.Text
Next

'écrit en A6 la date et l'heure de l'opération
SetExternalDatas Fich, "Feuil1", "A6", "mise à jour du " & Now
'on regarde le résultat
DoEvents
Workbooks.Open Fich
End Sub

'écrit DataToWrite dans la cellule DestCellAdr de la feuille DestFeuille du classeur fermé DestFile
Sub SetExternalDatas(DestFile As String, _
DestFeuille As String, _
DestCellAdr As String, _

DataToWrite As Variant)
Dim oConn 'As ADODB.Connection
Dim oCmd 'As ADODB.Command
Dim oRS 'As ADODB.Recordset
Dim RangeDest

'd'après Rob Bovey, mpep
' Open a connection to the Excel spreadsheet
Set oConn = CreateObject("ADODB.Connection") 'New ADODB.Connection
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & DestFile & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"";"

' Create a command object and set its ActiveConnection
Set oCmd = CreateObject("ADODB.Command") 'New ADODB.Command
oCmd.ActiveConnection = oConn

' This SQL statement selects a cell range in the "feuilleTest" worksheet.
'1 Sélection pour écrire dans une seule cellule
RangeDest = DestCellAdr & ":" & DestCellAdr
oCmd.CommandText = "SELECT * from `" & DestFeuille & "$" & RangeDest & "`"

' Open a recordset containing the worksheet data.
Set oRS = CreateObject("ADODB.Recordset") 'New ADODB.Recordset
oRS.Open oCmd, , 1, 3 'adOpenKeyset, adLockOptimistic

' met a jour la dernière ligne
oRS(0).Value = DataToWrite
oRS.Update

'ferme la connection
oConn.Close
Set oConn = Nothing
Set oCmd = Nothing
Set oRS = Nothing
End Sub

Pour sélectionner une cellule
B3 Range("B3").Select
ou bien
[B3].select

Pour exécuter une macro XL4 avec VBA:
Sub AppelDeMacroXL4()
Application.Run Macro:=Range("nomDuFichier.XLS!NomDeLaMacro")
End Sub

Ouvrir successivement plusieurs fichiers protégés à l'ouverture par des mots de passe.
Il suffit de mettre Password:="mot_de_passe" après le nom du fichier à ouvrir.

Voici la liste des sites dédiés à Excel, réalisés amateurs et que nous devons tous avoir dans nos favoris.
Débutant ou utilisateur confirmé, tu y trouveras de quoi apprendre, progresser et résoudre bien des problèmes.
http://dj.joss.free.fr/faq.htm

Tester si un fichier est présent, (ou une disquette)
Sub Macro1()
On Error GoTo fin:
Workbooks.Open FileName:="a:\conbac_p.TXT"
If Err.Number = Empty Then Exit Sub
fin:
MsgBox " no. d'erreur " & Err.Number
End Sub
Un autre exemple
Sub test_disquette()
On Error Resume Next
Dim fs, d, dc, n
Set fs = CreateObject("Scripting.FileSystemObject")
Set dc = fs.Drives
For Each d In dc
If d.DriveLetter = "A" Then
n = d.VolumeName & FormatNumber(d.FreeSpace / 1024, 0) & "
KOctets libres"
If n = "" Then
MsgBox "i clic sur ok, i met n'disquette et i r'clic sur
l'macro"
Exit For
Else
n = d.VolumeName & FormatNumber(d.FreeSpace / 1024, 0) & "
KOctets libres"
MsgBox n
End If
End If
Next
End Sub
Un autre exemple pour excel97
' référencer Microsoft Scripting Runtime
Sub test_disquette()
On Error Resume Next
Dim fs, d, dc, n
Set fs = CreateObject("Scripting.FileSystemObject")
Set dc = fs.Drives
For Each d In dc
If d.DriveLetter = "A" Then
n = d.VolumeName & d.FreeSpace
If n = "" Then
MsgBox "i clic sur ok, i met n'disquette et i r'clic sur l'macro"
Exit For
Else
n = d.VolumeName & d.FreeSpace
MsgBox n
End If
End If
Next
End Sub

Si on a perdu des barres d'outil dans excel et qu'on n'arrive pas a les faire réapparaitre, voici une solution.
ouvre visual basic (Alt + F11)
Coller le code suivant dans un module sous l'arborescence du classeur actif, et l'exécuter

Sub AfficherTout()
For Each cb In Application.CommandBars
If cb.Enabled = False Then cb.Enabled = True
Next cb
End Sub

Une macro complémentaire Française contient toutes les fonctions en Français, et est capable d'interpréter le nom des fonctions anglaises, par contre une version Anglaise ne connait pas le nom des fonctions dans les autres langues.
C'est pourquoi si on ouvre un classeur Anglais sur une version Française on ne rencontre pas de problème. L'inverse n'est pas vrai.
Cette logique est toujours valable si on utilise les packs de langue d'office 2000 ou XP.
les MLP (Multi language pack) n'installent pas de complément, donc ne modifie pas cette logique.
La solution serait d'utiliser les noms anglais avec une version Française.
Voici un article technique donnant toutes les traductions :
NB: toutes les fonctions par défaut d'Excel (ex: SI(), Somme() ...) sont compatibles entre toutes les langues.

Voici une procédure qui supprime le code VBA sans afficher la fenêtre VBE.
La bibliothèque suivante doit être chargé :
"Microsoft Visual Basic for Applications Extensibility 5.3"
Sub SupprimeToutCodeEtFormulaire()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents
Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
Next VBComp
End Sub

Autre solution:
Sub SupprToutCodeVBA()
'L Longre, mpfe
Dim VBC As Object
With ActiveWorkbook.VBProject
For Each VBC In .VBComponents
If VBC.Type = 100 Then
With VBC.CodeModule
.DeleteLines 1, .CountOfLines
.CodePane.Window.Close
End With
Else: .VBComponents.Remove VBC
End If
Next VBC
End With
MsgBox "Modules et macros du classeur actif supprimées.", _
vbInformation
End Sub

Générer un saut de ligne
Dans une cellule Excel : ="Tata"&CHR(10)&"Toto" sans oublier de renvoyer à la ligne dans Format de celle >> Alignement.
Ou bien en VBA : & vblf& au lieu de & CHR(10) &

Zoom sur une plage de cellules
Voici ce que nous essayons de faire :

Bien sûr dans l'image que vous voyez ici, vous ne pouvez constater que la cellule zoomée reflète toujours le contenu de la cellule d'origine.
Dans notre exemple la cellule de total contient une fonction somme.
Pour arriver à cette solution, il faut d'abord ajouter un bouton à une barre d'outils quelconque (Standard par ex.) :
Outils/Personnaliser
Dans l'onglet Commandes, sélectionnez la Catégories Outils.
Glissez la commande Photo sur la barre d'outils Standard.
Cliquez sur le bouton Fermer.
Maintenant il nous faut utiliser ce bouton Photo :
Sélectionnez la plage à zoomer.
Cliquez sur le bouton Photo
Dessinez un rectangle sur votre feuille, vous pouvez le dessiner sur une autre feuille de calcul ou sur une feuille graphique (cliquez sur l'onglet correspondant puis dessinez).
Agrandissez la photo de la cellule à la taille désirée, elle se manie comme une image. Les 2 traits qui relient la photo à la cellule d'origine sont tout simplement 2 lignes dessinées avec l'outil Trait de la barre d'outils Dessin.
Vous pouvez constater que cette image est liée à la plage d'origine :
Changez une des valeurs A, B, C ou D, le total change et la photo également.
(Vu sur le site Cathy Astuces)

Lorsque je ferme un fichier avec un filtre actif, la réouverture est très longue.
Il faut enlever le filtre à la fermeture

Sur le Workbook_BeforeClose mettre

Worksheets("Sheet1").AutoFilterMode = False

sauriez vous comment extraire le nom d'une feuille excel
pour le récupérer automatiquement dans une cellule?

Une...
(Le fichier doit être déjà enregistré)

=STXT(CELLULE("filename");TROUVE("]";CELLULE("filename"))+1;99)
Dans le cas où tu aurrais une date comme nom de feuille, tu peux utiliser la formule suivante :
=SUBSTITUE(STXT(CELLULE("nomfichier";A1);TROUVE("]";CELLULE("nomfichier";A1))+1;999);".";"/")*1
'donne le nom de la feuille ou ce trouve maCel
Function SheetName3(ByRef maCel As Range) As String
Application.Volatile
SheetName3 = maCel.Parent.Name
End Function

Dans le même style en plus court
Function NomF()
Application.Volatile
NomF = ActiveSheet.Name
End Function


Un timer
Declare Function GetTickCount Lib "Kernel32" () As Long
Sub test()
For i = 1 To 50 Step 1
Minuterie 200
ActiveSheet.Shapes("essai").Select
Selection.ShapeRange.IncrementTop -0.75
Next i
End Sub
Sub Minuterie(Milliseconde As Long)
Dim Arret As Long
Arret = GetTickCount() + Milliseconde
Do While GetTickCount() < Arret
DoEvents
Loop
End Sub
Un autre timer
Il faut utiliser la méthode OnTime.
Exemple :
Sub ALuumer()
MsgBox "Il faut attendre"
Application.OnTime Now +
TimeValue("00:00:15"), "Eteindre"
End Sub
Sub Eteindre()
MsgBox "15 secondes ce sont écoulées"
End Sub
Cordialement
Cette fonction est aussi interressante
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Tempo()
MsgBox "Msg 1"
Sleep (1000) ' pause de 1 seconde
MsgBox "Msg 2"
Sleep (3000) ' pause de 3 seconde
MsgBox "Msg 3"
End Sub

Pour naviguer entre les onglets
Ctrl + Page Up
Ctrl + Page Down

Créer un fichier texte et l'ouvrir avec le notepad
Sub LaMacro()
Open "c:\Toto.txt" For Output As #1
Print #1, "Je suis un bout de texte"
Close #1
x = Shell("c:\winnt\system32\notepad.exe c:\Toto.txt", vbNormalFocus)
End Sub


Exemple d'utilisation de statusbar
Sub StatusBarTest()
Application.ScreenUpdating = False
SBText = "Traitement en cours"
For t = 1 To 40

'mettre un timer ou un traitement ici
SBText = SBText & Chr(1)
Application.StatusBar = SBText
End If
Next t
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub

Comment selectionner toutes les lignes d'une feuille
Rows("1:" & Cells.SpecialCells(xlCellTypeLastCell).Row).Select

Voila une barre de progression.(Je sais c'est un peu long comme code mais il
faut ce qu'il faut)

Ajouter un Userform(UserForm1), 2 Labels(Label1 et Label2) et exécuter la proc EssaiProgress ci-dessous pour voir le résultat.
Attention pour le titre de la form(Caption) le paramétrer dans les propriétés et non dans la proc Initialize de ta form sinon on vera la croix.
A mettre dans un module standard.
Public Iteration As Single
Public Increment As Single
Public Sub ProgressBarContinue(Maximum As Long)

'ne pas oublier de remettre les variables à zéro dans la procédure d'appel "Iteration = 0" "Increment = 0" pour éviter dans un 2ème appel que la progression en % soit érronée
Dim Frm As UserForm
On Error Resume Next
Set Frm = UserForm1

'divise la largeur maxi (300) du controle par le nombre maximum d'appel de la procédure
If Iteration = 0 Then
Iteration = 300 / Maximum
End If

'incrémente à chaque appel pour augmenter la largeur du controle
Increment = Increment + Iteration
'permet la mise à jour de la Form
DoEvents
'change la largeur du controle
Frm.Label1.Width = Increment
'affiche le pourcentage de progression
Frm.Label2.Caption = Round(Increment / 3, 0) & " %"
'déplace le controle pour qu'il soit
'centré sur la barre de déffilement
If Increment < 30 Then
Frm.Label2.Left = 0
Else
Frm.Label2.Left = (Increment / 2) - 15 '(-15 = moitié de la largeur du
controle LblTexte)
End If
Set Frm = Nothing
End Sub

A mettre aussi dans le module standard et à exécuter pour l'éssai.
Sub EssaiProgress()
Dim I As Integer
Dim J As Integer
UserForm1.Show False
For I = 1 To 200
For J = 1 To 200
Cells(I, J).Value = I + J
Next
ProgressBarContinue 200
Next
Iteration = 0
Increment = 0
Unload UserForm1
End Sub

A mettre dans le module de la Form(Les API enlèvent la croix, pour un ProgressBar c'est mieux)
'Recup du handle
Private Declare Function RecupFenetre Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName _
As String) As Long

'récup du style
Private Declare Function RecupStyleFenetre Lib "user32" Alias _
"GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

'défini le nouveau style
Private Declare Function DefStyleFenetre Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong
As Long) As Long
Const GSTYLE = -16
Const SYSMENU = &H80000
Private Sub UserForm_Initialize()
Dim Identifiant As Long
Dim Style As Long
Identifiant = RecupFenetre("thunderdframe", Me.Caption)
Style = RecupStyleFenetre(Identifiant, GSTYLE)
Style = (Style And Not SYSMENU)
DefStyleFenetre Identifiant, GSTYLE, Style
With Me
.Height = 35.25
.Width = 300
End With
With Me.Label1
.Top = 0
.Left = 0
.Width = 0
.Height = 16
.BackColor = &H800000 'bleu foncé
End With
With Me.Label2
.Top = 0
.Width = 0
.Width = 30
.Height = 10.05
.ForeColor = &H8000000E 'blanc
.BackStyle = fmBackStyleTransparent
End With
End Sub
'proposé par Hervé liste microsoft.public.fr.excel

Modifier l'icone et le texte dans le barre de titre d'excel?
'this code sets the main Excel icon to the .ico file supplied
'(The Declares lines are one line each)
'Stephen Bullen, Microsoft.public.excel.programming, 98/04/08
'Get the handle for a window
Declare Function wapiFindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String)
As Long

'Extract an icon from a file
Declare Function wapiExtractIcon Lib "shell32.dll" Alias "ExtractIconA" _
(ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal
nIconIndex As Long) As Long

'Send a Windows message
Declare Function wapiSendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As
Integer, ByVal lParam As Long) As Long
Public Const WM_SETICON = &H80
Sub ChangeIcon()
Dim sName As String
sName = "C:\club.ico"

'Uncomment the next line to restore the standard Excel icon. Give the right
path
'sName = "F:\Office\Excel.exe"
Call procSetIcons(sName)
End Sub
Sub procSetIcons(sIconPath)
Dim a As Long, ihWnd As Long, ihIcon As Long

'Get the handle of the Excel window
ihWnd = wapiFindWindow("XLMAIN", Application.Caption)
'Get the icon from the source
ihIcon = wapiExtractIcon(0, sIconPath, 0)
'1 means invalid icon source, 0 means no icons in source
If ihIcon > 1 Then
'Set the big (32x32) and small (16x16) icons
a = wapiSendMessage(ihWnd, WM_SETICON, True, ihIcon)
a = wapiSendMessage(ihWnd, WM_SETICON, False, ihIcon)
End If
End Sub

Pour l'utilisation d'un mot de passe, des exemples
http://disciplus.simplex.free.fr/xl/protection.htm

Effacer les cellules vides
[A1:F30].SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft

Le controle ProgressBar

Lancer une commande DOS
Essaie Shell "Command.com /c " & ta_commande_dos
Par exemple, pour lister tout le contenu du lecteur C :
Shell "Command.com /c dir/s/b", vbMaximizedFocus
Si tu veux que la fenêtre DOS reste ouverte après exécution, remplace /c
par /k

Barre de titre perdue?:
Essaie de supprimer (ou renommer) le fichier XLB et relance Excel.
Sinon
Démarrer Exécuter "c:\Program Files\Microsoft Office\Office\Excel.exe" /o
ou "c:\Program Files\Microsoft Office\Office\Excel.exe" /Regserver

Comment ouvrir le classeur sur une feuille déterminée?
le plus simple est de fermer le classeur sur cette feuille
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As
Boolean)
Sheets("Accueil").Activate
End Sub

sinon
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Sheets("Accueil").Activate
Application.ScreenUpdating = true
End Sub

Lors de l'éxécution d'une macro, je veux modifier un userform, or l'affichage n'est modifié qu'a la fin de la macro
Ajouter avant de lancer la macro l'instruction:
DoEvents

Comment trouver la dernière colone ou la dernière ligne utilisée?
si c'est la dernière de la ligne 1
Sub test()
rep = Range("iv1").End(xlToLeft).Column
rep1 = Cells(1, rep).Address(, False)
rep2 = Application.Find("$", rep1) - 1
MsgBox Left(rep1, rep2)
End Sub

si c'est la dernière colonne quelque soit la ligne
Sub test()
ActiveSheet.UsedRange
rep = Selection.SpecialCells(xlCellTypeLastCell).Column
rep1 = Cells(1, rep).Address(, False)
rep2 = Application.Find("$", rep1) - 1
MsgBox Left(rep1, rep2)
End Sub

ou
MsgBox Split(ActiveCell.Address, "$")(1)
MsgBox Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)
MsgBox Mid(ActiveCell.Address, 2, InStr(2, ActiveCell.Address, "$") - 2)
MsgBox Left(ActiveCell.Address(1, 0), InStr(1, ActiveCell.Address(1, 0),"$") - 1)
MsgBox Mid(Chr((ActiveCell.Column - 1) \ 26 + 64) & Chr(((ActiveCell.Column - 1) Mod 26) + 65), (ActiveCell.Column < 27) * -1 +1)
MsgBox Left(Mid(ActiveCell.Address, 2), Len(Mid(ActiveCell.Address, 2)) -
(Len(Mid(Mid(ActiveCell.Address, 2), Application.Search("$",Mid(ActiveCell.Address, 2), 1) + 1)) + 1))
ou
Cells.Find("*", , , , , xlPrevious).Select
ou
Dim Colonne As String
Colonne = ActiveSheet.UsedRange.Address(, False)
MsgBox Mid(Colonne, 1, InStr(1, Colonne, "$") - 1)

Quand je lance Excel, je me retrouve automatiquement en mode "étendre la sélection des cellules"
Essaie ceci :
Démarrer, Exécuter, "C:\Program Files\Microsoft Office\Office\Excel.exe"
/REGSERVER
(en respectant les parenthèses, en modifiant éventuellement le chemin d'accès)
Sinon
- quelle souris utilises-tu , le bon driver a-t'il été installé ?
- s'il s'agit d'une souris avec molette, essaie de cliquer plusieurs fois sur la molette pour annuler le mode extension de sélection.
- essaie de changer la souris

Pour quitter l'application
Application.Quit
pour fermer sans préavis (Attention pas d'enregistrement !!!)
Application.DisplayAlerts = False
Application.Quit

Comment cacher une macro du menu macro?
Ajouter "Optional Factice As String" et elle disparaitra.
Sub CacherMacro(Optional Factice As String)
MsgBox "Salut DJ9B"
End Sub

Comment se placer sur la dernière cellule d'un tableau sans utiliser la souris ou le curseur?
Touche pour aller en bas sans selectionner : Crtl+flèche en bas
Avec sélection : Crtl+Shift+Flèche en bas

Peut-on faire apparaitre un msgbox quelques secondes et le faire disparaitre sans cliquer sur ok?
Une astuce bricolée avec une Form, car avec un MsgBox comme il est modal tu ne peux rien faire sans le fermer en cliquant sur OK
A mettre dans un module standard ou dans le module ou tu appelle ta Userform qui devra contenir un bouton (eventuellement minuscule) dont le code sera:
userform1.hide
Sub Afficher()
UserForm1.Show False 'False = non modale
'2 secondes
Application.OnTime Now + TimeValue("00:00:02"), "Fermer"
End Sub
Sub Fermer()
SendKeys "{ENTER}"
End Sub

De même, à mettre dans le module de ta Form. Si tu ne veux pas que ton
utilisateur le ferme avant les Api supprime la croix.
'Recup du handle
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName _
As String) As Long

'récup du style
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

'défini le nouveau style
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal _
dwNewLong As Long) As Long
Const GSTYLE = -16
Const SYSMENU = &H80000
Private Sub UserForm_Initialize()
Dim Identifiant As Long
Dim Style As Long

'récupère le handle de la Form
Identifiant = FindWindow("thunderdframe", Me.Caption)
'récupère le style actuel de la Form
Style = GetWindowLong(Identifiant, GSTYLE)
'supprime la croix de fermeture
Style = (Style And Not SYSMENU)
'Défini le nouveau style
SetWindowLong Identifiant, GSTYLE, Style
End Sub

Autre methode qui me plait mieux!
Sub TimedMessage()
Const Title As String = "Self closing message box"
Const Delay As Byte = 2 ' Tps d'affichage en secondes
Const wButtons As Integer = 0 + 64 ' Boutons + icone
Dim wsh As Object, msg As String
Set wsh = CreateObject("WScript.Shell")
msg = Space(10) & "Bonjour," & vbLf & vbLf & "Nous sommes le " & Date
wsh.Popup msg, Delay, Title, wButtons
Set wsh = Nothing
End Sub

Cette ligne de commande rend "impossible" la visualisation
de la feuille par l'usager
(même savoir qu'elle existe) sans avoir accès au code du projet. Exemple d'utilisation:
Worksheets("feuil1").Visible = xlVeryHidden

Effacer une feuille ou une partie:
Tout effacer (du moins le contenu)
Cells.ClearContents
pour une plage
Range("b1:c10").ClearContents
Pour tout effacer Format, contenu..
utiliser clear

Les mises à jour Microsoft et ajouts pour Excel 97/98

Comment éviter le message de confirmation à l'enregistrement d'un classeur?
Il y a deux façons:
En incluant la commande suivante en tête de la macro
Application.displayAlert=false
en faisant croire à excel que le classeur a déjà été enregistré.
ThisWorkbook.Saved = True
ThisWorkbook.Close

Comment mettre en pied de page, le chemin et le nom du fichier?
Dans la boite de dialogue, mise en page, onglet entête / pied de page, tu as un bouton pied de page personnalisé.
Une nouvelle boite de dialogue s'ouvre et tu as une série de boutons.
Certains te permettent d'insérer le chemin d'accès au fichier (&[Chemin d'accès]&[Fichier])
Les autres le nom du classeur, de l'onglet...

Enregistrer un classeur sous un autre nom, en le vidant au passage d'une partie de son code fs, mpfe
Sub SaveAsWithoutMacros()
Dim NomSource$, CheminDest$, NomDest$
Dim VBC As Object

'variables à adapter
NomSource = "EssaiSaveAs.xls"
CheminDest = "C:\Windows\Temp\"
NomDest = "Essai.xls"

'copie du classeur source
Workbooks(NomSource).SaveAs CheminDest & NomDest
'(qui devient le classeur actif)
With ActiveWorkbook.VBProject
DelProc ThisWorkbook, "ThisWorkbook", "Workbook_Open"
DelProc ThisWorkbook, "Feuil1", "Worksheet_Activate"
DelProc ThisWorkbook, "Module1", "MaMacro"
End With
Application.Quit
SendKeys "%O"
End Sub

'supprimer une procédure d'un module et uniquement cette procédure
Sub DelProc(Wbk As Workbook, CodeMod$, NomProc$)
Dim liDeb, NbLi
With Wbk.VBProject.VBComponents(CodeMod).CodeModule
liDeb = .ProcStartLine(NomProc, 0)
NbLi = .ProcCountLines(NomProc, 0)
.DeleteLines liDeb, NbLi
End With
End Sub
'fs

Existerait il une fonction ou une commande qui permettrait de rechercher l'emplacement d'une valeur de cellule ou d'une formule dans un classeur autre que celui que l'on a ouvert et ce sans bien sûr l'ouvrir.
Public Function GetValue(ByVal path, ByVal file, ByVal sheet, ByVal ref) As Variant
' Macro XL4 Merci à John Walkenbach
' ==============================
' Retrieves a value from a closed workbook
Dim Arg As String
' Make sure the file exists
If Right(path, 1) <> "\" Then path = path & "\"
If Dir(path & file) = "" Then
GetValue = "File Not Found"
Exit Function
End If
' Create the argument
Arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Address(, , xlR1C1)

' MsgBox Arg
' Execute an XLM macro
GetValue = Application.ExecuteExcel4Macro(Arg)
DoEvents
End Function
Utilisation :
Sub Test()
MsgBox GetValue("C:\Mes Documents\","MonFichier.xls","MaFeuille","A")
End Sub
1 La fonction de John Walkenbach n'est utilisable qu'en VBA, donc la formule (dans une cellule) =GetValue(...) ne marche pas !
Ceci pour la raison simple qu'il suffit de rentrer dans une cellule...
='C:\Mes Documents\[MonFichier.xls]MaFeuille!A1
... pour que tout marche à merveille !
2 Frédéric Sigonneau a (toujours) raison les deux méthodes (VBA et Formule) fonctionnent dans tous les cas de figures :
classeur protégé, feuille masquée ou très masquée...
On se demande vraiment à quoi servent les différentes protections !!!!
OU AVEC LES COORD' CELLULES Cells(l,c)
Public Function GetValue(ByVal path, ByVal file, ByVal sheet, ByVal c, ByVal l) As Variant
' Macro XL4 Merci à John Walkenbach
' Retrieves a value from a closed workbook
Dim Arg As String
' Vérifie l'existence du fichier
If Right(path, 1) <> "\" Then path = path & "\"
If Dir(path & file) = "" Then
GetValue = "File Not Found"
Exit Function
End If
' Crée l'argument
Arg = "'" & path & "[" & file & "]" & sheet & "'!" & Cells(l,c).Address(, , xlR1C1)
' Arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(Cells(l, c)).Address(, , xlR1C1)
' Execute an XLM macro
GetValue = Application.ExecuteExcel4Macro(Arg)
DoEvents
End Function

Je voudrais effectuer une somme de noms distincts en bas d'une colonne alors que certains noms apparaissent plusieurs fois dans la colonne.
La matricielle suivante
=SOMME(SI(NBCAR(A2:A100);1/NB.SI(A2:A100;A2:A100)))

Pour rechercher une chaîne et supprimer la ligne complète
où est trouvé la chaîne ....

Private Sub EnleverLignes()
Dim D As Range, C As Range, MonCritère As String
MonCritère = "aa"
On Error Resume Next
For Each C In Worksheets("Feuil1").Columns(7). _
SpecialCells(xlCellTypeConstants, xlTextValues)
If C.Value = MonCritère Then
If Not D Is Nothing Then
Set D = Union(D, C)
Else
Set D = C
End If
End If
Next
D.EntireRow.Delete
Set D = Nothing: C = Nothing
End Sub


Sauver un classeur au format HTML
Attribute VB_Name = "CreerPageWeb"
Sub PublishObjectExample()

'Robert Rosenberg, mpep
Dim oPO As PublishObject
'Set a reference to the Publish object
Set oPO = ActiveWorkbook.PublishObjects.Add(xlSourceSheet, _
"C:\My Documents\LABRCR\ExcelData\Page.htm", "District A", "", xlHtmlCalc)

'Publish it (Save it as HTML)
oPO.Publish True
'Display the unique identifier number
'This will be different each time this code is run.
MsgBox oPO.DivID
End Sub


Je souhaiterais que quelqu'un m'explique pourquoi certaines macros n'apparaissent pas quand on fait : "Outil - Macro - Macro".
Les macros ne sont pas visibles dans la boite de dialogue "Macro" lorsque :
- la macro est déclarée Private
- elle est publique mais l'option Option Private Module est en tête du module où
elle est écrite
- elle est publique mais possède un ou des paramètres
- elle est publique, avec ou sans paramètres, mais appartient à une macro
complémentaire
Malgré cela, il est possible d'exécuter la macro depuis la boite de dialogue
Outils\Macro\Macros en tapant son nom dans la zone "Nom de la macro" puis
Exécuter.
Sauf si la macro a un ou des paramètres. Dans ce cas, elle doit être publique.
Petit exemple :
- macro avec paramètres :
(le type des paramètres peut être précisé ou Variant)
Sub macro(s, i) '(s As String, i As Integer)
MsgBox "coucou"
End Sub
- dans la zone "Nom de la macro", taper :
(la "ligne de commande" doit être entourée de quotes simples)
'macro "un",4'
(puis Exécuter)

Pour connaître le numéro de la première ligne du résultat du filtre automatique...
Sub NuméroLigne()
On Error Resume Next
If ActiveSheet.AutoFilterMode = True Then
With Range("_FilterDatabase")
MsgBox .Offset(1).Resize(.Rows.Count - 1, Columns.Count).SpecialCells(xlCellTypeVisible).Row
End With
End If
End Sub

Plus de 230 macro-commandes pour Excel.
Vous êtes nombreux parmi les internautes à utiliser le logiciel Excel et à connaître ses possibilités. Pour les autres sachez que ce logiciel (payant) est un tableur qui permet de contrôler, gérer, trier et mettre en forme des données.
Il peut s'agir par exemple de souhaiter gérer sa collection vidéo, un planning annuel ou un carnet d'adresses, suivre toutes vos finances concernant votre voiture, son entretien, l'assurance, les pleins d'essence ou de gasoil, etc.
La création de ces fichiers Excel n'est pas forcément des plus faciles pour un néophyte. Heureusement le site "Excel Downloads" vous propose plus de 230 macro-commandes permettant l'utilisation d'applications très intéressantes.
- Excel-downloads
Les macro-commandes sont présentées dans le menu suivant : Utilitaires, Business, Gestion Finance, Convertisseurs, Loisirs Sports, Bricolage, Jeux, Microsoft et Divers.
Voici quelques exemples de macro-commandes qui vous montrerons l'étendue du choix proposé :
- Gestion des notes de frais.
- ExeStock : logiciel de gestion de stock.
- Karcher : nettoyage des classeurs excel de tout ce qui est inutile.
- Pochette-CD : réalisation des pochettes pour CD, CD de données ou CD audio.
- Chonometre projets : ce programme permet de chronométrer le temps passé sur différents projets, puis de pouvoir les totaliser.
Vous le comprendrez, chacun peut trouver son bonheur, il suffit de passer un peu de temps sur le site. Notez que les fichiers à télécharger sont peu volumineux, donc, un gain de temps en perspective.

Companims [v 1.0 ß] Win Me Win 95 Win 98 Freeware WAHRENBERGER Olivier
pctuning.free.fr
anshare.com [16 Ko]
Companims est une feuille Microsoft Excel 97 qui incorpore des boutons.
Chaque bouton lance une animation du compagnon Office choisi.
Dans cette version, les boutons s'appellent "Bouton1", "Bouton2",...
Tout le code VBA est fourni, la feuille n'est pas protégée.

Excel --> HTML [v 1.0] Freeware [143,18 Ko] Français
Transformation d'un tableau Excel exporté au format texte en tableau HTML.

Les versions d'excel
Pour les versions 1 à 5, aucune difficulté. Ensuite est sortie la version 95
qui est une version 7 (pas de version 6, car Microsoft a voulu rendre homogènes
les numéros de version des Applis Office). Excel est ainsi passé de 5 à 7 tandis
qu'Access passait de 2 à 7 !
La version 7 était une simple adaptation d'Excel 5 à Windows 95. Il y a très peu de
différences dans les fonctionnalités, et pour cette raison, il n'y a pas eu de version 7
pour Excel Mac.
Au delà :
Windows Mac
8 97 98
9 2000 2001
10 XP X
Dans (10.4302.4219), les chiffres avant le point représentent le numéro de version.
La suite correspond aux "Builds" versions Beta, puis sous-versions successives
(version initiale, puis SR1, SR2, ... (SR pour Service Release ou SP pour Service Pack).
En VBA, Application.Version renvoie le numéro de version, et Application.Build celui de
la ... Build ;-))
Précision : Excel 2002 et Excel xp sont 2 appellations différentes
pour le même produit.

'Procédure appelante : Ouvre un fichier et désactive les macros de ce dernier.
Sub OuvrirFichierSansActiverLesMacros()
OpenFileWithoutMacro "c:\Mes documents", "Les classeurs.xls"
End Sub

'----------------------------
Sub OpenFileWithoutMacro(Chemin As String, Fichier As String)
'Désactive complètement l'exécution des macros du fichier.
'N'affecte pas le comportement des autres fichiers ouverts.
'Cette procédure doit être appelé à partir de la feuille
'de calcul et non de la fenêtre VBE à cause des commandes
'Les 2 commandes suivantes s'assurent que
'la fenêtre "Open" pointe vers le bon répertoire

SendKeys "{esc}"
Application.Dialogs(xlDialogOpen).Show Chemin

'Ouvre le fichier en désactivant la macro.
SendKeys "%Fo" & Fichier & "%od"
End Sub

Selectionner toutes les lignes à partir de la ligne selectionnée
Sélectionner le n° de ligne puis MAJ + CTRL + Flèche bas

Remettre un tableau à zéro rapidement, tout en conservant les formules
Edition/Atteindre
cliquez sur le bouton Cellules
Cochez constantes et
Nombres, si vous voulez effacer les données numériques
Texte, si vous voulez vider les cellules contenant du texte
Valeurs logiques, si vous voulez effacer les valeurs vrai ou faux
Ok
Maintenant que les cellules contenant des constantes (valeurs sans formule) sont sélectionnées appuyez sur la touche Suppr.

Suppression des doublons dans une liste
Public Sub SupprDoublon()
Dim flleNouv As Worksheet, flleActu As Worksheet
Dim rDoublon As Range
Set flleActu = ActiveSheet
Set rDoublon = Selection

'exécute un filtre élaboré sans critère et sans doublon
rDoublon.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
'ajoute une feuille
Set flleNouv = Worksheets.Add
'sélectionne uniquement les cellules visibles
rDoublon.SpecialCells(xlCellTypeVisible).Copy
' on colle ces cellules dans la nouvelle feuille
flleNouv.Range("A1").PasteSpecial xlPasteAll
'on affiche tout pour annuler le filtre
flleActu.ShowAllData
'on efface tous le contenu de la plage
rDoublon.ClearContents
' on copie les données de la nouvelle feuille et on les colle dans la sélection
flleNouv.Range("A1").CurrentRegion.Copy rDoublon.Cells(1)
'on supprime la nouvelle feuille
Application.DisplayAlerts = False
flleNouv.Delete
Application.DisplayAlerts = False
End Sub (vu sur CathyAstuces)

Nombre de jours ouvrables
avec la macro complémentaire utilitaires d'analyse cochée
=nb.jours.ouvres(debut;fin;feriés)

'Cette macro donne le numero de ligne et la lettre de la colonne
Sub ColLigne()
Colonne = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)
Ligne = ActiveCell.Row
MsgBox Colonne & Ligne
MsgBox Colonne
MsgBox Ligne
End Sub

'Affiche le numéro de la dernière ligne du tableau
MsgBox Rows(Cells.Find("*", , , , , xlPrevious).Row).Row

'dernière ligne et dernière colonne
derlin = feuil.Cells.Find("*", , , , , xlPrevious).Row
dercol = feuil.Cells.Find("*", , , , xlByColumns, xlPrevious).Column


Cellule clignotante
Tiré de http://disciplus.simplex.free.fr/xl/formats.htm#clignotant
Sans macro, pas possible dans excel...
Avec une macro de Bill Manville :
Pour créer une cellule qui clignote :
Définit un nouveau style (format/style/Flash/ajouter)
Applique le à la cellule que tu choisis, place le code suivant dans un module de feuille et lance la procédure flash en tant que auto-open.
Le texte clignote entre rouge et blanc.
Dim NextTime As Date
Sub Flash()
NextTime = Now +
TimeValue("00:00:01")
With ActiveWorkbook.Styles("Flash").Font
If .ColorIndex = 2 Then .ColorIndex = 3 Else .ColorIndex = 2
End With
Application.OnTime NextTime, "Flash"
End Sub
Sub StopIt()
Application.OnTime NextTime, "Flash", schedule:=False
ActiveWorkbook.Styles("Flash").Font.ColorIndex = xlAutomatic
End Sub

****************************
Autre solution :
Comment faire pour qu'une cellule clignote quand la souris passe dessus.
Pour faire clignoter la cellule B5.
1. Sors la boîte à outils Contrôles,
2. Insère un contrôle Image (sans image !) sur ta cellule,
3. Choisis les propriétés suivantes pour ton contrôle :
BackStyle : Transparent
BorderStyle : None
4. Le contrôle doit avoir les mêmes dimensions que ta cellule,
5. Utilise alors les deux macros suivantes :
Private Sub Image1_MouseMove(ByVal Button As Integer, _
ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call Clignote
End Sub
Sub Clignote()
For i = 1 To 50
With [B5].Interior
.ColorIndex = 3
ColorIndex = xlNone
End With
Next i
End Sub

Envoyer un fichier par e-mail:
Private Sub CommandButton1_Click()
Dim Dest As String, Objet As String
Dim Corps As String, Rep As String
Dest = "Destinataire@Fournissseur"

'Définir le chemin et le fichier à expédier.
Rep = "C:\Mes documents\classeur1.xls"
Objet = "Est-ce que tu l'as reçu ce ... fichier?"
Corps = "Bonjour The Boss," & vbCrLf & vbCrLf
Corps = Corps & "Je t'en veux un peu puisqu'en rédigeant cette procédure" & vbCrLf
Corps = Corps & "Je me suis arraché le dernier poil sur le coco." & vbCrLf & vbCrLf
Corps = Corps & "Espérons que cela va fonctionner cette fois pour toi." & vbCrLf & vbCrLf
Corps = Corps & "Salutations!" & vbCrLf & vbCrLf
Corps = Corps & "MichDenis"
Shell "C:\Program Files\Outlook Express\msimn.exe " & _
"/mailurl:mailto:" & Dest & _
"?subject=" & Objet & _
"&Body=" & Corps, vbMaximizedFocus

'Active la ligne de code qui correspond à ton exigence.
'Envoyer le fichier sans fichier attaché
'SendKeys "%s"
'Pour afficher le courriel + fichier attaché
'SendKeys "%I" & "p" & Rep & "~"
'Envoyer le courriel + fichier attaché de façon automatique
SendKeys "%I" & "p" & Rep & "~" & "%s"
End Sub

Une petite remarque sur ta méthode de calcul de la dernière ligne :
Ligne = ActiveSheet.UsedRange.Rows.Count
Par cette méthode, on obtient la dernière ligne réellement utilisée seulement
si
la feuille active contient des données en ligne 1.
Sinon le résultat est faux (et la suite de la procédure risque de ne pas donner les résultats attendus...).
Exemple : dans une feuille vierge, écrivez"toto" en A5, A6 et A7. Exécutez ensuite ce genre de procédure :
Sub test()
MsgBox ActiveSheet.UsedRange.Rows.Count
End Sub

Le message indique 3 alors que la dernière ligne utilisée sur la feuille est la ligne 7...
Pour corriger le tir, il faut commencer par récupérer la ligne à laquelle commence la partie utilisée de la feuille :
Sub test()
With ActiveSheet.UsedRange
MsgBox .Row + .Rows.Count - 1
End With
End Sub

UsedRange n'est pas un mauvais choix pour déterminer les
dernières ligne/colonne utilisées dans une feuille mais demande des précautions d'usage.

Pour mettre à jour les liens vers les autres fichiers en VBA
ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources

Paramètres personnalisés
Les options de démarrage d'Excel 97 ne permettent pas de transmettre des paramètres personnalisés au logiciel.
La technique suivante, non documentée, permet de réaliser cette opération.
Cette technique a été testée uniquement avec Excel 97 / Windows 95.
Elle devrait marcher avec Excel 95 et 97 tournant sous Windows 95 ou 98.
Elle ne fonctionnera pas avec Windows NT, et je ne sais pas si elle est adaptable à Excel 5 / Windows 3.1.
Le truc consiste à lancer Excel avec une option valide, par exemple /e (empêchant le chargement d'un classeur vide au démarrage) et à greffer immédiatement après cette option les paramètres personnels.
En effet, les caractères qui suivent les options de démarrage, jusqu'au premier espace rencontré, sont ignorés par Excel.
Ils ne génèrent donc pas d'erreur et sont exploitables par macro, via la fonction API GetCommandLine.
Par exemple, si l'on veut démarrer Excel en ouvrant le classeur "C:\Temp\Test.xls" en lui transmettant les paramètres "r", "h" et "report.dbf", la ligne de commande devrait être de ce type :
- à partir de DOS : start excel c:\temp\test /e/r/h/report.dbf
- à partir d'un programme VB : Shell "c:\...\excel.exe c:\temp\test /e/r/report.dbf"
Les paramètres doivent suivre immédiatement /e et ne doivent comprendre aucun espace.
Leur récupération peut s'opérer immédiatement après le lancement d'Excel par le biais d'une macro Workbook_Open ou Auto_Open placé dans le classeur ouvert.
Cette macro doit récupérer le contenu de la ligne de commande par GetCommandLine et utiliser les fonctions de chaîne de caractères pour localiser et séparer les paramètres personnels.
A titre d'exemple, la macro suivante récupère les paramètres dans une variable tableau (Args) et copie ce tableau dans la première feuille de calcul du classeur.
Option Base 1
Declare Function GetCommandLineA Lib "Kernel32" () As String
Dim Args() As String
Sub Auto_open()
Dim CmdLine As String
Dim ArgCount As Integer
Dim Pos1 As Integer, Pos2 As Integer
CmdLine = GetCommandLineA
Pos1 = InStr(1, CmdLine, "/e/") + 3
If Pos1 = 3 Or Pos1 = Len(CmdLine) Then Exit Sub
Do While Pos1 <> 1
Pos2 = InStr(Pos1, CmdLine, "/")
ArgCount = ArgCount + 1
ReDim Preserve Args(ArgCount)
Args(ArgCount) = Mid(CmdLine, Pos1, _
IIf(Pos2, Pos2, Len(CmdLine)) - Pos1)
Pos1 = Pos2 + 1
Loop
Worksheets(1).Range("A1:A" & ArgCount) = _
WorksheetFunction.Transpose(Args)
End Sub
Rappel des options de démarrage d'Excel 97 :
Les paramètres peuvent être utilisés en majuscule ou minuscule. Plusieurs paramètres consécutifs doivent être séparés par des espaces.
/automation : force Excel 97 à démarrer sans charger aucun add-in, ni aucun modèle ou classeur installé dans le répertoire Xlouvrir.
/e, /embedded : fore Excel à démarrer sans créer un classeur vide (Classeur1).
/i : force Excel à démarrer avec une fenêtre occupant tout l'écran.
/m : force Excel à s'ouvrir sur un nouveau classeur contenant seulement une feuille macro Excel 4.
/o : complète les entrées manquantes concernant Excel dans la base de registre.
La clé suivante est modifiée : HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel
/p <dossier> : change le dossier (répertoire) actif après avoir chargé Excel.
/r <fichier> : force Excel à ouvrir le fichier indiqué en lecture seule.
/s : force Excel à ignorer tous les fichiers installés dans le répertoire Xlouvrir.
/regserver : réinitialise les entrées de la base de registre d'Excel, puis ferme le logiciel.
/unregserver : vide les entrées de la base de registre et quitte Excel.
Ces infos ont été extraites des pages longre.free.fr à visiter.

FindLink.zip v8.6 (0/073, 35k)
Pour chercher les liens d'un classeur, ouvrir ou installer FINDLINK.XLA, activer le classeur et faire outils / Chercher les liens.
Il vous demande un texte à chercher.
Vous pouvez spécifier le nom d'un classeur spécifique (ex:"SOURCE.XLS") ou seulement ".XLS" pour trouver les références à tous les fichiers .XLS.
Vous pouvez aussi entrer "#REF" pour trouver tous les noms qui font référence à des zonnes éffacées ou à des noms de zones pour trouver où ces zones sont utilisées.
Optionnellement cet utilitaire liste les occurences, liste et efface (substutuant des valeurs quand c'est approprié), ou vous demande quoi faire avec chaque occurence.
Utilitaire trouvé sur ce site the excel MVP Page

Insérer une image dans un Userform

convertir un classeur excel en html et faire une copie sans les formules
Dim nbfeuilles As Integer
Sub copiehtml()

'placer ici les variables
'placer en haut de code dim nbfeuilles as integer
fictemp = "fichierOrigine.xls" 'le fichier avec les formules
fichier = "copie.xls" 'le fichier allégé
ficmenu = fictemp 'le fichier contenant le menu pour executer cette macro, peut être le fichier original ou un autre dédié à cette tache.
classeur = "nom" 'indique le nom des pages excel suivi d'un numéro de séquence

Application.ScreenUpdating = False
'ouvre les classeurs si fermés
On Error Resume Next
Windows(fictemp).Activate
If fictemp = ficmenu Then t = 1 Else t = 0
nbfeuilles = Worksheets.Count - t 'on ne copie pas le menu
If Err <> 0 Then Workbooks.Open FileName:=ActiveWorkbook.Path + "\temp.xls"
On Error GoTo 0
On Error Resume Next
Windows(fichier).Activate
If Err <> 0 Then Workbooks.Open FileName:=ActiveWorkbook.Path + "\" + fichier
On Error GoTo 0

'copie de fictemp.xls sur fichier par valeurs
For t = 1 To nbfeuilles 'on ne copie pas le menu
Windows(fictemp).Activate
If Sheets(t).Visible = True Then
Sheets(t).Activate
maxline = Range("a65536").End(xlUp).Row

maxcol = ActiveSheet.Cells.Find("*", , , , xlByColumns, xlPrevious).Column
ActiveSheet.UsedRange.Select
Selection.Copy
Windows(fichier).Activate
Sheets(t).Activate
Range("A1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Range("A1").Select

End If
Next t
Windows(fichier).Activate
Sheets(1).Select
ActiveWorkbook.Save 'enregistrement afin que la copie se fasse bien sur intranet
Windows(fictemp).Activate

'création du fichier index
mytitle = classeur
If nbfeuilles > 1 Then
DocDestination = ActiveWorkbook.Path + "\" & classeur & ".htm"
If Len(Dir(DocDestination)) > 1 Then Kill DocDestination
Open DocDestination For Output As 1
Print #1, "<HTML>" & Chr$(13)
Print #1, "<TITLE>" & mytitle & "</TITLE>" & Chr$(13)
Print #1, "<meta http-equiv=" & Chr(34) & "Content-Type" & Chr(34) & " content=" & Chr(34) & "text/html; charset=iso-8859-1" & Chr(34) & ">" & Chr$(13)
Print #1, "<META NAME=" & Chr(34) & "Author" & Chr(34) & " Content=" & Chr(34) & "votre nom" & Chr(34) & ">"
Print #1, "<BODY bgcolor=" & Chr(34) & "#9F9F9F" & Chr(34) & " >" & Chr$(13)

Print #1, index(Feuille, classeur)
Print #1, "<CENTER><TABLE bgcolor=" & Chr(34) & "#FFFFFF" & Chr(34) & " Border=1 cellspacing=0 width=" & Chr(34) & "100%" & Chr(34) & ">" & Chr$(13)
Print #1, "</TABLE></CENTER></FONT></BODY></HTML>" & Chr$(13)
Close
End If

For t = 1 To nbfeuilles
'mettre ici les différents paramètres correspondant à chaque tableau
Feuille = Sheets(t).Name
If Sheets(t).Visible = True Then
Sheets(Feuille).Select
mytitle = Sheets(t).Name
maxline = Range("a65536").End(xlUp).Row

maxcol = ActiveSheet.Cells.Find("*", , , , xlByColumns, xlPrevious).Column
MyRange = "A1:" & Cells(maxline, maxcol).Address()
DocDestination = ActiveWorkbook.Path + "\" & classeur & t & ".htm"
Call RangeToHTM(MyRange, Feuille, DocDestination)
End If
Next t

'copie des fichiers .htm dans le répertoire intranet d:\prive_pro\
Shell "Command.com /c " & ActiveWorkbook.Path + "\copie.bat", vbMinimizedFocus
Windows(ficmenu).Activate
Sheets("Menu").Select
ActiveWorkbook.Save
Application.ScreenUpdating = True
Application.Quit
End Sub
Sub RangeToHTM(MyRange, Feuille, DocDestination)

' cette macro convertit un tableau Excel en table html.
' La plupart du format est préservé. La taille des fontes, des lignes et colonnes sont ignorées.
' MyRange est le tableau excel à convertir.
Sheets(Feuille).Select
ColCount = Range(MyRange).Columns.Count
rowcount = Range(MyRange).Rows.Count

'CalcState = Application.Calculation
'Application.Calculation = xlCalculationAutomatic
'Calculate
mytitle = Selection.Range(MyRange).Cells(1, 1).Text
If Len(Dir(DocDestination)) > 1 Then Kill DocDestination
Open DocDestination For Output As 1

'crée le code html
Print #1, "<HTML>" & Chr$(13)
Print #1, "<TITLE>" & mytitle & "</TITLE>" & Chr$(13)
Print #1, "<meta http-equiv=" & Chr(34) & "Content-Type" & Chr(34) & " content=" & Chr(34) & "text/html; charset=iso-8859-1" & Chr(34) & ">" & Chr$(13)
Print #1, "<META NAME=" & Chr(34) & "Author" & Chr(34) & " Content=" & Chr(34) & "Votre nom" & Chr(34) & ">"
Print #1, "<BODY bgcolor=" & Chr(34) & "#9F9F9F" & Chr(34) & " >" & Chr$(13)
Row = 0 'on teste si les cellules sont encadrées
Range(MyRange).Cells(1, 1).Select
If Selection.Borders(xlEdgeLeft).LineStyle = xlNone Then bord = 0 Else bord = 1

Print #1, "<CENTER><TABLE bgcolor=" & Chr(34) & "#FFFFFF" & Chr(34) & " Border=" & bord & " cellspacing=0 >" & Chr$(13)

Row = 0
While Row < rowcount
Row = Row + 1
nblig = 0 'hauteur des colones non encadrées verticalement

'on teste si les cellules sont encadrées à gauche, si on passe de encadré a non encadré
'ou vice versa, on ouvre un autre tableau
Range(MyRange).Cells(Row, 1).Select
If Selection.Borders(xlEdgeLeft).LineStyle = xlNone Then
If bord = 1 And Row > 1 Then
bord = 0
Print #1, "</TABLE><CENTER><TABLE bgcolor=" & Chr(34) & "#FFFFFF" & Chr(34) & " Border=" & bord & " cellspacing=0 >" & Chr$(13)
End If
Else
If bord = 0 And Row > 1 Then
bord = 1
Print #1, "</TABLE><CENTER><TABLE bgcolor=" & Chr(34) & "#FFFFFF" & Chr(34) & " Border=" & bord & " cellspacing=0 >" & Chr$(13)
End If
End If

'on teste si la cellule A gauche est encadrée en bas afin de faire dans ce cas des colones
Range(MyRange).Cells(Row, 1).Select
If Selection.Borders(xlEdgeBottom).LineStyle = xlNone And _
Selection.Borders(xlEdgeLeft).LineStyle <> xlNone And _
Selection.Borders(xlEdgeRight).LineStyle <> xlNone And Row + nblig < rowcount Then
While Range(MyRange).Cells(Row + nblig, 1).Borders(xlEdgeBottom).LineStyle = xlNone
nblig = nblig + 1
Wend
End If

If (Not Range(MyRange).Rows(Row).Hidden) Then
MV = ""
col = 0
While col < ColCount
col = col + 1

'on teste si la colonne est cachée
If (Not Range(MyRange).Columns(col).Hidden) Then
taille = calctaille(Range(MyRange).Cells(Row, col).Font.Size)
CC = Range(MyRange).Cells(Row, col).Interior.ColorIndex
BGC = couleur(CC)

'test si cellule en % et supérieure à 100%
If Len(Range(MyRange).Cells(Row, col).Text) > 1 Then
temp = Left(Range(MyRange).Cells(Row, col).Text, Len(Range(MyRange).Cells(Row, col).Text) - 1)
End If
If Right(Range(MyRange).Cells(Row, col).Text, 1) = "%" _
And Val(temp) >= "100" And nblig = 0 Then
BGC = "#CCFFCC" 'vert clair

End If
If Len(BGC) > 2 Then BGC = " bgcolor=" & Chr$(34) & BGC & Chr$(34) Else BGC = " bgcolor=" & Chr$(34) & "#FFFFFF" & Chr$(34)
CC = Range(MyRange).Cells(Row, col).Font.ColorIndex
TC = couleur(CC)
If Len(TC) > 2 Then TC = "<font color=" & Chr$(34) & TC & Chr$(34) & taille & ">" Else TC = "<font color=" & Chr$(34) & "#000000" & Chr$(34) & taille & ">"
cellv = Range(MyRange).Cells(Row, col).Text
cellv = substitue(cellv, Chr(10), "<BR>")
cellv = substitue(cellv, " ", "&nbsp;")
If cellv = "" Or Range(MyRange).Cells(Row, col).Value = "0" Then cellv = Chr(38) & "nbsp" 'chr(38)="&"
'remplace cellule vide par espace
'lit les lignes suivantes si on doit faire une colone sans cadres horizontaux
If nblig > 0 Then
'test si cellule en % et supérieure à 100%
If Len(cellv) > 1 Then
temp = Left(cellv, Len(cellv) - 1)
End If
If Right(cellv, 1) = "%" _
And Val(temp) >= "100" Then
cellv = "<font color=" & Chr(34) & "#336600" & Chr(34) & "><B>" & cellv & "</B></font>"
End If
For t1 = 1 To nblig
cellx = Range(MyRange).Cells(Row + t1, col).Text
cellx = substitue(cellx, Chr(10), "<BR>")
cellx = substitue(cellx, " ", "&nbsp")
If cellx = "" Or Range(MyRange).Cells(Row + t1, col).Value = "0" Then cellx = Chr(38) & "nbsp" 'remplace cellule vide &nbsp

'test si cellule en % et supérieure à 100%
If Len(cellx) > 1 Then
temp = Left(cellx, Len(cellx) - 1)
End If
If Right(cellx, 1) = "%" _
And Val(temp) >= "100" Then
cellx = "<font color=" & Chr(34) & "#336600" & Chr(34) & "><B>" & cellx & "</B></font>"
End If

cellv = cellv & "<BR>" & cellx
Next t1
End If

HzA = Range(MyRange).Cells(Row, col).HorizontalAlignment
CellA = " Align=Right "
If HzA = -4108 Then CellA = " Align=Center "
If HzA = -4131 Then CellA = " Align=Left "
If Range(MyRange).Cells(Row, col).Font.Bold Then cellv = "<B>" & cellv & "</B>"
If Range(MyRange).Cells(Row, col).Font.Italic Then cellv = "<I>" & cellv & "</I>"
If HzA = 7 Or Range(MyRange).Cells(Row, col).MergeCells Then
ColSpan = 0
SameTitle = True
While (Range(MyRange).Cells(Row, col).HorizontalAlignment = 7) And SameTitle
If Not Range(MyRange).Columns(col).Hidden Then ColSpan = ColSpan + 1
col = col + 1
If (Len(Range(MyRange).Cells(Row, col).Text) > 0) Then
SameTitle = False
col = col - 1 'Or Range(MyRange).Cells(Row, col).MergeCells = False
End If
Wend

CellA = " ColSpan=" & ColSpan & " Align=center "
End If
MV = MV & "<TD" & BGC & CellA & ">" & TC & cellv & "</FONT></TD>"
End If
Wend
Print #1, "<TR>" & MV & "</TR>" & Chr$(13)
If nblig > 0 Then Row = Row + nblig
End If
Wend
Print #1, "</TABLE></CENTER></FONT></BODY></HTML>" & Chr$(13)
Close
End Sub
Function couleur(CC)
Select Case CC
Case 1
c = "#000000" 'black"
Case 2
c = "#FFFFFF"
Case 3
c = "#FF0000" 'Red"
Case 4
c = "#00FF00" 'green"

Case 5
c = "#0000FF"
Case 6
c = "#FFFF66" 'yellow"
Case 7
c = "#FF00FF"
Case 8
c = "#00FFFF" 'blue
Case 9
c = "#993333"
Case 10
c = "#336600"
Case 11
c = "#000066"
Case 12
c = "#666633"
Case 13
c = "#990099"
Case 14
c = "#006666"
Case 15
c = "#CCCCCC" 'gris
Case 16
c = "#666666"
Case 17
c = "#9999FF"
Case 18
c = "#990066"
Case 19
c = "#FFFFCC"
Case 20
c = "#CCFFFF"
Case 21
c = "#660066"

Case 22
c = "#FF9999"
Case 23
c = "#0066CC"
Case 24
c = "#CCCCFF"
Case 25
c = "#000066"
Case 26
c = "#FF00FF"
Case 27
c = "#FFFF00"
Case 28
c = "#00FFFF"
Case 29
c = "#660066"
Case 30
c = "#993333"
Case 31
c = "#009999"
Case 32
c = "#0000CC"
Case 33
c = "#00CCFF"
Case 34
c = "#CCFFFF"

Case 35
c = "#CCFFCC"
Case 36
c = "#FFFF99"
Case 37
c = "#99CCFF"
Case 38
c = "#FF99CC"
Case 39
c = "#CC99FF" 'Purple
Case 40
c = "#FFCC99"
Case 41
c = "#0066FF"
Case 42
c = "#00CCCC"
Case 43
c = "#99CC00"
Case 44
c = "#FFCC66"
Case 45
c = "#FF9900"
Case 46
c = "#FF6633"
Case 47
c = "#9999CC"
Case 48
c = "#999999"
Case 49
c = "#333366"
Case 50
c = "#009966"
Case 51
c = "#003300"
Case 52
c = "#333333"
Case 53
c = "#996633"
Case 54
c = "#990066"
Case 55
c = "#003399"
Case 56
c = "#003333"
End Select
couleur = c
End Function

Function calctaille(t)
Select Case t
Case 8
s = "1" '"-7"
Case 9
s = "1" '"-6"
Case 10
s = "2" '"-5"
Case 11
s = " 2" '"-4"
Case 12
s = "0" '"-3" taille par défaut correspond a 3
Case 14
s = "0" '"-2"
Case 16
s = "4" '"-1"
Case 18
s = "4" '"0"
Case 20
s = "5" '"+1"
Case 22
s = "5" '"+2"
Case 24
s = "6" '"+3"
Case 26
s = "6" '"+4"
Case 28
s = "7" '"+5"
Case 36

s = "7" '"+6"
Case 48
s = "7" '"+7"
End Select
If s <> "0" Then calctaille = " size=" & s Else calctaille = ""
End Function
Function index(Feuille, classeur)
temp = "<CENTER><TABLE bgcolor=" & Chr(34) & "#FFFFFF" & Chr(34) & " Border=1 cellspacing=0 width=" & Chr(34) & "100%" & Chr(34) & "><TR>"

For t = 1 To nbfeuilles
If Sheets(t).Visible = True Then
onglet = Sheets(t).Name
fichier = classeur & t & ".htm"
If onglet <> Feuille Then BGC = " bgcolor=" & Chr(34) & "#CCCCCC" & Chr(34) Else BGC = ""
temp = temp & "<TD align=center" & BGC & "><A href=" & Chr(34) & fichier & Chr(34) & " target=cad4>" & onglet & "</A></TD>"
End If
Next t

temp = temp & "</TR></TABLE></CENTER>" & Chr(13)
If nbfeuilles = 1 Then temp = ""
index = temp
End Function

Function substitue(c, c1, c2)'pour excel 97 en antérieur
t = 1
temp = c
While t > 0
'remplace caractère c1 par caractère c2
t = InStr(temp, c1)
If t > 0 Then
temp = Left(temp, t - 1) & c2 & Mid(temp, t + Len(c1))
End If
Wend
substitue = temp
End Function

Si vous avez des idées pour améliorer cette macro, faites moi en part. Tout le monde en profitera.

Pour créer une cellule qui clignote :
Définit un nouveau style (format/style/Flash/ajouter)
Applique le à la cellule que tu choisis, place le code suivant dans un module de feuille et lance la procédure flash en tant que auto-open. Le texte clignote entre rouge et blanc.
Dim NextTime As Date
Sub Flash()
NextTime = Now +
TimeValue("00:00:01")
With ActiveWorkbook.Styles("Flash").Font
If .ColorIndex = 2 Then .ColorIndex = 3 Else .ColorIndex = 2
End With
Application.OnTime NextTime, "Flash"
End Sub

Pour passer en plein écran
Dans la feuille de code ThisWorkbook

Private Sub Workbook_Open()
Dim cmdB As CommandBar
For Each cmdB In Application.CommandBars
cmdB.Enabled = False
Next cmdB
' si tu veux masquer en plus la barre d'état
' la barre de formule
' les onglets...
With Application
.DisplayFullScreen = True
.DisplayStatusBar = False
.DisplayFormulaBar = False
End With
With ActiveWindow
.DisplayWorkbookTabs = False
.DisplayHeadings = False
End With
'
End Sub

'puis les remettre à la fermeture du classeur

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim cmdB As CommandBar
For Each cmdB In Application.CommandBars
cmdB.Enabled = True
Next cmdB
With Application
.DisplayFullScreen = False
.DisplayStatusBar = True
.DisplayFormulaBar = True
End With
With ActiveWindow
.DisplayWorkbookTabs = True
.DisplayHeadings = True
End With
End Sub

Excel se plante à l'ouverture que faire?
supprimer le fichier c:\windows\application data\microsoft\excel\excel.xlb

Comment trier les onglets d'une feuille?
Trois méthodes au choix (trouvées sur Excel Labo) :
Sub TrieFeuilles()
Dim i As Integer
Dim J As Integer
Dim Min As Integer
Dim ModeCalcul As Integer
ModeCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
With ActiveWorkbook.Worksheets
For i = 1 To .Count - 1
Min = i
For J = i + 1 To .Count
If .Item(J).Name < .Item(Min).Name Then Min = J
Next J
If Min <> i Then .Item(Min).Move before:=Worksheets(i)
Next i
End With
Application.Calculation = ModeCalcul
Application.ScreenUpdating = True
Sheets("Feuil1").Select
End Sub

'Trie les onglets des feuilles d'un fichier excel par ordre alphabétique.
Deuxième!
Sub TriChaqueFeuilles()
Dim X As Variant
Dim i As Variant
For Each X In ActiveWorkbook.Sheets
For i = 2 To ActiveWorkbook.Sheets.Count
If Sheets(i - 1).Name > Sheets(i).Name Then
Sheets(i - 1).Move After:=Sheets(i)
End If
Next
Next
Sheets("Feuil1").Select
End Sub

Troisième
Sub TrieOnglets()
Dim F
Dim i As Long
For Each F In ActiveWorkbook.Sheets
For i = 2 To ActiveWorkbook.Sheets.Count
If UCase(Sheets(i - 1).Name) > UCase(Sheets(i).Name) Then _
Sheets(i - 1).Move After:=Sheets(i)
Next i
Next F
End Sub