2017-06-20 1 views
0

Die Anwendung, die ich programmiere, könnte von einem Rand profitieren, wie diejenigen, die bei der Auswahl eines Bereichs induziert werden. Ich kenne den offiziellen Microsoft-Namen für den Grenztyp nicht, aber es sieht aus wie auffällige, blinkende, zwielichtige Striche. Es würde dem Benutzer helfen, zu wissen (oder sich daran zu erinnern, nachdem er von einem Kollegen unterbrochen wurde), mit welcher Zellrange er arbeiten soll. Es wäre mir peinlich, zuzugeben, wie viel Zeit ich, glaube ich, damit verbracht habe, diese Grenze zu erforschen und zu versuchen. Es umfasst den ganzen Tag, gestern und 3 oder 4 andere fokussierte Studien.VBA-Produktion und Kontrolle für Flashy, Blinky, Shifty, Active, Bereich-Selection-Border

Eines, das mit kleinen Bereichsauswahlen ein vernünftiges Ergebnis zu produzieren scheint, ist wie folgt - aber wiederum nur kleine Auswahlen und es verursacht Excel, nach der Ausführung eine Weile "nachzudenken", bevor die Kontrolle an den Benutzer übergeben wird:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Sub test() 
    Dim i_index As Long 
    Dim Selec As Range 

    Set Selec = Application.InputBox("Select a range to make a flashy, blinky border.", _ 
           "Select Range", _ 
           Type:=8) 

    For i_index = 1 To 50 

     If Selec.Borders.LineStyle = xlLineStyleNone Or Selec.Borders.LineStyle = xlDashDot Then 
      With Selec 
       .Borders(xlEdgeLeft).LineStyle = xlDashDotDot 
       .Borders(xlEdgeRight).LineStyle = xlDashDotDot 
       .Borders(xlEdgeBottom).LineStyle = xlDashDotDot 
       .Borders(xlEdgeTop).LineStyle = xlDashDotDot 
      End With 
     ElseIf Selec.Borders.LineStyle = xlDashDotDot Then 
      With Selec 
       .Borders(xlEdgeLeft).LineStyle = xlDashDot 
       .Borders(xlEdgeRight).LineStyle = xlDashDot 
       .Borders(xlEdgeBottom).LineStyle = xlDashDot 
       .Borders(xlEdgeTop).LineStyle = xlDashDot 
      End With 
     End If 

     Sleep 500 'wait 0.5 seconds 

    Next i_index 
End Sub 

Die folgende schien eine stabilere Zeitverzögerung zur Verfügung zu stellen:

Sub SD(LenTime) 
    Dim Start 
    Start = Timer + LenTime 
    Do While Timer < Start 
     If Timer = 0 Then 
      Start = Timer + 1 
     End If 
    Loop 
End Sub 

Aber, wenn ich versuche, es mit einem Handler zu implementieren:

Public Sub CodeInst_StartFlashyBorder(ByVal Selection As Range) 
    Call StartFlashyBorder(Selection) 
End Sub 

Public Sub CodeInst_StopFlashyBorder(ByVal Selection As Range) 
    Call StopFlashyBorder(Selection) 
End Sub 

Private Sub StartFlashyBorder(ByVal Target As Range) 

    If Target.Borders.LineStyle = xlLineStyleNone Or Target.Borders.LineStyle _ 
     = xlDashDot Then 
     With Target 
      .Borders(xlEdgeLeft).LineStyle = xlDashDotDot 
      .Borders(xlEdgeRight).LineStyle = xlDashDotDot 
      .Borders(xlEdgeBottom).LineStyle = xlDashDotDot 
      .Borders(xlEdgeTop).LineStyle = xlDashDotDot 
     End With 
    ElseIf Target.Borders.LineStyle = xlDashDotDot Then 
     With Target 
      .Borders(xlEdgeLeft).LineStyle = xlDashDot 
      .Borders(xlEdgeRight).LineStyle = xlDashDot 
      .Borders(xlEdgeBottom).LineStyle = xlDashDot 
      .Borders(xlEdgeTop).LineStyle = xlDashDot 
     End With 
    End If 

    SD 0.25 

    Application.OnTime Now, "StartFlashyBorder", , True 

End Sub 

