Manipuler l'aide et les fichiers d'aide

Changer les fichiers d'aide VBA : news
Changer l'aide assignée : news
Appeler un fichier d'aide : application.help(HelpFile, HelpContextID) => application.Help "Xlmain8.hlp", 0
Commentaire d'aide d'une macro : application.macrooptions macro:="TaFonction", description:= "Une bien belle fonction"

Random Tips in Status Bar : news

Petite macro sur l'assistant ballon

sub test()
assistant.visible = true
with assistant.newballoon
.heading = "Please Vote.."
.text = "Who's your favorite MVP?"
.checkboxes(1).text = "Chip Pearson?"
.checkboxes(2).text = "tom Olgivy"
.checkboxes(3).text = "Rob Bovey"
.show
end with
end Sub

Désactiver l'assistant ballon, le compagnon office - la petite fenêtre d'aide flottante

Dans Office 2000, la fenêtre d'aide a la fâcheuse habitude de vouloir aider l'utilisateur en flottant en premier et en arrière plan. Pour stopper ce comportement, vous pouvez (à vos risques et périls) changer la valeur de la clé "IsFloating" de la base de registres pour 1. Cette clé devrait se trouver à l'adresse suivante de la base : HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Common\HelpViewer, vous pouvez la créer sinon.

Disable the floating help window
In Office 2000 the built-in help window has an annoying habit of trying to "help" you by floating back and forth on the screen while you work. To disable this behavior you can make a change to the Registry.
Navigate to HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Common\HelpViewer. Change the value for the key IsFloating to 1. If the key IsFloating doesn't exist you can add it your self, this is a DWORD value.

Concevoir des fichiers d'aide

"Windows Help Designer Pro". Il est pas très cher, assez petit en taille (dans les 3 Mo une fois installé) et très convivial (il est très bien noté en général). Il a encore quelques bugs.Il est très utile parce qu'il affiche, par exemple, tous les contextID des pages que l'on crée. Il intègre même des dictionnaires, éditeurs d'images (pour faire des zones sensibles) et autres. On peut le trouver à cette adresse (elle déconne parfois) : http://www.visagesoft.com/whd/whd.html
Il faut aussi récupérer le compilateur d'aide de microsoft, l'adresse se trouve aussi sur ce site, et il est gratuit (rubrique "download").

 


 

Voici quelques limites du tableur Microsoft Excel

En cherchant bien dans l'aide Excel, vous pouvez retrouvez les limites d'Excel (valables pour la version d''Excel que vous utilisez). Ci-dessous, vous trouverez quelques informations sur ces limites et sur quelques autres problèmes.

Limites du TCD : news

Limites de certaines fonctions matricielles (produitmat, determat) : news

Message d'erreur "Nombre de formats différents trop élevés"

essayez la macro Xsclean téléchargeable sur le site de MS : http://support.microsoft.com/support/downloads/LNP129.asp (deuxième lien de la liste)

Sauvegarde lente, points à vérifier

le classeur provient-il d'un classeur XL5 qui contenait des modules d'avant XL97 ? Il semble que ce truc-là ralentissait très sérieusement l'enregistrement de mon classeur Nounou (créé avec XL5, puis utilisé avec 97). Cela pourrait aller mieux en recopiant les macros dans des modules 97.Si ce phénomène se produit également sur les autres classeurs, vérifier que tu n'as pas installé Outlook (97 ou 2000), et si c'est le cas, va dans les options du journal pour décocher ce qui est relatif aux programmes Office.

Surpasser le problème du Nombre de Si Inscriptibles dans une formule

Une formule peut comprendre, si je me trompe pas au maximum 7 instructions SI.
Pour pallier à cette restriction, vous pouvez disposer certaines conditions SI dans d'autres cellules, et vous imbriquerez ensuite ces conditions dans la formule principale en faisant référence aux cellules où sont les conditions (par leur adresse ou leur nom)
Exemple:     =    si  (    A1<>""    ;    Si2    ;    Si3)

Une cellule peut contenir 1024 caractères, pas plus

Consulter l'article suivant de microsoft pour savoir comment contourner cela par l'utilisation d'une boite texte de la barre d'outils "Dessin": http://support.microsoft.com/support/kb/articles/q156/8/81.asp

Récupération de fichiers
Un moyen de récupérer ce document serait de suivre plusieurs methodes de récupération listées dans la fiche technique Q15527 disponible sur le site de Microsoft à l'adresse suivante : http://www.microsoft.com/france/support/menu/kb. Voir aussi xl_ressources.html

 


 

