Come creare una pianificazione del progetto con "Click-and-Drag" in Excel

Condividi ora:

Il seguente articolo mostra come contrassegnare e interrogare un calendario con il topo. Segna e interroga un calendario con il mouse

*Nel mondo reale, apriremmo un modulo per leggere e scrivere voci di diario significative in un database. Questo esercizio rivela semplicemente i meccanismi del clic con il tasto destro e trova i dettagli dal foglio di lavoro stesso.

Prima di iniziare, alcune parole di spiegazione sul foglio di calcolo, di cui è possibile trovare un modello funzionante Qui..Qualche parola di spiegazione sul foglio di calcolo

Come funziona

Facendo clic su una cella all'interno della griglia, la evidenzierà e ne modificherà il valore. Fare clic e trascinare evidenzierà un intervallo e ne modificherà i valori. Se una cella è popolata, verrà cancellata, altrimenti verrà popolata, in questo caso da un “*”.

Un clic destro invece è una richiesta di informazioni dalla cella selezionata.

Vengono utilizzati essenzialmente due eventi, insieme a diversi moduli.

  • Foglio di lavoro_Cambia selezione che viene chiamato quando vengono selezionate una o più celle.
  • Foglio di lavoro_prima del clic destro che viene richiamato dal tasto destro del mouse.

Il problema

Fare clic con il tasto destro su una cella costituisce anche una selezione, triggering SelezioneCambia. Dovremo lasciare che l'evento faccia il suo corso, liberando la cella selezionata prima che ceda il controllo al Prima di destraClick evento, quando ripopoleremo la cella cancellata. Ma questa azione attiverà il SelezioneModificata nuovamente l'evento, che deve essere impedito di cancellarlo ancora una volta.

Lo faremo con un flag booleano chiamato blnLoading.

Gli eventi

Immettere quanto segue nella finestra del codice dietro il foglio di lavoro (cioè non in un modulo).

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

Questo si prende cura dei due eventi.

Codice di riferimento

Aggiungi i seguenti intervalli di popolamento e spopolamento al codice:

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

Manutenzione delle linee della griglia

Inserire un modulo nell'applicazione. Aggiungere il codice seguente per mantenere l'aspetto della griglia. Questo è stato copiato dal registratore di macro, ridondanze e tutto il resto.

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

Salvaguardia contro la catastrofe

Chiunque si occupi di sviluppo Excel sa che i fogli di calcolo xlsm complessi possono a volte bloccarsi, corrompendo il documento aperto. In più casi di quanto ci si potrebbe aspettare, la cartella di lavoro danneggiata non può essere recuperata dalle routine di ripristino di Excel. Se non ci sono backup, il lavoro svolto andrà perso. Questo può essere evitato con strumenti progettati per eseguire Correzione di Excel.

Introduzione dell'autore:

Felix Hooker è un esperto di recupero dati in DataNumen, Inc., che è il leader mondiale nelle tecnologie di recupero dati, tra cui riparazione rar e prodotti software di recupero SQL. Per maggiori informazioni visita www.datanumen.com

Condividi ora:

I commenti sono chiusi.