Cómo crear un cronograma de proyecto con "Hacer clic y arrastrar" en Excel

Comparte ahora:

El siguiente artículo muestra cómo marcar e interrogar un calendario con el ratón. 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í.Algunas palabras de explicación sobre la hoja de cálculo

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

Comparte ahora:

Los comentarios están cerrados.