Accéder au contenu principal

Articles

Affichage des articles du septembre, 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