Part 1 of 2 posts
Bueno, Anala,
Usted ya dijo que es bastante nueva para VBA y lo siento pero la solución es un poco detallado. Pero trataré de no asustarle.
1. Añada un botón (CommandButton) a cada una de las dos hojas. En mi caso puse el nombre de
CmdBtnInsertRows a cada uno y una etiqueta (caption) de "
Insertar Filas". Para funcionar mejor tendría que congelar su pantalla en una de las filas debajo del botón para que el usuario lo puede ver todo el tiempo. Entre las propiedades de cada botón, arregle TakeFocusOnClick a FALSE. Y probablemente, PrintObject a FALSE.
2. En los Code Modules para las hojas ponga el código que sigue.
Comentario 1: Note que en mi programación he referido a las hojas con su CodeName. No sé si su versión de Excel pondrá CodeNames de «Hoja1», «Hoja2»... o «Sheet1», «Sheet2»... En mi ejemplo asigné CodeNames de Hoja1 y Hoja2. Hoja1 siendo la hoja para el público y Hoja2 siendo la hoja que contiene los precios y otros datos que usted no desea compartir, pero realmente no importa cual es cual mientra una tiene el CodeName
Hoja1 y la otra
Hoja2. La utilización de CodeName brinda programación más resistente porque el usuario (o usted) puede cambiar el nombre de la hoja o a posición de la hoja sin afectar el CodeName. Si quiere saber más busque CodeName en VBA Help.
Comentario 2: Agregue programación para tratar de mantener sus dos hojas sincronizadas. Pero la parte clave para que el programa puede funcionar es que hay una clave que será única para cada artículo algo como número de pieza (Part Number) o número de modelo (Model Number). Algo que no aparecerá dos veces en la misma hoja pero debe estar en ambas.
Bueno, aquí está el código para las dos hojas:
<font face=Courier New><SPAN style="color:#007F00">' Worksheet Code Module for Hoja1</SPAN>
<SPAN style="color:#007F00">'¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯</SPAN>
<SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> CmdBtnInsertRows_Click()
<SPAN style="color:#007F00">'______________________________________________________________________________</SPAN>
InsertarDosVeces Me
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>
<SPAN style="color:#007F00">'¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯</SPAN>
<SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> Worksheet_Change(<SPAN style="color:#00007F">ByVal</SPAN> Target <SPAN style="color:#00007F">As</SPAN> Range)
<SPAN style="color:#007F00">'______________________________________________________________________________</SPAN>
<SPAN style="color:#007F00">' La programación aquí trata de mantener los dos listados:</SPAN>
<SPAN style="color:#007F00">' Hoja1 y Hoja 2 sincronizados.</SPAN>
<SPAN style="color:#007F00">' Si ha seleccionado más que una celda, brinque,</SPAN>
<SPAN style="color:#007F00">' o si ha seleccionado fuera de la primera columna, brinque.</SPAN>
<SPAN style="color:#007F00">' Si su valor clave está en otra columna tendrá que cambiar</SPAN>
<SPAN style="color:#007F00">' la segunda condición abajo para que corresponda a tal columna</SPAN>
<SPAN style="color:#007F00">' ej: ...Or Target.Column <> 3... si fuera la tercera columna</SPAN>
<SPAN style="color:#007F00">' La tercera condición correspondría al número de filas de cabeza</SPAN>
<SPAN style="color:#007F00">' que tiene Hoja1. O sea que cambios a celdas en columna A de</SPAN>
<SPAN style="color:#007F00">' estas filas no se debe estar copiados a Hoja2.</SPAN>
<SPAN style="color:#00007F">If</SPAN> Target.Count > 1 _
<SPAN style="color:#00007F">Or</SPAN> Target.Column > 1 _
<SPAN style="color:#00007F">Or</SPAN> Target.Row < 3 <SPAN style="color:#00007F">Then</SPAN> <SPAN style="color:#00007F">GoTo</SPAN> Jump1
<SPAN style="color:#00007F">Dim</SPAN> rngCell <SPAN style="color:#00007F">As</SPAN> Range, rngCol <SPAN style="color:#00007F">As</SPAN> Range
<SPAN style="color:#00007F">Dim</SPAN> rngQueBusco <SPAN style="color:#00007F">As</SPAN> Range, intOffsetBack <SPAN style="color:#00007F">As</SPAN> <SPAN style="color:#00007F">Integer</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> strMensaje <SPAN style="color:#00007F">As</SPAN> <SPAN style="color:#00007F">String</SPAN>
<SPAN style="color:#00007F">Set</SPAN> rngCol = Hoja2.Columns("A:A")
<SPAN style="color:#00007F">If</SPAN> Target.Offset(-1).Formula <> "" <SPAN style="color:#00007F">Then</SPAN>
<SPAN style="color:#00007F">Set</SPAN> rngQueBusco = Target.Offset(-1)
intOffsetBack = 1
<SPAN style="color:#00007F">ElseIf</SPAN> Target.Offset(1).Formula <> "" <SPAN style="color:#00007F">Then</SPAN>
<SPAN style="color:#00007F">Set</SPAN> rngQueBusco = Target.Offset(1)
intOffsetBack = -1
<SPAN style="color:#00007F">Else</SPAN>
strMensaje = "La celda arriba y la abajo están vacios. Cualquier cambio " & _
"en esta celda no estará copiado a " & Hoja2.Name & "."
MsgBox strMensaje, vbExclamation, "Celdas Vacias"
<SPAN style="color:#00007F">GoTo</SPAN> Jump1
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">If</SPAN>
<SPAN style="color:#00007F">Set</SPAN> rngCell = rngCol.Find(What:=rngQueBusco, _
After:=rngCol.Cells(1, 1), _
LookIn:=XlFindLookIn.xlValues, _
LookAt:=XlLookAt.xlWhole, _
SearchOrder:=XlSearchOrder.xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
Application.EnableEvents = <SPAN style="color:#00007F">False</SPAN>
<SPAN style="color:#00007F">If</SPAN> <SPAN style="color:#00007F">Not</SPAN> rngCell <SPAN style="color:#00007F">Is</SPAN> <SPAN style="color:#00007F">Nothing</SPAN> <SPAN style="color:#00007F">Then</SPAN> rngCell.Offset(intOffsetBack) = Target
Application.EnableEvents = <SPAN style="color:#00007F">True</SPAN>
Jump1:
<SPAN style="color:#007F00">'"""""</SPAN>
<SPAN style="color:#007F00">' si hay otra programación deseada póngala aquí</SPAN>
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>
</FONT>
<hr>
<font face=Courier New><SPAN style="color:#007F00">' Worksheet Code Module for Hoja2</SPAN>
<SPAN style="color:#007F00">'¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯</SPAN>
<SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> CmdBtnInsertRows_Click()
<SPAN style="color:#007F00">'______________________________________________________________________________</SPAN>
InsertarDosVeces Me
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>
<SPAN style="color:#007F00">'¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯</SPAN>
<SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> Worksheet_Change(<SPAN style="color:#00007F">ByVal</SPAN> Target <SPAN style="color:#00007F">As</SPAN> Range)
<SPAN style="color:#007F00">'______________________________________________________________________________</SPAN>
<SPAN style="color:#007F00">' La programación aquí trata de mantener los dos listados:</SPAN>
<SPAN style="color:#007F00">' Hoja1 y Hoja 2 sincronizados.</SPAN>
<SPAN style="color:#007F00">' Si ha seleccionado más que una celda, brinque,</SPAN>
<SPAN style="color:#007F00">' o si ha seleccionado fuera de la primera columna, brinque.</SPAN>
<SPAN style="color:#007F00">' Si su valor clave está en otra columna tendrá que cambiar</SPAN>
<SPAN style="color:#007F00">' la segunda condición abajo para que corresponda a tal columna</SPAN>
<SPAN style="color:#007F00">' ej: ...Or Target.Column <> 3... si fuera la tercera columna</SPAN>
<SPAN style="color:#007F00">' La tercera condición correspondría al número de filas de cabeza</SPAN>
<SPAN style="color:#007F00">' que tiene Hoja1. O sea que cambios a celdas en columna A de</SPAN>
<SPAN style="color:#007F00">' estas filas no se debe estar copiados a Hoja2.</SPAN>
<SPAN style="color:#00007F">If</SPAN> Target.Count > 1 _
<SPAN style="color:#00007F">Or</SPAN> Target.Column > 1 _
<SPAN style="color:#00007F">Or</SPAN> Target.Row < 3 <SPAN style="color:#00007F">Then</SPAN> <SPAN style="color:#00007F">GoTo</SPAN> Jump1
<SPAN style="color:#00007F">Dim</SPAN> rngCell <SPAN style="color:#00007F">As</SPAN> Range, rngCol <SPAN style="color:#00007F">As</SPAN> Range
<SPAN style="color:#00007F">Dim</SPAN> rngQueBusco <SPAN style="color:#00007F">As</SPAN> Range, intOffsetBack <SPAN style="color:#00007F">As</SPAN> <SPAN style="color:#00007F">Integer</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> strMensaje <SPAN style="color:#00007F">As</SPAN> <SPAN style="color:#00007F">String</SPAN>
<SPAN style="color:#00007F">Set</SPAN> rngCol = Hoja1.Columns("A:A")
<SPAN style="color:#00007F">If</SPAN> Target.Offset(-1).Formula <> "" <SPAN style="color:#00007F">Then</SPAN>
<SPAN style="color:#00007F">Set</SPAN> rngQueBusco = Target.Offset(-1)
intOffsetBack = 1
<SPAN style="color:#00007F">ElseIf</SPAN> Target.Offset(1).Formula <> "" <SPAN style="color:#00007F">Then</SPAN>
<SPAN style="color:#00007F">Set</SPAN> rngQueBusco = Target.Offset(1)
intOffsetBack = -1
<SPAN style="color:#00007F">Else</SPAN>
strMensaje = "La celda arriba y la abajo están vacios. Cualquier cambio " & _
"en esta celda no estará copiado a " & Hoja1.Name & "."
MsgBox strMensaje, vbExclamation, "Celdas Vacias"
<SPAN style="color:#00007F">GoTo</SPAN> Jump1
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">If</SPAN>
<SPAN style="color:#00007F">Set</SPAN> rngCell = rngCol.Find(What:=rngQueBusco, _
After:=rngCol.Cells(1, 1), _
LookIn:=XlFindLookIn.xlValues, _
LookAt:=XlLookAt.xlWhole, _
SearchOrder:=XlSearchOrder.xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
Application.EnableEvents = <SPAN style="color:#00007F">False</SPAN>
<SPAN style="color:#00007F">If</SPAN> <SPAN style="color:#00007F">Not</SPAN> rngCell <SPAN style="color:#00007F">Is</SPAN> <SPAN style="color:#00007F">Nothing</SPAN> <SPAN style="color:#00007F">Then</SPAN> rngCell.Offset(intOffsetBack) = Target
Application.EnableEvents = <SPAN style="color:#00007F">True</SPAN>
Jump1:
<SPAN style="color:#007F00">'"""""</SPAN>
<SPAN style="color:#007F00">' si hay otra programación deseada póngala aquí</SPAN>
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>
</FONT>
<hr>
End of Post 1