Private Sub StopFlashyBorder(ByVal Target As Range) 
    Target.Borders.LineStyle = xlLineStyleNone 
    Application.OnTime Now, "StartFlashyBorder", , False 
End Sub 

Ich bin bisher nicht in der Lage, das gewünschte Verhalten zu erzeugen, um es in mein Programm zu integrieren. Ich möchte, dass mein regulärer Code in der Lage ist, Dinge zu tun, während der Handler die auffällige, blinkende, zwielichtige Grenze produziert. Zum Beispiel versuchte der Code, den ich sein Verhalten zu überprüfen, um zu verwenden ist:

Sub TestBorder() 

    Dim r1 As Range 
    Dim r2 As Range 
    Dim r3 As Range 

    Set r1 = Application.InputBox("Select cell-range #1 and click OK.", _ 
            "Make Selection", _ 
            Type:=8) 

    Call CodeInst_StartFlashyBorder(r1) 

    Set r2 = Application.InputBox("Select cell-range #2 and click OK.", _ 
            "Make Selection", _ 
            Type:=8) 

    Call CodeInst_StartFlashyBorder(r1) 

    Set r3 = Application.InputBox("Select cell-range #3 and click OK.", _ 
            "Make Selection", _ 
            Type:=8) 

    Call CodeInst_StartFlashyBorder(r1) 

    If Application.InputBox("Enter 0 to turn off cell-range #1.", _ 
          "Enter Choice", _ 
          Type:=1) = 0 Then 
     Call CodeInst_StopFlashyBorder(r1) 
    End If 

    If Application.InputBox("Enter 0 to turn off cell-range #2.", _ 
          "Enter Choice", _ 
          Type:=1) = 0 Then 
     Call CodeInst_StopFlashyBorder(r2) 
    End If 

    If Application.InputBox("Enter 0 to turn off cell-range #3.", _ 
          "Enter Choice", _ 
          Type:=1) = 0 Then 
     Call CodeInst_StopFlashyBorder(r3) 
    End If 

End Sub 

Ich bin nicht sehr erfahren bei Codierung Handler. Ich bin fast 15 Jahre ohne Programmierkenntnisse in irgendeiner Sprache gelaufen, und Handler waren damals eine Schwäche für mich. Aber ich habe mit einem ehrgeizigen kleinen Projekt große Fortschritte gemacht. Ich möchte in der Lage sein, den auffälligen, blinkigen, zwielichtigen Rahmen für die Verwendung im Programm zu steuern. Möchte jemand mitteilen, wie er diesen Randstil in seinem Code erzeugt? Ist es in VBA möglich? Vielen Dank.

+0

Sind Sie nach einer Replikation der sogenannten „Marching Ants“ Grenze sehen Sie, wenn Sie getroffen "Strg + C"/Kopieren? –

+0

"Marching Ameisen" - Ja, dieser Name scheint genau zu sein. Ich versuche das oder etwas mit sehr ähnlichen visuellen Effekten zu erreichen. – Ben

Antwort

0

Wenn Sie Schleife wollen, würde der Code wie dieser Selec.Offset (i_index - 1)

Sub test() 
    Dim i_index As Long 
    Dim Selec As Range 

    Set Selec = Application.InputBox("Select a range to make a flashy, blinky border.", _ 
           "Select Range", _ 
           Type:=8) 

    For i_index = 1 To 50 
     With Selec.Offset(i_index - 1) 
      If .Borders.LineStyle = xlLineStyleNone Or .Borders.LineStyle = xlDashDot Then 

        .Borders(xlEdgeLeft).LineStyle = xlDashDotDot 
        .Borders(xlEdgeRight).LineStyle = xlDashDotDot 
        .Borders(xlEdgeBottom).LineStyle = xlDashDotDot 
        .Borders(xlEdgeTop).LineStyle = xlDashDotDot 

      ElseIf .Borders.LineStyle = xlDashDotDot Then 

        .Borders(xlEdgeLeft).LineStyle = xlDashDot 
        .Borders(xlEdgeRight).LineStyle = xlDashDot 
        .Borders(xlEdgeBottom).LineStyle = xlDashDot 
        .Borders(xlEdgeTop).LineStyle = xlDashDot 

      End If 
     End With 
     'Sleep 500 'wait 0.5 seconds 

    Next i_index 
End Sub