c1 vb operaciones y funciones

47
El Lenguaje Visual Basic Operaciones y funciones Programación I Ing. Luis Reyes

Upload: denis-portillo

Post on 26-Jun-2015

46 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: c1 VB Operaciones y Funciones

El Lenguaje Visual BasicOperaciones y funciones

Programación I

Ing. Luis Reyes

Page 2: c1 VB Operaciones y Funciones

Objetivos

• Veremos en las siguientes diapositivas algunos conceptos sobre operaciones básica y funciones predefinas.

• Los controles para el manejo de datos.

• Tendremos una visión general del lenguaje y su utilización

• Se mostrarán algunos ejemplos utilizando la sintaxis básica de visual basic.

• Y un panorama general del acceso a una base de datos.

Todo esto será visto poco a poco durante el transcurso del resto del ciclo.

Page 3: c1 VB Operaciones y Funciones

Conceptos básicos.

• Reglas de codificación:– División de una instrucción en varias líneas. ( _ )

– Combinar varias instrucciones en una línea. ( : )

– Agregar comentarios al código. ( „ )

• Sistemas de numeración:– Decimal.

– Hexadecimal. ( &H )

– Octal. ( &O )

Page 4: c1 VB Operaciones y Funciones

Convenios de nomenclatura para variables.

• Comenzar por una letra

• Longitud menor de 256 caracteres

• Nombres descriptivos

• Comenzar con mayúscula

• No utilizar nombres claves como nombre de variables

• Comenzar con abreviatura del tipo de la variable, cuando se trata de objetos

Page 5: c1 VB Operaciones y Funciones

Tipos de Datos predefinidos

Booleana (2) Admite los valores 0 y 1, o True y False

Byte (1) Números enteros, en el rango de 0 a 255

Integer (2) % Enteros en el rango de -32768 a 32767

Long (4) & Enteros de -2147483648 a 2147483647

Single (4) ! Punto flotante, simple precisión

Double (8) # Punto flotante, doble precisión.

Currency (8) @ Entero punto decimal fijo (Típico de monedas)

String (*) $ Cadenas alfanuméricas

Date (8) Fechas

Object (4) Referencia a objetos

Variant (**) Otros tipos de datos

Page 6: c1 VB Operaciones y Funciones

Declaraciones de variables y constantes

Tipos de declaraciones de variablesDim:

Private:

Public:

Global:

Static:

• Constantes:– Const

• Error en la declaración de variables:– Dim var1, var2, ... ,varN As Integer

Page 7: c1 VB Operaciones y Funciones

Funciones de conversión de tipos de datos:

Cbool Boolean

Cbyte Byte

Ccur Currency

Cdate Date

CDbl Double

Cint Integer

CLng Long

CSng Single

CStr String

Cvar Variant

CVErr Error

!! Cuidado al tratar de convertir contenidos de cajas de texto a números y éstas están vacías ¡¡

Page 8: c1 VB Operaciones y Funciones

Operadores aritméticos:

+ Suma

- Resta

* Multiplicación

/ División decimal

\ Cociente de una división entera

Mod Resto de una división entera

^ Potencia

Page 9: c1 VB Operaciones y Funciones

Operadores Lógicos

And Función AND A=True y B=True Cualquier otro caso

Or Función OR A=True o B=True A=False y B=False

Xor Función XOR A=True y B=False A=True y B=True

A=False y B=True A=False y B=False

Eqv F. Equivalente A=True y B=True A=True y B=False

A=False y B=False A=False y B=True

Imp Implicación A=True y B=True A=True y B=False

A=False y B=True

A=False y B=False

Not Negación A=False A=True

Like Igualdad A=True A=False

Page 10: c1 VB Operaciones y Funciones

Funciones matemáticas.

Cint Devuelve la parte entera de un número con decimales

Abs Devuelve el valor absoluto de un número

Sgn Devuelve el signo de un número

Sqr Devuelve la raíz cuadrada de un número

Exp Devuelve el número elevado al exponente indicado

Log Devuelve el logaritmo natural de ese número

Timer Devuelve el tiempo (sg) que ha pasado desde las 12 de la noche

Sin Devuelve el valor del seno de un ángulo

Cos Devuelve el coseno de un ángulo

Tan Devuelve la tangente de un ángulo

