Accéder au contenu principal

Articles

Affichage des articles du 2009

Excel: générer du VBA avec...du VBA !

Après avoir développé une formule complexe dans la feuille de calcul, quoi de plus fastidieux que de devoir ensuite la "traduire" en Vba ? Plus maintenant, grace a cette petite routine, à exécuter depuis la fenêtre de Debug (ctrl+G): Sub RngToVba(src As Range) 'writes the VBA code to re-create the formulae in given range 'by Patrick Honorez - www.idevlop.com 'usage: from debug window, type RngToVba [L14:R14] ' or RngToVba range("L14:R14") Dim c As Range For Each c In src Debug.Print "range(""" & c.Address & """).formula = """ & _ Replace(c.Formula, """", """""") & """""" Next c End Sub

Générer du XML depuis VBA

Après avoir testé plusieurs solutions, j'ai fini par conclure que le plus simple pour générer du XML était de créer mes propres routines. Voici quelques fonctions très utiles pour générer du XML: Function fRsToXml(rs As Recordset, Optional ignorePrefix As String = "zz" , _ Optional ignoreNulls As Boolean = False ) As String 'description: Returns an XML string with all fields of the current record, ' using field names as tags. ' Field names starting with "zz" (or other special prefix) are ignored 'parameters: rs: recordset (byRef, of course) 'author: Patrick Honorez - www.idevlop.com Dim f As Field, bPrefLen As Byte Dim strResult As String bPrefLen = Len(ignorePrefix) For Each f In rs.Fields If Left(f.Name, bPrefLen) <> ignorePrefix Then 'zz fields are ignored ! If ( Not ignoreNulls) Or (ignoreNulls And Not IsNull(f.Value))

Trier une ListBox Access

Lorsqu'on a une ListBox dont la SourceType est une ValueList, comment la trier ? Réponse ci-dessous, avec possibilité de trier sur n'importe quelle colonne, en mode numérique ou alpha. Sub SortListBox(ByRef lstBox As ListBox, iCol As Integer, Optional isNum As Boolean = False) 'sorts the value list of a listbox on any column 'numerical col. can be sorted numerically or alpha 'sorting algorithm is probably not the most efficient 'Copyleft: Patrick Honorez - www.idevlop.com Dim vaItems As Variant, cols As Integer Dim i As Long, j As Long, k As Integer Dim vTemp As String, IsSwapped As Boolean Dim isSmaller As Boolean On Error GoTo 0 'Put the items in a variant array vaItems = Split(lstBox.RowSource, ";") cols = lstBox.ColumnCount Do IsSwapped = False For i = 0 To lstBox.ListCount - 2 j = i + 1 If isNum Then isSmaller = Val(vaItems(i * cols + iCol - 1)) > _ Val(vaItems(j * cols + iCol - 1)) Else isSmaller = vaItems(i * cols + iCol - 1) > _ va

Remplir une ListBox Access

Pour remplir une ListBox MS Access avec des données provenant d'un recordset, il suffit généralement de définir une rowSourceType = Table et de donner le nom de la table ou de la requête. Mais dans certains cas, il peut être préférable de fournir ces valeurs sous forme d'une ValueList. C'est le travail de la fonction ci-dessous. Sub FillList(ByRef lstBox As ListBox, strQry As String) 'fill combo with value list from recordset 'to be used when recordset is too slow to requery for sorting Dim rs As Recordset, strSrc As String, i As Integer Set rs = CurrentDb.OpenRecordset(strQry, dbOpenSnapshot) lstBox.RowSourceType = "Value list" lstBox.ColumnCount = rs.Fields.Count ReDim arSrc(rs.RecordCount * rs.Fields.Count) Do Until rs.EOF For i = 0 To rs.Fields.Count - 1 strSrc = strSrc & rs.Fields(i) & ";" Next i rs.MoveNext Loop lstBox.RowSource = Left(strSrc, Len(strSrc) - 1) End Sub

Créer des références externes dynamiques en Excel (1)

Dans des formules Excel, on a parfois besoin de se référer a une plage de cellules se trouvant dans un autre document (classeur/workbook). Exemple: on a un document "portefeuille.xls" qui se réfere au document "tauxChange.xls". Si le chemin d'acces au document externe change, la référence ne fonctionnera plus. Pour éviter ce probleme, une solution serait de pouvoir utiliser une référence "relative", qui permettrait, par exemple, de pointer vers le classeur "tauxChange.xls" se trouvant dans le meme dossier que le classeur "portefeuille.xls". Ceci permettrait d'utilliser la paire de fichiers n'importe où, pourvu qu'ils soient tous deux dans le meme dossier. Mais comment faire ? Recupérer le chemin du document en cours en C5: =CELL("filename") permet de retrouver le chemin complet du document ou il est utilisé, et me retournera: H:\test excel\[portefeuille.xls]Actifs "Actifs" étant le nom de la fe