El siguiente artículo muestra cómo marcar e interrogar un calendario con el ratón. 
* En el mundo real, abriríamos un formulario para leer y escribir entradas significativas en el diario en una base de datos. Este ejercicio simplemente revela la mecánica de right_clicking y encuentra los detalles de la hoja de trabajo.
Antes de comenzar, algunas palabras de explicación sobre la hoja de cálculo, un modelo de trabajo del cual se puede encontrar aquí.
El Proceso
Hacer clic en una celda dentro de la cuadrícula resaltará esa celda y cambiará su valor. Hacer clic y arrastrar resaltará un rango y cambiará sus valores. Si una celda está poblada, se borrará, de lo contrario se completará, en este caso con un “*”.
Por el contrario, un right_click es una solicitud de información de la celda seleccionada.
Básicamente, se utilizan dos eventos, junto con varios módulos.
- Hoja de trabajo_SelecciónCambio que se llama cuando se selecciona una celda o celdas.
- Hoja de trabajo_Antes de hacer clic derecho que se llama con el botón derecho del ratón.
El problema
Hacer clic derecho en una celda también constituye una selección, lo que activa SelecciónCambiar. Tendremos que dejar que ese evento siga su curso, limpiando la celda seleccionada antes de que ceda el control al AntesDerechoClick, cuando repoblaremos la celda despejada. Pero esta acción provocará la SelecciónCambiada evento de nuevo, que debe evitarse para borrarlo una vez más.
Esto lo haremos con una bandera booleana llamada blnLoading.
Los eventos
Ingrese lo siguiente en la ventana de código detrás de la hoja de trabajo (es decir, no en un módulo).
Option Explicit
Dim blnLoading As Boolean
Dim sPhase As String
Dim currCellValue As String
Dim dDate As Date
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveCell.Row > 14 And ActiveCell.Row < 25 Then
If ActiveCell.Column > 4 And ActiveCell.Column < 47 Then 'selection is valid
On Error Resume Next
currCellValue = Target.Value 'get the target value from (ByVal Target As Range)
If blnLoading = True Then 'a value of True will force an exit from this event
blnLoading = False
Exit Sub
End If
sPhase = Cells(ActiveCell.Row, 1)
If sPhase = "" Then Exit Sub
If ActiveCell = "*" Then 'if the cell is populated, clear the selected range
Call ClearRange
Call UnblockCalendar
Else
Call PopulateRange
End If
Call RedrawCells
Range("A1").Select 'revive the SelectionChange event by changing selection.
Exit Sub
End If
End If
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If currCellValue = "*" Then 'picked up by the previous event BEFORE it cleared it;
'This means this is a valid diary entry with detail.
blnLoading = True 'this will prevent the SelectionChange event (above) from running.
Target.Select
'currCell = Target.Address
'Range(currCell).Select
Target.Value = "*" 're-instate the value of the cell, since SelectionChange has cleared it
Call PopulateRange
dDate = Cells(13, ActiveCell.Column)
sPhase = Cells(ActiveCell.Row, 1)
MsgBox dDate & " - " & sPhase
Cancel = True 'suppress Excel’s standard right_click menus
End If
Range("A1").Select
blnLoading = False
End Sub
Esto se encarga de los dos eventos.
Código referenciado
Agregue los siguientes rangos de población y despoblamiento al código:
Sub ClearRange() Selection.FormulaR1C1 = "" With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With End Sub Sub PopulateRange() Selection.FormulaR1C1 = "*" With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorLight2 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With End Sub
Mantenimiento de cuadrículas
Inserte un módulo en la aplicación. Agregue el siguiente código para mantener el aspecto de la cuadrícula. Esto fue copiado de la grabadora de macros, redundancias y todo.
Option Explicit Sub UnblockCalendar() Selection.FormulaR1C1 = "" With Selection Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone Selection.Borders(xlEdgeLeft).LineStyle = xlNone Selection.Borders(xlEdgeTop).LineStyle = xlNone Selection.Borders(xlEdgeBottom).LineStyle = xlNone Selection.Borders(xlEdgeRight).LineStyle = xlNone Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone End With End Sub Sub RedrawCells() Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With End Sub
Protección contra catástrofes
Cualquier persona que trabaje mucho con Excel sabrá que las hojas de cálculo xlsm complejas pueden fallar de vez en cuando, corrompiendo el documento abierto. En más casos de los esperados, el libro de trabajo dañado no se puede recuperar mediante las rutinas de recuperación de Excel. Si no hay copias de seguridad, el trabajo realizado se pierde. Esto se puede prevenir con herramientas diseñadas para realizar Corrección de Excel.
Introducción del autor:
Felix Hooker es un experto en recuperación de datos en DataNumen, Inc., que es el líder mundial en tecnologías de recuperación de datos, incluyendo reparación de rar y productos de software de recuperación de sql. Para más información visite www.datanumen.com
