Grandeur et décadence de VB6/VBA vers VB2008
Ce tutoriel est un résumé succinct de quelques différences entre les fonctions et instructions de VB6 et VB2008, et des alternatives éventuelles… agrémenté de mes commentaires… Je n’ai pas grande prétention, mais je pense que cela peut être utile à d’autres qui se mettent à programmer en VB.NET ayant une base sur VB6/VBA pour se repérer… Bien sur, ce tutoriel sera aussi le reflet de mes progrès en la matière, dont vous pouvez y apporter vos suggestions…
Types numériques entiers
Type VB2008
| Type CLR
| Nb d’octet utilisé
| Valeur par défaut
| Plage de valeur
| Code Exemple VB2008
| Type équivalent en VB6/VBA
| Code Exemple VB6
|
Boolean
| System.Boolean
| 1
| False
| False ou True
| Dim x As Boolean
Dim x As System.Boolean
| inchangé
| Dim x As Boolean
|
Byte
| System.Byte
| 1
| 0
| 0 à 255
| Dim x As Byte
Dim x As System.Byte
| inchangé
| Dim x As Byte
|
Sbyte
| System.SByte
| 1
| 0
| -128 à 127
| Dim x As SByte
Dim x As System.Sbyte
| (inconnu)
|
|
Short
| System.Int16
| 2
| 0
| -32768 à 32767
| Dim x As Short
Dim x As System.Int16
Dim x = 32767S
| Integer
| Dim x As Integer
|
UShort
| System.UInt16
| 2
| 0
| 0 à 65535
| Dim x As UShort
Dim x As System.UInt16
Dim x = 65535US
| (inconnu)
|
|
Integer
| System.Int32
| 4
| 0
| -2147483648 à 2147483647
| Dim x As Integer
Dim x As System.Int32
Dim x = 2147483647I
| Long
| Dim x As Long
|
UIteger
| System.UInt32
| 4
| 0
| 0 à 4294967295
| Dim x As UInteger
Dim x As System.UInt32
Dim x = 4294967295UI
| (inconnu)
|
|
Long
| System.Int64
| 8
| 0
| -9223372036854775807 à 9223372036854775807
| Dim x As Long
Dim x As System.Int64
Dim x = 9223372036854775807L
| (inconnu)
|
|
ULong
| System.UInt64
| 8
| 0
| 0 à 18446744073709551615
| Dim x As ULong
Dim x As System.UInt64
Dim x = 18446744073709551615UL
| (inconnu)
|
|
Types numériques décimaux
Type VB2008
| Type CLR
| Nb d’octet utilisé
| Valeur par défaut
| Plage de valeur
| Code Exemple VB2008
| Type équivalent en VB6/VBA
| Code Exemple VB6
|
Single
| System.Single
| 4
| 0
| -3.402823E38 à 3.402823E38
| Dim x As Single
Dim x As System.Single
| inchangé
| Dim x As Single
|
Double
| System.Double
| 8
| 0
| -1.79769313486231E308 à 1.79769313486247E308
| Dim x As Double
Dim x As System.Double
| inchangé
| Dim x As Double
|
(inconnu)
|
|
|
|
|
| Currency
| Dim x As Currency
|
Decimal
| System.Decimal
| 16
| 0
| -79228162514264337
593543950335 à 79228162514264337
593543950335
| Dim x As Decimal
Dim x As System.Decimal
Dim x = 79228162514264337
593543950335D
Rq : L’utilsation est difficile à cause des conversions implicites en Double dès qu’on utilise les fonctions mathématiques.
| (inconnu)
|
|
Mots-clés obsolètes
Ce tableau regroupe les mots-clés obsolètes de VB6/VBA dans VB2008, et dans le cas ou cela est possible, son équivalent natif en VB2008.
(Bien sur, parfois il est nécessaire de mettre « toute une structure » que je ne reprends pas, mais cela devrait être suffisant pour savoir vers quoi chercher…)
Pour régler la comptabilité (ou pas) avec VB6, il suffit de cocher Microsoft.VisualBasic dans le menu Propriétés de l’application (WindowsApplication1 par défaut) > Références.
Instructions de VB6/VBA
| Equivalent en VB.NET
| Instruction VB6 compatible
| Remarques
|
App.Path
| Application.StartupPath
|
|
|
As Any
| As Object
|
|
|
Atn
| Math.Atn
| X
| Comme toutes les instructions de math, commencer avec l’identificateur MATH. De même avec Sin, Cos, etc…
|
Call
| Call
| X
| Call devient falcultatif sous VB2008.
|
CallByName
| CType
Microsoft.VisualBasic.CallByName
| X
| Ctype natif de VB2008, n’est pas exactement identique à CallByName, étant un peu moins modulable que cette dernière.
L’astuce du descripteur Microsoft.VisualBasic permet de faire touner les fonctions de VB6 sans référence à celui-ci. (Astuce décrit dans l’aide de VB2008).
|
Chr(X)
| Char.ConvertFromUtf32(X)
System.Convert.ToChar(X)
| X
|
|
Circle
| Object.DrawEllipse(...)
|
| Définitivement supprimé de VB2008.
|
Currency
| -
|
| Définitivement supprimé de VB2008.
|
Date
|
|
|
|
Date$
|
|
|
|
Debug.Assert et Debug.Print
|
|
|
|
DefType
| -
|
| Définitivement supprimé de VB2008.
|
DoEvents
| Application.DoEvents()
|
|
|
Empty
| nothing
|
|
|
Eqv
|
|
| Définitivement supprimé de VB2008.
|
Gosub
| -
|
| Définitivement supprimé de VB2008.
Bizarrement, GOTO et les étiquettes sont encore pris en charge !
Return est utilisé pour retourner le résultat d’une fonction.
|
Imp
|
|
|
|
_Initialize
| _Enter
| -
|
|
Int
| Math.Floor
| X
|
|
Instancing
|
|
|
|
InStr
| ch.IndexOf(rech, 1)
| X
|
|
IsEmpty
| System.DBNull / nothing
| -
|
|
IsMissing
| System.DBNull / nothing
| -
|
|
IsNull
| System.DBNull / nothing
| -
|
|
IsObject
|
|
|
|
LCase
| texte.ToLower
| X
|
|
Left, Left$
| -
|
| Définitivement supprimé de VB2008.
|
Len
| texte.Length
| X
|
|
Let
| -
| -
| Définitivement supprimé de VB2008.
Amusant tout de même, lors de la frappe de LET, VB2008 le met en bleu (donc reconnu) et le supprime tout juste après la validation effectuée !
|
Line
| Objet.DrawLine(...)
| -
| Définitivement supprimé de VB2008.
Exemple en VB.NET
Dim objGraph As Graphics
objGraph = Me.CreateGraphics
objGraph.DrawLine(Pens.Black, X0, Y0, X1, Y1)
|
LSet
| texte.PadLeft
| X
|
|
LTrim
| texte.TrimStart
| X
|
|
Mid
| Dim texte As String = "Bonjour"
texte.Substring(2, 5)
| X
|
|
Msgbox
| MessageBox.Show
| X
|
|
Now
| Dim dte As DateTime = DateTime.Now
Dim dte As Date = Date.Now
| X
|
|
Null
|
|
|
|
On.. Gosub
| Try... Catch... Finally
|
| Définitivement supprimé de VB2008.
|
On.. GOTO
| Try... Catch... Finally
| X
|
|
On Error Resume Next
| Try... Catch... Finally
| X
|
|
Option Base
| -
|
| Définitivement supprimé de VB2008.
L’indice inférieur d’un tableau ne peut que 0 sous VB.NET.
|
Option Private
|
|
|
|
PSet
| ?
|
| Définitivement supprimé de VB2008.
De manière détournée :
objGraph.DrawLine(Pens.Black, X0, Y0, X0, Y0+1)
|
Right, Right$
| -
|
| Définitivement supprimé de VB2008.
|
Rnd
| Dim r As New Random
r.Next(min,max)
| X
|
|
Round
|
|
|
|
RSet
| texte.PadRight
| X
|
|
RTrim
| texte.TrimEnd
| X
|
|
Scale
|
|
|
|
Set
|
|
|
|
Sgn
| Math.Sign
| X
| Pour se passer de l’identificateur Math, on peut aussi mettre en tête de module la déclaration :
Imports System.Math
|
Sqr
| Math.Sqrt
| -
|
|
String()
| texte.PadRight()
| -
|
|
_Terminate
| _FormClosed
_FormClosing
| -
|
|
Time
|
|
|
|
Time$
|
|
|
|
Timer
| -
|
| En VB2008, Timer est un type.
|
Type
|
|
|
|
UCase
| texte.ToUpper
| X
|
|
Val
| CDbl
| X
|
|
Variant
| -
|
| Définitivement supprimé de VB2008.
|
VarType
| objet.GetType
| X
| Sous VB2008 compatible Microsoft.visualBasic : Information.VarType()
|
vbNewLine
| System.Environment.NewLine
System.Convert.ToChar(13)
Keys.Return
| X
|
|
vbNullString
| String.Empty
| X
|
|
vbTab
| System.Convert.ToChar(9)
| X
|
|
Wend
| While... End While
|
| Au lieu de While… Wend. Construction automatique sous VB2008.
|
Les expressions d’assignation :
i=i+1, peut être remplacé par i += 1 (à la manière de C++, java, javascript…)
i=i-1 par i -= 1
Tri
Sous VB.NET, on peut utiliser la méthode de tri intégrée très pratique et inconnu sous VB6/VBA : c’est la méthode « .SORT »
Exemple code (repris du snippet : http://www.codyx.org/snippet_tri-nombres_421.aspx#1412 ) :
Tri de nombre
Function TriNombre(ByVal TabATrier As Single()) As String
'Utilisation de la méthode Sort
Dim Result As String = String.Empty
System.Array.Sort(TabATrier)
'construction de la chaine de résultat
For Each it As Single In TabATrier
Result += it.ToString & System.Environment.NewLine
Next
Return Result
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim tab(3) As Single
tab(0) = 4
tab(1) = 3
tab(2) = 9
tab(3) = 2
MessageBox.Show(TriNombre(tab))
End Sub
|
Tri de date : voir : http://www.vbfrance.com/forum/sujet-COMMENT-TRIER-DATES_1207751.aspx
Ecriture des procédures
La structure d’une procédure est différente entre VB2008 et VB6.
Par exemple en VB6, l’événement du « click » sur un bouton était directement le nom de la procédure :
Private Sub Command1_Click()
MsgBox "ok"
End Sub
|
En VB2008, le nom de la procédure peut-être quelconque auquel on associe la liste des objets+événements l’intermédiaire de « Handles ». Différents objets et événements peuvent donc être facilement associés. Dés lors, « sender » indique l’objet appelant la procédure. Exemple :
Private Sub Nom_Procedure(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged, Button1.Click
MessageBox.Show(sender.Name)
End Sub
|
Remarque : Dans le cas où plusieurs procédures exploitent les mêmes objets+événements, c’est le classement alphanumérique sur le nom de la procédure qui donne l’ordre d’exécution.
Chronomètre : Mesure du temps d’exécution d’une partie de code
Exemple de code natif VB.NET :
Dim Stopwatch As System.Diagnostics.Stopwatch
Stopwatch = New Stopwatch
Stopwatch.Start()
...
Stopwatch.Stop()
MessageBox.Show(Stopwatch.Elapsed().TotalMilliseconds & " millisecondes")
|
Autre possibilité :
Dim start As DateTime = DateTime.Now
...
MessageBox.Show((DateTime.Now - start).TotalMilliseconds & " millisecondes")
|
Opérations sur les bits
Opération complètement inconnue sous VB6, en VB.NET on peut jouer directement sur les « bits »…
Exemple de code
Dim octet As Byte = 128 ' vaut 10000000
octet >>= 3 ' Décalage de 3 bits vers la droite soit 00010000 soit 16 en décimal
MessageBox.Show(octet)
octet <<= 2 ' Décalage de 2 bits vers la gauche 01000000
MessageBox.Show(octet)
|