Les Macros Diverses, que vous trouverez dans un tableau plus bas

1 Lister les feuilles List sheets
2 Trier les feuilles Sort sheets
3 Renommer feuille sur changement de A1 Rename on range A1's change
4 Copier la colonne A en C sans doublons Copy range with no duplicates
5 Clignotement des cellules Blinking cells
6 Mettre en avant les changements de valeur Make data changes visible
7 Ne pas pouvoir fermer un formulaire avec la petite croix Prevent userform closing by black cross
8

Cellules vides remplies avec valeur au-dessus

Fill empty cells with value of the upper cell
9 forcer une saisie à l'ouverture force the user to fill cells on open
10 Effacer le presse-papiers Reset clipboard
11 Renommer une feuille avec le prese-papiers Rename sheet with clipboard contents
12 Copier un fichier File copy
13 Liste déroulante pour aller sur des feuilles Go on a sheet via un combobox
14 Colorier la cellule sélectionnée Highlight selected cell
15 Transformer une chaîne de caractères en variable array Transform a string into an array
16 Mettre chaque valeur d'une plage dans une array Put values into of a range into an array
17 Coller les adresses du fruit d'une recherche Paste the addresses containing a search results
18 Connecté ou non Connected or not
19 Supprimer les espaces en début de cellule Suppress spaces in begin of cell
20 Sauver le contenu des commentaires dans un fichier texte Save comments contents into a text file
21 Lire données d'un classeur fermé Read information from a closed workbook
22 Mémoriser position actuelle pour y revenir Memorize present position to act and go back then

Il y en a quelques autres après. There are other macros further below.

1°) Lister sur une feuille toutes les feuilles d'un classeur

dim Arr() As String
dim I As Integer, Nbsheets As Integer
Nbsheets = sheets.count
redim Arr(1 to Nbsheets)
for I = 1 to Nbsheets
   Arr(I) = sheets(I).name
next I
screenupdating = false
cells.Clear
range("A1:A" & Nbsheets) = application.transpose(Arr)
2°) Trier les feuilles

Public Sub Sortworksheets()
dim NbFeuilles,N,M
On Error Goto findeMacro
application.screenupdating = false
NbFeuilles = activeworkbook.worksheets.count
for M = 1 to NbFeuilles
    for N = M to NbFeuilles
        if UCase(worksheets(N).name) < UCase(worksheets(M).name) then
            worksheets(N).Move before:=worksheets(M)
        end if
    next N
next M
findeMacro:
end Sub

ou alors, si les feuilles sont listées dans une variable tableau :
for nElement = (LBound(tableau) + 1) to ubound(plage_nommée) worksheets(tableau(nElement)).Move after:= _ worksheets(tableau(nElement-1))
next nElement
3°) Changer le nom d'une feuille en inscrivant son nom dans une cellule prédéfinie

Private Sub Worksheet_Change(ByVal Target As Excel.range)
Nbsheets = sheets.count   if Target.address = "$A$1" then
if Target.value <> "" then   if Target.Characters.count <= 31 then
name = Target
Else
msgbox ("Ce nom est trop long")
end if   Else
msgbox ("Le vide n'est pas un nom de feuille")
end if
end if
end Sub
4°) Copie d'une plage de données (colonne A) avec extractions de doublons en colonne C

Sub Extractiondoublon()
sheets("Feuil1").select
'filtre automatique, extraction des doublons, copie en cellule A1
range("A1").select: selection.autofilter
range("A:A").AdvancedFilter Action:=xlFilterCopy, Copytorange:=range("C1"), Unique:=true
end Sub  
5°) Clignotement des cellules, de Bernard

Public enclenché As Boolean, topArrêt As Date
Sub Auto_Open()
sheets("Feuil1").Activate
Cligno
end Sub
Sub Cligno()
if Not enclenché then
topArrêt = Now + Timevalue("00:00:10")
enclenché = true
range("maPlage").Interior.ColorIndex = 2
end if
if Now >= topArrêt then
enclenché = false
Exit Sub
Else
range("maPlage").Interior.ColorIndex = 5 - range("maPlage").Interior.ColorIndex
application.OnTime Now + Timevalue("00:00:1"), "Cligno"
end if
end Sub

6 °) Make data changes visible (from Peter B.)

Private Sub Workbook_BeforeSave(ByVal saveasUI As Boolean, Cancel As Boolean)
dim s As Worksheet
dim OrigSheet As Worksheet
Set OrigSheet = activesheet
for each s In thisworkbook.worksheets
s.select
s.Usedrange.Font.Italic = false
next s
OrigSheet.Activate
end Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.range)
Target.Font.Italic = true
end Sub

 