Atn Devuelve un arco cuya tangente sea el número

!! Cuidado las funciones trigonométricas operan con radianes ¡¡

Page 11: c1 VB Operaciones y Funciones

Funciones trigonométricas derivadas

Secante Sec(X) = 1 / Cos(X)

Cosecante Cosec(X) = 1 / Sin(X)

Cotangente Cotan(X) = 1 / Tan(X)

Seno -1 Arcsin(X) = Atn(X / Sqr(-X * X + 1))

Coseno -1 Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)

Secante -1 Arcsec(X) = Atn(X / Sqr(X * X – 1)) + Sgn((X) – 1) * (2 * Atn(1))

Cosecante -1 Arccosec(X) = Atn(X / Sqr(X * X – 1)) + (Sgn(X) – 1) * (2 * Atn(1))

Cotangente -1 Arccotan(X) = Atn(X) + 2 * Atn(1)

!! No existe una constante que represente el número pi, pero se calcula fácilmente como 4 * Atn(1) ¡¡

Page 12: c1 VB Operaciones y Funciones

Funciones trigonométricas hiperbólicas

Seno hiperbólico HSin(X) = (Exp(X) – Exp(–X)) / 2

Coseno hiperbólico HCos(X) = (Exp(X) + Exp(–X)) / 2

Tangente hiperbólica HTan(X) = (Exp(X) – Exp(–X)) / (Exp(X) + Exp(–X))

Secante hiperbólica HSec(X) = 2 / (Exp(X) + Exp(–X))

Cosecante hiperbólica HCosec(X) = 2 / (Exp(X) – Exp(–X))

Cotangente hiperbólica HCotan(X) = (Exp(X) + Exp(–X)) / (Exp(X) – Exp(–X))

Seno hiperbólico -1 HArcsin(X) = Log(X + Sqr(X * X + 1))

Coseno hiperbólico -1 HArccos(X) = Log(X + Sqr(X * X – 1))

Tangente hiperbólica -1 HArctan(X) = Log((1 + X) / (1 – X)) / 2

Secante hiperbólica -1 HArcsec(X) = Log((Sqr(–X * X + 1) + 1) / X)

Cosecante hiperbólica -1 HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)

Cotangente hiperbólica -1 HArccotan(X) = Log((X + 1) / (X – 1)) / 2

!! Recuerda la regla de los logaritmos ¡¡

Logaritmo en base N LogN(X) = Log(X) / Log(N)

Page 13: c1 VB Operaciones y Funciones

Operaciones con fechas

Date Devuelve la fecha de hoy. Esta fecha la toma del reloj del ordenadorTime Devuelve la hora actualNow Devuelve la fecha y hora actual.WeekDay Devuelve el día de la semana (En número, 1=Domingo, 2=Lunes,...)Day Obtiene el día, a partir de una fechaMonth Obtiene el mes a partir de una fechaYear Obtiene el año a partir de una fechaHour Obtiene la hora a partir de una horaMinute Obtiene el minuto a partir de una horaSecond Obtiene el segundo a partir de una horaDateAdd Añade un intervalo de tiempo a una fechaDateDiff Obtiene el intervalo de tiempo entre dos fechasDatePart Devuelve una parte de una fecha (semana, trimestre, etc.)DateSerial Compone una fecha a partir de parámetros relativosTimeSerial Compone una hora a partir de parámetros relativosDateValue Devuelve una fecha a partir de un dato que se le parezca y

que VB pueda obtener de él una fecha válida

Page 14: c1 VB Operaciones y Funciones

Funciones de manejo de cadenas de caracteres.

Str() Val()

Left(s,l) Rigth(s,l)

Mid(s, i[, l]) Lcase()

Ucase() Len()

LenB() String(nº,carácter_repetir)

Space(l) Ltrim()

Rtrim() InStr([i, ]s1, s2[, c])

InStrRev(s1, s2[, i[, c]]) StrComp(s1, s2[, c])

Split(s[, delimitador[, contar[, comparar]]])

S: Cadena de texto

C: modo comparación texto

L: longitud

Page 15: c1 VB Operaciones y Funciones

Sentencias de control

Condicionales:

If <condición> Then

....

End If

If <condición> Then

....

Else

....

End If

If <condición> Then

....

Elseif <condición> Then

