29 votes

Fonctionnalités cachées de VBA

Quelles fonctionnalités du langage VBA sont soit peu documentées, soit tout simplement peu utilisées?

32voto

Oorang Points 3415

Cette astuce ne fonctionne que dans Access VBA, Excel et d'autres ne le permettrait pas. Mais vous pouvez faire un Module Standard cachés à partir de l'explorateur d'objets en préfixant le nom du Module avec un trait de soulignement. Le module ne sera alors visible que si vous modifiez l'objet navigateur pour afficher les objets masqués.

Cette astuce fonctionne avec les Énumérations dans tous vb6 en fonction de la version de VBA. Vous pouvez créer un caché membre d'un Enum en enserrant son nom entre parenthèses, puis préfixant par un trait de soulignement. Exemple:

Public Enum MyEnum
    meDefault = 0
    meThing1 = 1
    meThing2 = 2
    meThing3 = 3
    [_Min] = meDefault 
    [_Max] = meThing3 
End Enum

Public Function IsValidOption(ByVal myOption As MyEnum) As Boolean
    If myOption >= MyEnum.[_Min] Then IsValidOption myOption <= MyEnum.[_Max]
End Function

Dans Excel-VBA vous pouvez faire référence à des cellules en les enfermant dans les parenthèses, les crochets en évaluer commande vous permettant d'évaluer la syntaxe de la formule:

Public Sub Example()
    [A1] = "Foo"
    MsgBox [VLOOKUP(A1,A1,1,0)]
End Sub

Vous pouvez également passer des données brutes sans l'aide de MemCopy (RtlMoveMemory) en combinant LSet avec des Types Définis par l'Utilisateur de la même taille:

Public Sub Example()
    Dim b() As Byte
    b = LongToByteArray(8675309)
    MsgBox b(1)
End Sub

Private Function LongToByteArray(ByVal value As Long) As Byte()
    Dim tl As TypedLong
    Dim bl As ByteLong
    tl.value = value
    LSet bl = tl
    LongToByteArray = bl.value
End Function

Octal & Hex Littéraux sont en fait des types non signés, ces deux sortie -32768:

Public Sub Example()
    Debug.Print &H8000
    Debug.Print &O100000
End Sub

Comme mentionné, le passage d'une variable à l'intérieur de la parenthèse qu'il provoque, pour être passé ByVal:

Sub PredictTheOutput()
    Dim i&, j&, k&
    i = 10: j = i: k = i
    MySub (i)
    MySub j
    MySub k + 20
    MsgBox Join(Array(i, j, k), vbNewLine), vbQuestion, "Did You Get It Right?"
End Sub

Public Sub MySub(ByRef foo As Long)
    foo = 5
End Sub

Vous pouvez affecter une chaîne de caractères directement dans un tableau d'octets, et vice-versa:

Public Sub Example()
    Dim myString As String
    Dim myBytArr() As Byte
    myBytArr = "I am a string."
    myString = myBytArr
    MsgBox myString
End Sub

"Mid" est également un opérateur. En l'utilisant, vous remplacer certaines parties de cordes, sans VBA est notoirement lent de concaténation de chaîne:

Public Sub Example1()
    ''// This takes about 47% of time Example2 does:
    Dim myString As String
    myString = "I liek pie."
    Mid(myString, 5, 2) = "ke"
    Mid(myString, 11, 1) = "!"
    MsgBox myString
End Sub

Public Sub Example2()
    Dim myString As String
    myString = "I liek pie."
    myString = "I li" & "ke" & " pie" & "!"
    MsgBox myString
End Sub

18voto

Swanny Points 1217

Il est un aspect important, mais presque toujours manqué fonction de la Mi() déclaration. C'est là que Mi() s'affiche sur le côté gauche d'une affectation, par opposition à la Mi() fonction qui s'affiche sur le côté droit ou dans une expression.

La règle est que, si la si la chaîne de caractères n'est pas une chaîne littérale, et c'est la seule référence à la chaîne de caractères et la longueur du segment inséré correspond à la longueur du segment remplacée, la chaîne sera traitée comme mutables pour l'opération.