7 °) Empêcher la fermeture d'un formulaire par l'usage de la "petite croix noire"

Il suffit d'insérer ce code dans la feuille de code du formulaire :
Private Sub Userform_QueryClose(Cancel As Integer, CloseMode As Integer)
if CloseMode = vbformControlMenu then Cancel = true
end Sub

8 °) Remplir une cellule vide avec la valeur de la cellule juste au-dessus
Sélectionner la plage concernée en commençant par la première cellule remplie et lancer la macro suivante (sélectionner une seule colonne)

Sub Test()
for each Plage In selection.Specialcells(xlCelltypeBlanks)
Plage = Plage(0)
next Plage
end Sub

Voir les messages du 23/07/1999 dans le newsgroup microsoft.public.fr.excel
intitulé "comment recopier automatiquement une cellule vers d'autres"

9 °) forcer une saisie dans des cellules particulières dès l'ouverture du classeur

Option Explicit
Sub auto_open()
application.OnKey "~", "CellMove"
application.OnKey "{Enter}", "CellMove"
end Sub
Sub cellmove()
application.MoveAfterReturn = false
dim h As String
h = activecell.address
if h = "$C$3" then: range("c8").select
if h = "$C$8" then: range("c9").select
if h = "$C$9" then: range("c15").select
if h = "$C$15" then: range("c50").select
end Sub

10°) Effacer le presse-papiers

Public declare function CloseClipboard Lib "user32" () As long
Public declare function EmptyClipboard Lib "user32" () As long
Public declare function OpenClipboard Lib "user32" (ByVal hwnd As long) As long

Sub ClipboardClear()
dim rtn As long
rtn = OpenClipboard(0&)
rtn = EmptyClipboard
rtn = CloseClipboard
end Sub

ou bien :
Sub ClearCB()
Set Dummy = New DataObject
Dummy.SetText ""
Dummy.PutInClipboard
end Sub

11°) Renommer la feuille avec le contenu du presse-papier
dim DObj As New DataObject
DObj.GetFromClipboard
activesheet.name = DObj.gettext(1)

12°) Copier un fichier
Option Explicit
Private declare function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFilename As String, ByVal lpNewFilename As String, ByVal bFailifExists As long) As long

Private Sub Command1_Click()
dim intStatusError As long
dim intRetour As long
intRetour = CopyFile(Me.Text1.Text, Me.Text2.Text, intStatusError)
end Sub

ce code permet de copier un fichier vers un fichier destination en utilisant les fonctions de windows (les API): dans le text1 on saisi le nom du fichier source et dans le text2 on saisi le nom du fichier destination par exemple 'c:\autoexec.bat' et 'c:\windows\temp\autoexec.bat'

posté dans un newsgroup vb par Stéphane Royer (un autre que moi :-))

13°) Boite déroulante pour se déplace sur une feuille
ce petit code ci-dessous est bien pratique

Private Sub ComboBox1_Change()
worksheets(ComboBox1.Text).select
end Sub

Private Sub Userform_Initialize()
dim sht As Worksheet
for each sht In activeworkbook.worksheets
ComboBox1.addItem sht.name
next sht
end Sub

14°) Surligner la cellule sélectionnée
Ce code permet de colorier la cellule sélectionnée et de rétablir sa couleur d'origine, mais il empêche de colorier les cellules (il faudrait désactiver la procédure)

Private Sub Workbook_sheetselectionChange _ (ByVal Sh As Object, ByVal Target As Excel.range)
Static OldCellIndexcolor As Integer
Static OldCell As range

if Not OldCell Is Nothing then
OldCell.Interior.ColorIndex = OldCellIndexcolor
end if

OldCellIndexcolor = Target.Interior.ColorIndex
Target.Interior.ColorIndex = 6
Set OldCell = Target
end Sub

15°) Transformer une chaîne de caractères en variable array

function MakeChararray(sString) As Variant
dim BytArr() As Byte
dim vArr() As Variant
BytArr = sString
redim vArr(1 to (ubound(BytArr) - LBound(BytArr) + 1) / 2)
j = 0
for i = LBound(BytArr) to ubound(BytArr) Step 2
j = j + 1
vArr(j) = Chr$(BytArr(i))
next i
MakeChararray = vArr
end function

Sub Tester5()
dim sStr As String
sStr = "the quick brown fox"
vStringArr = MakeChararray(sStr)
for i = 1 to ubound(vStringArr)
Debug.Print i, vStringArr(i)
next
end Sub

16°) Mettre les valeurs d'une plage dans une array

