Professional Documents
Culture Documents
www.serverms.es
ObjetivodelCurso
Conceptosbsicos Creacindemacros Automatizartareas p fundamentalesdeVBExcel Conceptos
Contenidos
Conceptodemacro Creacinautomticademacro Edicindemacro Asignacinaobjetos
www.serverms.es
Contenidos
Conceptodemacro Creacinautomticademacro Edicindemacro Asignacinaobjetos EditorVBExcel
www.serverms.es
Conceptosfundamentales
Procedimientosymdulos Estructuras(IF,ForNext,DoLoop,) OPM Variables,constantes, MsgBox,Inputbox, Erroresydepuracindecdigo
www.serverms.es
Unadefinicinsencilla
Macro:esunconjuntodeinstruccionesdecdigo(programado)que permitenrealizarunatareadeterminadacomoastambinexpandir p p e incrementarlasprestacionesdeExcel. LasmacrosseescribenenlenguajedeprogramacinVBA(VisualBasic for Applications)eneleditordeVBqueincorporaExcel
www.serverms.es
www.serverms.es
Automatizacindeprocesos:
Todoslosdasllevamosacabolasmismasacciones(Centrar, Negrita,Tamaox,) Individualmentesonmuy ysencillas,pero p enconjunto j forman untediosotrabajo SOLUCIN: Macro
www.serverms.es
Creacindefuncionesamedida:
Excelincorpora+ 330funcionesquesepuedenusardeforma aisladaoanidada Ninguna g deellasseajusta j aloque q queremos q SOLUCION:Macro.Aparecerenelmendefuncionescomo unams.
www.serverms.es
www.serverms.es
Creacindeaplicacionesamedida:
Excelesutilizadoenmuchoscampospormuchosusuarios Lasmacrostepermitencreartodounprogramadesoftware LopodrnusarcualquierusuarioaunquenosepaExcel
www.serverms.es
` `
www.serverms.es
EnExcel:
Objetos:unlibroexcel,unahoja,unrango,unacelda,un men,ungrfico,unatabladinmica,uncuadrodedilogo, lasetiquetasdehojas,lascolumnas,lasfilas,etc. Propiedades:porejemplo
x Celda:alto,ancho,color,bloqueadaodesbloqueada, x Hoja:visibleuoculta,conosinlneasdedivisin,
hoja Mtodos:paraunahoja,
x activar,mover,copiaroborrar.
www.serverms.es
` ` `
EjemplosdePropiedadesVBA
x Value(valor),Color(color),Format(formato)
EjemplosdeMtodosVBA
x Copy(copiar),Protect(proteger),Delete(borrar)
www.serverms.es
NecesarioqueconozcaslabarradeherramientasVBA
Herramientas>Macros
Ver>BarrasdeHerramientas>VisualBasic
www.serverms.es
Tresformasdeaccederaleditor:
Herramientas H i t > M Macros>Editor Edit de d Visual Vi lBasic B i Desdeelbotn EditordeVisualBasicdela Barrade HerramientasVisualBasic. Mtodoabreviadodelteclado:ALT+F11
www.serverms.es
www.serverms.es
LaVentanaProyecto VBAProject:
MuestraXLS(LibrosdeCalculo)yXLA (Complementos)abiertos EnnuestrocasoVBAProject j (Libro1)
Ventana de Cdigo:
www.serverms.es
Tresmtodos:
Manualmente M l t MediantelaGrabadoradeMacros Combinacindeambas(g (grabandoymodificandoelcdigo) g )
www.serverms.es
www.serverms.es
1 1.
1. 2. 3. 4.
PreparaelEditordeVB
CreaunnuevolibroExcelygurdaloconelnombreLibro1. AbreeleditordeVisualBasicconlasteclasALT+F11. DobleclicenVBAProject(Libro1)paraverlascarpetas. DobleclicenHoja1(Hoja1)paraempezaraescribirelcdigodelamacro
2.
Escribimoslamacro
'Estamacroescribeelvalor1500enlaceldaA1 Sub MiPrimeraMacro() Range("A1").Value=1500 EndSub
www.serverms.es
Cincoformas:
Desdeelmismoeditor
x DesdeeliniciodelamacropulsarF5
DesdeExcel
x F11paravolveraExcel x Herramientas>Macros>Macro x Seleccionamoslamacro>Ejecutar
www.serverms.es
DesdeObjetos:
x Ver>BarradeHerramientas>Dibujo x Unavezcreadoelobjeto, j ,BotnDcho.>Asignar g Macro
Desdebotones:
x Ver>Barradeherramientas>Personalizar. x Comandos>Categoras>Macros x Con C el lbotn b t creado: d Botn B t d dcho.> h A Asignar i M Macro
Automticamente:
x Cadaciertotiempo,osegnlaaccindelUsuario
www.serverms.es
'Estamacroescribeel1500enlaceldaC10
Comentariosobrelamacro Siemprehadeempezarpor Enlneaycantidadilimitadas ytilesp paramacroscomplejas p j Muy Notieneefectossobrelamacro
Sub MiPrimeraMacro()
TodamacrocomienzaconSubNombreMacro() NombreMacroseutilizaraparaejecutarlamacro
www.serverms.es
EndSub
TodamacroterminaconEndSub
www.serverms.es
1 1.
1. 2. 3.
Grabarlamacro
VealmenHerramientas>Macros SeleccionalaopcinGrabarnuevamacro Seabriruncuadrodedilogocomoelquesemuestraacontinuacin.
4. 4 5. 6. 7.
www.serverms.es
Verelcdigo
www.serverms.es
`
1.
Escrita
Comolahicimos
1. 2. 3. 4. CreamosunLibroExcelllamadoLibro AbrimoseleditordemacrosconALT+F11 EnVBAProject(Libro1)hicimosdobleclicen Hoja1(Hoja1) Escribimoselcdigodelamacro. ConALT+F11accedemosaleditorde macros. Elcdigoqueescribimosmanualmentefue elsiguiente: escribeelvalor1500enlaceldaA1 Sub MiPrimeraMacro() Range("A1").Value=1500 EndSub
`
1.
Grabada
Comolahicimos
1. 2 2. 3. 4. CreamosunLibroExcelllamadoLibro1 Herramientas>Macros>Grabar macro macro Enlacelda A1escribimos1500 Herramientas>Macros>Detenergrabacin ConALT+F11accedemosaleditorde macros. Elcdigoqueescribimosmanualmentefue elsiguiente: Sub MiPrimeraMacro() 'MiPrimeraMacroMacro 'Macrograbadael02/03/2008porMSL Range("A1").Select Range( A1 ).Select ActiveCell.FormulaR1C1="1500" Range("B1").Select EndSub
2.
Elcdigodelamacro
1. 2.
2.
Elcdigodelamacro
1. 2.
www.serverms.es
`
`
Escrita
Comolahicimos
Desventaja:Requiere conocerOPM
`
`
Grabada
Comolahicimos
Ventaja: Noesnecesariosaber programar
Elcdigodelamacro
Ventaja:Cdigomseficientey sinttico
`
Elcdigodelamacro
Desventaja: Cdigohabitualmente redundanteyexcesivo
www.serverms.es
ProcedimientoSUBNombre()
General
x Selellamamanualmentedesdecdigo
Asociadoaunevento
x Ejecuta j deformaautomtica x NobreObjeto_Evento(ej:Workbook_Open)
www.serverms.es
ProcedimientoFunctionNombre(Argumentos)
Devuelvenunvalorresultadodeunafuncin Function Terminar()AsBoolean y Dim xAsByte x=MsgBox("Deseasalir?",vbOKCancel,"Salir") If x=1Then ActiveCell.Value="SI" EndIf EndFunction
www.serverms.es
LlamarfuncindesdeExcel
Insertar>Funcin>DefinidasporelUsuario FunctionCalcEdad(FechaNac AsDate) DimzFecha AsDate CalcEdad=Abs(DateDiff("YYYY",FechaNac,Date)) zFecha=DateAdd("YYYY",CalcEdad,FechaNac) IfzFecha>DateThenCalcEdad=CalcEdad 1 EndFunction
www.serverms.es
Argumentos
Declararvariable Pediraalusuarioelvalordelargumento VariableAstipo p
www.serverms.es
Dispararmacrossegnacciones(aniveldeLibro)
Guardar,abrir,cerrar,imprimir
HandeescribirseenThisWorkbook
www.serverms.es
Ejemplo:
PrivateSubWorkbook_Activate() Msgbox"Hola,Exceltesaluda EndSub SubWorkbook_Open() Workbook Open() Workbooks.OpenFilename:=Ruta EndSub
Private:macro/funcinsolosepuedellamardesdeelmismomodulo Existen20macrosdeevento
www.serverms.es
Dispararmacrossegnacciones(aniveldehoja)
Activarla,desactivarla,crearnueva
HandeescribirseenHoja1(Nombre)
www.serverms.es
Ejemplo:
PrivateSubWorksheet_Activate() MsgBox"Hola,EstasenlaHoja1" EndSub
Existen9macrosdeeventoanivelhoja
www.serverms.es
` ` `
` `
www.serverms.es
` `
www.serverms.es
1. Subdatos() DimMiVariableAsString
MiVariable=InputBox("IntroduzcaDatos","EntradadeDatos")
EndSub
www.serverms.es
EndSub
www.serverms.es
` `
Option Explicit SubEntrar_Valor DimTextoAsString InputBox(Introduzca datos") Texto=InputBox( Introduzcadatos", datos ,"Entrada Entradadedatos ) ActiveSheet.Range("A1").Value=Testo EndSub
www.serverms.es
` ` ` ` ` `
www.serverms.es
` ` `
`
Dim Var_Objeto Var Objeto AsObjeto Dim RAsRange;DimHojaAsWorkSheet Set Variable_Objeto =Objeto
SetR=ActiveSheet.Range("A1:B10);SetHoja =ActiveSheet
EjemploPractico:
www.serverms.es
SiCondicin C di i Entonces E
Sentncia1 Sentncia2 . . S i N SentnciaN
FinSi
EndIf
www.serverms.es
Ejemplo(Desarrollatumismounejemplosencillo)
www.serverms.es
Ejercicio:
www.serverms.es
SubPrecios()
Range("A1").Value=InputBox("Entrarelprecio","Entrar") If Range("A1").Value>1000Then Range("A2").Value ( ) =InputBox("Entrar ( Descuento","Entrar") ) EndIf Range("A3").Value=Range("A1").Value Range("A2").Value
EndSub
www.serverms.es
SubPrecios()
Dim Precio AsInteger Dim Descuento AsInteger Precio =0 Descuento =0 Precio=( (InputBox("Entrar p ( elp precio", ,"Entrar") ) IfPrecio >1000Then Descuento=InputBox("Entrar p ( Descuento", ,"Entrar") ) EndIf
Range("A1").Value =Precio g ( ) Range("A2").Value =Descuento Range("A3").Value =Precio Descuento
EndSub
www.serverms.es
Compara Compara celdas, celdas si soniguales, iguales las poneenAZUL Sub S b Condicional2() C di i l2() IfRange("A1").Value=Range("A2").ValueThen Range("A1").Font.Color =RGB(0,0,255) Range("A2").Font.Color =RGB(0,0,255) EndIf EndSub
www.serverms.es
Compara Compara celdas, celdas si soniguales, iguales las poneenAZUL Sub S b Condicional2() C di i l2() IfRange("A1").Value=Range("A2").ValueThen Range("A1").Font.Color =RGB(0,0,255) Range("A2").Font.Color =RGB(0,0,255) EndIf EndSub
www.serverms.es
www.serverms.es
Deberncumplirsetodaslascondiciones
www.serverms.es
DeberncumplirseUNAdelascondiciones
www.serverms.es
Nodebercumplirselacondicin
www.serverms.es
www.serverms.es
SelectCaseExpresin C valores Case l : Instrucciones. C valores Case l : Instrucciones. . CaseElse Si Sinosecumpleningunadelasanteriores EndSelect
SubEjemplo_15() www.serverms.es DimSignoAsString Di Valor1 Dim V l 1As A Integer, I t Valor2 V l 2A AsInteger, I t Total T t lA AsInteger I t Valor1=Range("A1").Value Valor2=Range("A2").Value Si Signo =R Range("B1").Value ("B1") V l Total=0 If Signo="+"Then Total=Valor1+Valor2 Endif If Signo=""Then Total=Valor1 Valor2 Endif If Signo="x"Then Total=Valor1*Valor2 Endif If Signo=":"Then Total=Valor1/Valor2 Endif ActiveCell.Range("A3").Value=Total EndSub
SubEjemplo_16() www.serverms.es DimSignoAsString Di Valor1 Dim V l 1As A Integer, I t Valor2 V l 2A AsInteger, I t Total T t lA AsInteger I t Valor1=ActiveSheet.Range("A1").Value Valor2=ActiveSheet.Range("A2").Value Si Signo =A ActiveSheet.Range("A3").Value ti Sh t R ("A3") V l SelectCasesigno Case"+" T t l=Valor1 Total V l 1+Valor2 V l 2 Case"" Total=Valor1 Valor2 Case"x" Total=Valor1*Valor2 Case":" Total=Valor1/Valor2 CaseElse Total=0 EndSelect ActiveCell.Range("A3").Value=Total EndSub
www.serverms.es
` ` `
Cuadrodedilogoconbotones Variable=MsgBox(Mensaje,Botones,Ttulo) MsgBoxMensaje, Mensaje ,Botones,Titutlo Titutlo VbOK VbCancel VbAbort VbRetry VbIgnore VbY VbYes VbNo 1 2 3 4 5 6 7 Aceptar Cancelar Anular Reintentar Ignorar S No.
` ` ` ` ` ` `
www.serverms.es
Permitenejecutarmsdeunavezlasmismassentencias
Sub S b Ejemplo_20 Ejemplo 20() Dim NotaAsInteger Dim MediaAsSingle N t =V Nota Val(InputBox("Entrar l(I tB ("E t N Nota t :" ","Entrar "E t N Nota")) t ")) ActiveSheet.Range("A1").Value=Nota Media=Media+Nota Nota=Val(InputBox("Entrar ( (" Nota:" ","Entrar " Nota")) ")) ActiveSheet.Range("A2").Value=Nota Media=Media+Nota Nota=Val(InputBox("EntrarNota:","EntrarNota")) ActiveSheet.Range("A3").Value=Nota Media=Media+Nota Media=Media/5 ActiveSheet.Range("A6").Value=Media EndSub
www.serverms.es
Serepite:
Nota=Val(InputBox("Entrarla1Nota:","EntrarNota")) ActiveSheet.Range("AX").Value ActiveSheet.Range( AX ).Value=Nota Media=Media+Nota
www.serverms.es
5funcionesfundamentales:
Para(ForNext) (For Next) DoWhile...Loop (HacerMientras) DoLoop While. Do..Loop Until (Hacer..Hasta). For Each
www.serverms.es
Para a a var a =Valor a o _Inicial c a Hasta asta Valor a o _Final a Paso aso Incremento c e e oHacer ace Sentencia1 Sentencia2 SentenciaN Siguiente For Varible =Valor_Inicial To Valor_Final Step Incremento Sentencia1 Sentencia2 SentenciaN N V i bl Next Variable
www.serverms.es
Ejemplo: je p o Sub Ejemplo_21() Dim iAsInteger Dim Total lAsInteger Dim ValorAsInteger o i=1To o 10 0 For Valor=Val(InputBox("Entrarunvalor","Entrada")) Total=Total+Valor Next i ActiveSheet.Range("A1").Value=Total End dSub
www.serverms.es
Hacer ace Mientras e t as(secu cumpla p ala aco condicin) dc ) Sentencia1 Sentencia2 SentenciaN FinHacerMientras
www.serverms.es
SubEjemplo_27() Dim NombreAsString Dim Di Ciudad Ci d dAs A String S i WorkSheets("Hoja1").Activate ActiveSheet.Range("A2").Activate N b =I Nombre InputBox("Entre tB ("E t el lNombre N b (Return (R t paraTerminar) T i ):" ","N "Nombre") b ") DoWhile Nombre<>"" Ciudad=InputBox("EntrelaCiudad:","Ciudad") Ed d=InputBox("Entre Edad I tB ("E t l laEdad Ed d:", " "Ed "Edad") d") Fecha=InputBox("EntralaFecha:","Fecha") With ActiveCell .Value Value=Nombre .Offset(0,1).Value=Ciudad EndWith ActiveCell Offset(1 0) Activate ActiveCell.Offset(1,0).Activate Nombre=InputBox("EntreelNombre(Return paraTerminar):","Nombre") Loop EndSub
www.serverms.es
Do Nombre=InputBox("EntreelNombre(Return paraTerminar):","Nombre") Ciudad=InputBox("EntrelaCiudad:","Ciudad") Edad=Val(InputBox("EntrelaEdad:","Edad")) fecha=CDate(InputBox( CDate(InputBox("Entra EntralaFecha:","Fecha")) Fecha )) With ActiveCell .Value=Nombre .Offset(0, ff ( 1).Value ) l =Ciudad d d .Offset(0,2).Value=Edad ( ,3).Value ) =fecha .Offset(0, EndWith ActiveCell.Offset(1,0).Activate Mas Datos =MsgBox("Otro vbQuestion Datos") Mas_Datos MsgBox( Otroregistro?" ? ,vbYesNo +vbQuestion, Datos ) MientrasMas_Datos =vbYes Loop While Mas_Datos =vbYes
www.serverms.es
Do Nombre=InputBox("EntreelNombre(Return paraTerminar):","Nombre") Ciudad=InputBox("EntrelaCiudad:","Ciudad") Edad=Val(InputBox("Ent relaEdad:","Edad")) ( p ( Nac :", ,"Fecha")) )) fecha=CDate(InputBox("Fecha With ActiveCell .Value=Nombre .Offset(0, Offset(0 1).Value 1) Value=Ciudad .Offset(0,2).Value=Edad .Offset(0,3).Value=fecha E dWith End Wi h ActiveCell.Offset(1,0).Activate Mas_Datos =MsgBox("Otroregistro?",vbYesNo +vbQuestion,"Entradadedatos") 'HastaqueMas_Datos seaigualavbNo Loop Until Mas_Datos =vbNo
www.serverms.es
SubEjemplo_29() g DimNuevo_Nombre AsString DimHoja AsWorksheet 'ParacadahojadelconjuntoWorkSheets For Each Hoja InWorksheets Nuevo_Nombre =InputBox("NombredelaHoja:"&Hoja.Name,"Nombrar Hojas ) Hojas") If Nuevo_Nombre <>""Then Hoja.Name =Nuevo_Nombre EndIf Next EndSub
www.serverms.es
SubEjemplo_30() g Dim RAsRange 'ParacadaceldadelrangoA1:B10delahojaactiva For Each RInActiveSheet.Range("A1:B10") R.Value =InputBox("Entrarvalorparalacelda"&R.Address,"Entradadevalores") Next EndSub
www.serverms.es
` ` `
` `
www.serverms.es
` `
AbrirEditordeVB(Alt+F11) InsertarunobjetoUserform.
Seleccionamos S l i el lLib Libro Botndrcho Insertar>Userform
www.serverms.es
Podemosdisearnuestroformularioconcontroles
Situndonosencimavemosladescripcindelcontrol
www.serverms.es
` ` ` ` ` ` ` `
Seleccionarobjetos:sirveparaseleccionarcontrolesinsertadosenelUserform Label:sirveparaponerunttuloountexto. Textbox:sirveparaqueunusuariointroduzcadatos. C b ComboBox: sirve i paraqueunusuario i elija lij unaopcin i de d unalista. li ListBox:sirveparaqueunusuariorelleneoelijavariasopcionesdeunalista. CheckBox:sirveparaqueunusuarioactiveunadeterminadafuncin. OptionButton:Seleccionarunaopcindeterminadaentrevariasposibilidades. ToggleButton:Activaodesactivaalgunafuncionalidad."Encendido"/"Apagado".
www.serverms.es
` ` ` ` ` ` ` `
Frame:sirveparaagruparelementosdeunUserform CommandButton:esunsimplebotnquenospermiteejecutaracciones. TabStrip:enunmismoUserform sepuedencreardistintassecciones. MultiPage: li enunmismo i Userform U f sepueden d creardi distintas i pginas. i ScrollBar:Paralistasconmuchoselementoselscrollbar nospermitenavegarlos. SpinButton:permiteaumentarodisminuirvalores. Image:permiteintroducirimgenesenelUserform. RefEdit:permitehacerreferenciaaunaceldadeExcel.
www.serverms.es
www.serverms.es
Establecerobjetivoycontroles
Objetivo
x CrearunUserform paraqueunusuariocompleteunosdatos personales(Nombre,EdadyFechadeNacimiento).Luegoqueel usuariocompletesusdatosalapretarunbotnlosmismosse volcarn l enunatabla bl de d Excel. E l
Loscontrolesqueutilizaremosson:
x Textbox:paraqueelusuarioingreselosdatos x Label:p paradarleelnombredelosTextbox x CommandButton:paraprocederconelingresodedatoso cancelar
www.serverms.es
EnelcdigodelAgregar:
www.serverms.es
PrivateSubagregar g g _Click() () 'definimoslasvariables DimiFila AsLong Dimws AsWorksheet Setws =Worksheets(1) 'Encuenta lasiguiente g filavaca iFila =ws.Cells(Rows.Count,1)_ .End(xlUp).Offset(1,0).Row 'Verificaqueseingreseunnombre If Me.TBNombre.Value =""Then Me.TBNombre.SetFocus MsgBox"Debeingresarunnombre" Exit Sub EndIf
'Copialosdatosalatablaexcel ws.Cells(iFila,1).Value= Me.TBNombre.Value ws.Cells(iFila,2).Value= Me.TBEdad.Value ws.Cells(iFila,3).Value= Me TBFecha Value Me.TBFecha.Value 'Limpa elformulario Me TBNombre Value ="" Me.TBNombre.Value Me.TBEdad.Value ="" Me.TBFecha.Value ="" Me TBNombre SetFocus Me.TBNombre.SetFocus EndSub
www.serverms.es
` `
Desarrollarfuncionesmacroseparadas UnanicafuncinMainquellameatodas
Sub Macro1() 'El cdigo de mi Macro1 Macro2 End Sub Sub Macro1() 'El cdigo de mi Macro1 Call Macro2 End Sub
www.serverms.es
SubSuperMacro() p () 'AsignaFormatoNumrico Selection.NumberFormat ="#,##0;[Red]#,##0 'Asigna g Bordes With Selection.Borders .LineStyle =xlContinuous .Weight g =xlThin .ColorIndex =xlAutomatic EndWith 'AsignaColordeRelleno With Selection.Interior .ColorIndex =36 .Pattern =xlSolid .PatternColorIndex =xlAutomatic EndWith EndSub
Sub Macro1() Call FormatoN Call Bordes Call Relleno End Sub
www.serverms.es
SubFormatoN() 'AsignaFormatoNumrico Selection.NumberFormat = "# #,##0;[Red]#,##0 ##0;[Red]# ##0 EndSub SubBordes() 'AsignaBordes With Selection.Borders .LineStyle =xlContinuous .Weight =xlThin .ColorIndex =xlAutomatic EndWith EndSub
SubRelleno() 'AsignaColordeRelleno With Selection.Interior .ColorIndex C l I d =36 .Pattern =xlSolid .PatternColorIndex =xlAutomatic EndWith EndSub
www.serverms.es
SubMacro() range("a2).select EndSub Sab Macro() Range("A2").Select EndSub SubMacro() IfRange("a2").value=2Then MsgBox "Mal EndSub
Modo Depuracin
Ejecuta PasoaPaso Determina mejor donde est el error
www.serverms.es
` `
Podemos convertir nuestra macroenComplemento Util para posible distribucin. Desde elEditordeVB
Archivo >Guardar como Guardar como tipo:Complemento deMicrosoftExcel(XLA)
Parainstalarlo
Herramientas >Complementos >Examinar
www.serverms.es
` `
www.serverms.es
www.serverms.es
EvitarelusodeCopiar,PegarySeleccionar
Range("C10:C12").CopyRange("E10")