Qu'est-ce que cela signifie? Cela signifie que si votre construction d'un grand rapport ou une énorme liste de chaînes de caractères en une seule chaîne de valeur, l'exploitation de cette fera de votre chaîne de traitement beaucoup plus rapide.

Ici est une simple classe qui en bénéficie. Il donne à votre VBA la même StringBuilder capacité .Net est.

' Class: StringBuilder

Option Explicit

Private Const initialLength As Long = 32

Private totalLength As Long  ' Length of the buffer
Private curLength As Long    ' Length of the string value within the buffer
Private buffer As String     ' The buffer

Private Sub Class_Initialize()
  ' We set the buffer up to it's initial size and the string value ""
  totalLength = initialLength
  buffer = Space(totalLength)
  curLength = 0
End Sub

Public Sub Append(Text As String)

  Dim incLen As Long ' The length that the value will be increased by
  Dim newLen As Long ' The length of the value after being appended
  incLen = Len(Text)
  newLen = curLength + incLen

  ' Will the new value fit in the remaining free space within the current buffer
  If newLen <= totalLength Then
    ' Buffer has room so just insert the new value
    Mid(buffer, curLength + 1, incLen) = Text
  Else
    ' Buffer does not have enough room so
    ' first calculate the new buffer size by doubling until its big enough
    ' then build the new buffer
    While totalLength < newLen
      totalLength = totalLength + totalLength
    Wend
    buffer = Left(buffer, curLength) & Text & Space(totalLength - newLen)
  End If
  curLength = newLen
End Sub

Public Property Get Length() As Integer
  Length = curLength
End Property

Public Property Get Text() As String
  Text = Left(buffer, curLength)
End Property

Public Sub Clear()
  totalLength = initialLength
  buffer = Space(totalLength)
  curLength = 0
End Sub

Et voici un exemple sur la façon de l'utiliser:

  Dim i As Long
  Dim sb As StringBuilder
  Dim result As String
  Set sb = New StringBuilder
  For i = 1 to 100000
    sb.Append CStr( i)
  Next i
  result = sb.Text

15voto

mandroid Points 729

VBA lui-même semble être une fonctionnalité cachée. Les gens que je connais qui ont utilisé des produits de Bureau pour les années n'ont aucune idée c'est même une partie de la suite.

J'ai posté ceci sur plusieurs questions ici, mais l'explorateur d'Objets est mon arme secrète. Si j'ai besoin de ninja code quelque chose de réel rapide, mais je ne suis pas familier avec la dll, Objet Navigateur enregistre ma vie. Il est beaucoup plus facile d'apprendre les structures de classe de MSDN.

Les Habitants de la Fenêtre est grande pour le déboguage. Une pause dans votre code et il va vous montrer toutes les variables, leurs noms et leurs valeurs actuelles et de types à l'intérieur de l'espace de noms courant.

Et qui pourrait oublier notre bon ami Immédiate de la Fenêtre? Non seulement il est grand pour le Débogage.Imprimer sortie standard, mais vous pouvez entrer des commandes ainsi. Besoin de savoir ce que VariableX est?

?VariableX

Besoin de savoir quelle est la couleur de la cellule est?

?Application.ActiveCell.Interior.Color

En fait, toutes les fenêtres sont d'excellents outils pour être productif avec VBA.

13voto

0xA3 Points 73439

Ce n'est pas une fonctionnalité, mais une chose que j'ai mal vue tant de fois dans VBA (et VB6): des parenthèses ont été ajoutées sur les appels de méthode où cela changera la sémantique:

 Sub Foo()

    Dim str As String

    str = "Hello"

    Bar (str)
    Debug.Print str 'prints "Hello" because str is evaluated and a copy is passed

    Bar str 'or Call Bar(str)
    Debug.Print str 'prints "Hello World"

End Sub

Sub Bar(ByRef param As String)

    param = param + " World"

End Sub
 

7voto

Raj More Points 22358

Fonctionnalités cachées

  1. Bien qu'il soit "de base", vous pouvez utiliser la POO - classes et objets
  2. Vous pouvez faire des appels API

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X