Sub test()
dim rarray As Variant
rarray = activesheet.range("A1:G1").value
for i = 1 to ubound(rarray, 2)
msgbox rarray(1, i)
next i
end Sub

La fonction Nbdims(Arr) suivante renvoie le nombre de dimensions d'une variable tableau (Laurent L.)

function Nbdims(Arr) As Integer
dim Test As Integer
On Error Resume next
do
Nbdims = Nbdims + 1
Test = ubound(Arr, Nbdims + 1)
loop Until Err
end function

Sub Test()
dim myarray(1 to 2, 1 to 4)
msgbox Nbdims(myarray)
end Sub

17°) Coller les adresses des cellules contenant votre recherche
Sub coller_adresses_recherche

Set ZoneDeSortie = sheets("Feuil3").cells(1, 1)
Set Lookuprange = sheets("Feuil2").range("A1:B20")
i = 0
with Lookuprange
Set c = .find(2, LookIn:=xlvalues)
if Not c Is Nothing then
firstaddress = c.address
ZoneDeSortie.Offset(1, 0).value = c.value
do
c.Interior.ColorIndex = 50
ZoneDeSortie.Offset(i, 0).value = c.address
Set c = .findnext(c)
i = i + 1
loop While Not c Is Nothing And c.address <> firstaddress
end if

selection.Sort Key1:=range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=false, Orientation:=xltoptoBottom

end with

end sub

18°) Etes-vous connecté ou non ? (connected or not ?)(M. Taylor)
'declare constants
Public Const INTERNET_CONNECTION_MODEM As long = &H1 Public Const INTERNET_CONNECTION_LAN As long = &H2
Public Const INTERNET_CONNECTION_PROXY As long = &H4 Public Const INTERNET_CONNECTION_MODEM_BUSY As long = &H8
Public Const INTERNET_RAS_INSTALLED As long = &H10
Public Const INTERNET_CONNECTION_OFFLINE As long = &H20 Public Const INTERNET_CONNECTION_CONFIGURED As long = &H40

'API function declaration
Public declare function InternetGetConnectedState Lib "wininet.dll" (ByVal lpdwFlags As long, ByVal dwReserved As long) As long Private

Sub cmdConnected_Click()
dim lpdwFlags As long
if InternetGetConnectedState(lpdwFlags, 0) then
msgbox "Connected"
Else
msgbox "I am here all alone"
end if
end Sub
19°) Supprimer les espaces
Sub RemoveSpaces()
dim Cell As range
for each Cell In selection
Cell.value = Trim(Cell.Text)
next Cell
end Sub
20°) Sauver les commentaires dans un fichier texte (Nick H.)
Sub writeComments()
dim mycomment As Comment, mySht As Worksheet
Open "C:\Test.txt" for Output As #1
for each mySht In worksheets
for each mycomment In worksheets(mySht.name).Comments
Print #1, "From " & mycomment.Parent.Parent.name _ & mycomment.Parent.address _ & " Comes the comment: " _ & mycomment.Text
next mycomment
next mySht
Close #1
end Sub
21°) Lire les données d'un classeur fermé
Sub GetvaluesFromClosedWB()
dim Sht As Worksheet, PathAndFilename As String, myformula As String,myvalue As String
application.screenupdating = false
Set Sht = worksheets.add
PathAndFilename = "\dokumenter\DataEx.xls"
if Dir(PathAndFilename) <> "" then
myformula = "=" & PathAndFilename & "!B2"
Sht.cells(1, 1).formula = myformula
myvalue = Sht.cells(1, 1).value
application.DisplayAlerts = false
Sht.delete
application.DisplayAlerts = true
end if
Set Sht = Nothing
application.screenupdating = true
msgbox myvalue
end Sub
 
22°) Saving And Returning To A Location

Les trois macros ci-dessousservent à garder en mémoire la sélection actuelle pour y retourner plus tard. C'est pratique si vous changez cette sélection au cours de l'exécution d'une macro et que vous voulez y retourner à la fin.

Public Sub SaveLocation(ReturnToLoc As Boolean)

Static WB As Workbook
Static WS As Worksheet
Static R As Range

If ReturnToLoc = False Then
Set WB = ActiveWorkbook
Set WS = ActiveSheet
Set R = Selection
Else
WB.Activate
WS.Activate
R.Select
End If

End Sub

To save the current location, call SetSaveLoc.

Public Sub SetSaveLoc()
SaveLocation (False)
End Sub

To return to the saved location, call GetSaveLoc.

Public Sub GetSaveLoc()
SaveLocation (True)
End Sub