....

Elseif <condición> Then

....

Else

....

End If

Select Case varCase 1

...Case Is ( operador) xx

....Case 2

...Case xx To xx

....Case N

....Case Else

....End Select

Page 16: c1 VB Operaciones y Funciones

Ejemplo de utilización de las sentencias if else

• Determinar si un punto definido por sus coordenadas en el plano (x,y) pertenece a un círculo definido por su centro (xc,yc) y su radio

Dim x As Double, y As Double

Dim xc As Double, yc As Double, radio As Double

Dim DisCentro As Double

DisCentro = sqrt ( (x – xc)^2 + (y –yc)^2)If DisCentro <= radio Then

msgbox “El punto pertenece al círculo”

Else

msgbox “El punto no pertenece al círculo”

End If

Page 17: c1 VB Operaciones y Funciones

Ejemplo de utilización condicionales simples

• Se trata de calcular el área de un triángulo conocidos sus tres lados. ( fórmula de Heron)Sup = sqr( sp * (sp – a) * (sp – b) * (sp – c))donde sp = Semiperímetro = (a + b + c)/2

Posible problema: El triángulo no esté definidoSe dará si sp < a ó sp < b ó sp < c

Dim a As Double, b As Double, c As Double, sp As Double, sup As Doublesp = ( a + b + c ) /2 If sp > a And sp > b And sp > c Then

sup = sqr( sp * (sp – a) * (sp – b) * (sp – c))msgbox “ La superficie del triángulo es “ & sup

Elsemsgbox “ El triángulo no existe”

End If

Page 18: c1 VB Operaciones y Funciones

Ej. de utilización de if else con múltiples condiciones

• Se pretende determinar si un punto en el plano pertenece a una región rectangular paralela a los ejes cartesianos. Se conoce las coordenadas del punto y las coordenadas mínimas y máximas de la región en los dos ejes

Dim x As Double, y As Double

Dim xmax As Double, xmin As Double, ymin As Double, ymax As Double

If x >= xmin And x <= xmax And y >= ymin And y <= ymax Then

msgbox “El punto pertenece a la región”

Else

msgbox “El punto no pertenece a la región”

End If

Page 19: c1 VB Operaciones y Funciones

Ejemplo de utilización de If Else anidados

• Se trata de mostrar un mensaje indicando a banda del espectro electromagnético pertenece una determinada longitud de onda l expresado en mm

Dim l as SingleIf l < 0.3 Then

msgbox “Pertenece al Ultravioleta”ElseIf l < 0.4 Then

msgbox “Pertenece al Azul”ElseIf l < 0.5 Then

msgbox “Pertenece al Verde”ElseIf l < 0.6 Then

msgbox “Pertenece al Rojo”Else

msgbox “Pertenece al InfraRojo”End If

Page 20: c1 VB Operaciones y Funciones

Ejemplo de utilización de Select Case

• Se trata de diferenciar una operación matemática en función del contenido de una variable de tipo cadena de caracteres, para simular una calculadora con las funciones + - * /Dim Operando1 As Double, Operando2 As Double, Resultado As Double

Dim Operación As String

Select case (Operación)

Case “+” : Resultado = Operando1 + Operando2 : break;

Case “-” : Resultado = Operando1 - Operando2 : break;

Case “*” : Resultado = Operando1 * Operando2 : break;

Case “/” : Resultado = Operando1 / Operando2 : break;

Case Else : msgbox “La operación no está definida”

End Select

Page 21: c1 VB Operaciones y Funciones

Sentencias de Control

Repeticiones:

Do While <condición >....

Loop

Do Until <condición >....

Loop

Do....

Loop While <condición >

For <cond inicial > To <cond final > Step ........

Next ...

Exit Do

Exit For

For Each elemento In grupo.....

Next elemento

While <condición>....

Wend

Do....

Loop Until <condición >

Page 22: c1 VB Operaciones y Funciones

Ejemplos con las sentencias repetitivas

• Algoritmo que genere los número impares entre el 1 y el 15, mostrándolo mediante una ventana de mensajes

Dim i As Integer

For i = 1 To 15 Step 2

Msgbox i

Next i

Valores de i

1

3

5

7

9

11

13

15

Page 23: c1 VB Operaciones y Funciones

Ejemplos de sentencias repetitivas.

• Calcular la suma de los números 3 al 15

Dim i As Integer

Dim Sum As Long

„ Se inicializa la variable a 0

Sum = 0

For i = 3 To 15

Sum = Sum + i

Next i

• Calcular el producto de los números 2 al 15

Dim i As Integer

Dim Prod As Long

„ Se inicializa la variable a 1

Prod = 1

For i = 2 To 15

Prod = Prod * i

Next i

Page 24: c1 VB Operaciones y Funciones

Ejemplo de utilización de sentencias repetitivas

• Se pretende determinar si un número es primo o no

• Consideraciones prácticas: Un número será primo si no es divisible por los números inferiores a él. Hay que probar si es divisible por 2, 3, ... Hasta llegar a el propio valor o por el contrario si se puede dividir por uno de estos números inferiores no es primo (es divisible). Se utiliza la operación resto de división entera para saber si es divisible o noDim Num As Integer, i As Integer

For i = 2 To Num

If (Num Mod i) = 0 Then Exit For

Next i

If i = Num Then

msgbox “El número “ & Num & “ es primo”

Else

msgbox “El número “ & Num & “ no es primo es divisible por “ & i

End If

Page 25: c1 VB Operaciones y Funciones

Medidas repetidas. Valor más probable y Tolerancias.

• Se trata de construir el programa que determine la medida más probable de modo que se eliminen las medidas que superen el umbral de tolerancias de 2,5 veces el error cuadrático medio. El proceso se repetirá hasta que todas las medidas estén dentro de este rango

Page 26: c1 VB Operaciones y Funciones

Matrices

• Creación:– Dim matriz( N , M, ...., L ) As tipo

• Establecer límites inferior y superior.– Dim matriz( x To y, z to w) As tipo

• Conocer límites:– Lbound() , Ubound()

• Redimensionar matrices.– Redim matriz( , ..., )...

• Redimensionar preservando valores.– Redim preserve matriz ( ,.., )...

• Definir primer índice de una matriz– Option base {0 | 1 }

Page 27: c1 VB Operaciones y Funciones

Ejemplo de utilización de matrices numéricas

• Se trata de construir un algoritmo que cree una matriz de números reales, pida los valores mediante la llamada a la función inputbox, y calcule la media de los valores almacenados, y también su varianza. Estos dos datos deben ser mostrados en pantalla

Dim Num(10) As Double,Media As Double, Varianza As DoubleDim i As IntegerMedia = 0 : Varianza = 0For i=0 To 10

Num(i) = CDbl(inputbox(“Introduzca el valor “ & i ))Media = Media + Num(i)

Next iMedia = Media / 10For i = 0 To 10

Varianza = Varianza + (Media – Num(i))^2)Next iVarianza = Varianza / 10msgbox “La media = “ & Media & “ y la Varianza = “ & Varianza

Page 28: c1 VB Operaciones y Funciones

Ejemplo de utilización de matrices bidimensionales con bucles anidados

• Se trata de rellenar una matriz bidimensional de 3 filas * 3 columnas con datos procedentes de teclado

Option Base 1

Dim Mat(3,3) As Double

Dim i As Integer, j As Integer

For i = 1 To 3

For j = 1 To 3

Mat(i,j) = CDbl(inputbox “Dato(“ & i & “,” & j & “)

Next j

Next i

Page 29: c1 VB Operaciones y Funciones

Ejemplo Bucle For (Area de un polígono conocidas las coordenadas de los vértices)

• Si se dispone de las coordenadas ordenadas de los vértices de un polígono se puede calcular la superficie del mismo con la fórmula de Simpson

• Sean Xi e Yi las coordenadas cartesianas del vértice i-ésimo

Sup = 0.5 * Si ( X i+1 – Xi) * (Y i+1 + Yi)

• Nota: Téngase en cuenta que el último punto debe cerrar con el primero

Page 30: c1 VB Operaciones y Funciones

Función InputBox

• La sintaxis de la función es:InputBox(prompt[, title][, default][, xpos][, ypos][, helpfile, context])

Retorna el valor textual que el usuario ha suministrador por la caja de texto de la ventana

Se puede convertir al formato adecuado para almacenarlo en la variable correspondiente

Ejemplo:

N = Cint(InputBox("¿Cuantas distancias?", "Nº observaciones"))

Page 31: c1 VB Operaciones y Funciones

Matrices de controles

• Las matrices de controles permiten agrupar los nombres de los elementos de la interfaz gráfica de usuario en forma de matriz para poder gestionarlos más cómodamente en el código. Tiene sentido utilizar las matrices de controles cuando lo que se debe ejecutar como consecuencia de un evento sobre el mismo es similar o se puede adaptar en función del número asociado a la fila del control.

• Ejemplo: los números de una calculadora.

Se puede crear una matriz de controles

de tipo command Boton llamada Num()

de forma que el índice sea el valor numérico

del botón gráfico.

Cuando se produzca el evento click, al ser una matriz

de controles se dispondrá de dicho índice y se podrá

añadir al display el dígito seleccionado

Page 32: c1 VB Operaciones y Funciones

Carga/descarga dinámica de controles (en matrices).

• Una ventaja adicional a la hora de utilizar matrices de controles es que se puede tener un número variable de ellos cargados y/o visibles.

• Cuando se desea cargar un nuevo elemento de la matriz de controles se utiliza la instrucción Load, y para descargarlo la instrucción Unload.

• Ejemplo de carga de 10 controles de tipo TextBox cuyo primer elemento ya está definido.Dim i As IntegerFor i = 1 To 10

Load MatTextBox(i)Next i

Inconveniente: Se crea con las mismas propiedades que el primero existente.

Page 33: c1 VB Operaciones y Funciones

Matrices de controles. Otro ejemplo.

• Se trata de construir una calculadora matricial básica con las operaciones + - * y Traspuesta. Se desea que pueda manejar matrices de números compatibles para dichas operaciones, pero que pueda ser variable en cuanto al número de elementos de cada dimensión.

Page 34: c1 VB Operaciones y Funciones

Definición de nuevos tipos de datos

• Objetivo: Agrupar bajo un tipo de dato un conjunto de información que no es homogénea.

• Se define el prototipo de registro que contendrá los nombres de los campos y los tipos de los mismos.

Type <nombre_tipo ><campo > As <tipo_campo ><campo > As <tipo_campo >

End TypeDeclaración de variable

Dim Director As EmpleadoUso de un campo de la variable

Director.Nombre = “Juan Luis”

Page 35: c1 VB Operaciones y Funciones

Ejemplo de Tipos de datos definidos por usuario con matrices.• Se pretende mantener en memoria una

agenda con las notas de los alumnos de primer curso de Topografía. Se tiene que almacenar el Nombre y los Apellidos del alumno, su Dni y las calificaciones de las 7 asignaturas de primer curso, junto con la calificación media de las mismas.

• Se podrá redimensionar la matriz que contiene los datos manteniendo la información de la misma, y según se desplace por la matriz se mostrarán los datos actuales almacenándose los que se estaban mostrando anteriormente.

Page 36: c1 VB Operaciones y Funciones

Convenios para los menús

• Títulos cortos.

• Asignar tecla de método abreviado.

• Si se trata de interruptor mostrar marca de verificación.

• Mostrar (....) si hace falta intervención.

• Utilizar prefijo mnu e Item.

Page 37: c1 VB Operaciones y Funciones

Funciones y Procedimientos

• Objetivo: Modularidad.

• Función: Puede retornar resultados.

• Procedimiento: No retorna se usa con Call

• Función: [Static][Private] Function nombre ([parámetros])[As tipo]

[sentencias]

[nombre = expresión]

[Exit Function] ..

End Function

• Procedimiento:[Static][Private] Sub nombre ([parámetros])

[sentencias]

[Exit Sub] ..

End Sub

• Parámetros por valor ByVal , por referencia (defecto)

Page 38: c1 VB Operaciones y Funciones

Controles ComboBox y ListBox

• Propiedades y métodos importantes:– Text : Información mostrada como seleccionada.

– List(n) : Lista de elementos textuales.

– ListCount : Nº total de elementos de la lista.

– ListIndex: Posición seleccionada.

– AddItem: Permite añadir en tiempo de ejecución elementos.

– RemoveItem: Permite eliminar en tiempo de ejecución elementos.

– ItemData: Permite establecer un nº a cada fila de la lista.

– Evento Click. El más usado.

– Ejemplo uso: objeto.List(objeto.ListIndex)

Page 39: c1 VB Operaciones y Funciones

Control CommondDialog

• Permite: – Seleccionar nombres de archivos para Abrir y Guardar

información, Seleccionar colores y fuentes de textos así como opciones de impresión y ayuda.

• Métodos: – ShowOpen, ShowSave, ShowColor, ShowFont, ShowPrinter,

ShowHelp.

• Propiedades Ficheros:– Filter, FilterIndex, FileName y DefaultExt.

• Propiedades Color: – Flags y Color.

• Propiedades Texto: – Color, FontName, FontItalic, FontUnderLine, FontSize...

• Impresoras:– Copies, FromPage, ToPage, Orientation

Page 40: c1 VB Operaciones y Funciones

Control Data

• Permite:– Realizar una conexión con una base de datos.

– Recorrer una tabla seleccionada por medio de RecordSet.Propiedades:

Caption.

Connect. Tipo de BD.

DatabaseName. Nombre de la BD.

ReadOnly. Determina los permisos sobre los datos.

RecordsetType. Selecciona entre Tabla, dynaset..

RecordSource: Establece la tabla de la BD.

Page 41: c1 VB Operaciones y Funciones

RecordSet

• Consultar datos.– BOF (principio), EOF (fin), RecordCount y NoMatch.

• Modificar registros.– AddNew, Edit, Update, Delete.

• Moverse por la base de datos.– MoveFirst, MoveNext, MovePrevious, MoveLast.

• Encontrar datos.– FindFirst, FindLast, FindNext, FindPrevious.

Page 42: c1 VB Operaciones y Funciones

Estructura de trabajo en Bases de datos:

DBEngineWorSpaces() (prop .count, met .Append, .Delete, .Refresh)

WorkSpace.

Connections()

Groups()

Users()

DataBases().(propiedad .Count, método .Refresh)

Database

RecordSets(). -> Recordset. -> Fields

Tabledefs(). .Count-> TableDef. ->Fields, Indexes

Relations(). -> Relation. -> Fields

Querydefs(). ->QueryDef. -> Parameters, Fields

Containers(). -> Container. -> Document

Page 43: c1 VB Operaciones y Funciones

WorkSpace

• Métodos:– Close

– CreateDatabase

– CreateGroup

– CreateUser

– CreateConnection

– OpenDatabase

– Rollback

Page 44: c1 VB Operaciones y Funciones

DataBase

• Métodos:– Close

– CreateTableDef

– Execute

– NewPassword

– OpenRecordSet

Page 45: c1 VB Operaciones y Funciones

RecordSet

• Propiedades:– EOF

– Filter

– Index

– Name

– NoMatch

– RecordCount

– RecordStatus

– Sort

– Type

• Métodos:– AddNew

– Clone

– Close

– Delete

– Edit

– FindFirst

– Move

– GetRows

– MoveFirst

– NextRecordSet

– OpenRecordSet

– Seel

– Update

Page 46: c1 VB Operaciones y Funciones

Creación de una nueva base de datos.

• Conectar con un espacio de trabajo– Set Ws =DBEngine.Workspaces(0)

• Crear base de datos.– Set NewDB = Ws.CreateDatabase( nombre,lenguaje,,,)

• Crear Tabla (objeto TableDef, método CreateTableDef)

• Crear Campos tabla. (Objetos Field, método CreateField)

• Asignar campos a tabla. (método Append)

• Asignar tabla sobre base de datos. (método Append)

• ....

• Cerrar base de datos. (método Close)

Page 47: c1 VB Operaciones y Funciones

Ejemplo

Dim NewDb As Database

Dim Ws As Workspace

Set Ws = DBEngine.Workspaces(0)

Set NewDb = Ws.CreateDatabase(CommonDialog1.FileName, dbLangGeneral)

Dim NewTb As TableDef

Set NewTb = NewDb.CreateTableDef("observaciones")

ReDim campo(1 To 7) As Field

Set campo(1) = NewTb.CreateField("Número estación", dbLong)

Set campo(2) = NewTb.CreateField("Número visado", dbLong)

...

Dim i As Byte

For i = 1 To 7

NewTb.Fields.Append campo(i)

Next i

NewDb.TableDefs.Append NewTb

NewDb.Close