2013-03-19 2 views
5

dynamisch zu steuern Ich arbeite an einem Dashboard-Projekt, wo ich drei Werte haben: Min Wert, Max Wert und aktuellen Wert. Die Min- und Max-Werte sind die Endpunkte einer Leiste und ich möchte ein Textfeld mit dem aktuellen Wert an der entsprechenden Stelle entlang der Leiste platzieren. Siehe unten:Ist es möglich, die Position einer Textbox in Excel 2007

Ist es möglich, dies in Excel zu tun, und wenn ja, wie würde ich das erreichen? Ich habe etwas Erfahrung mit Visual Basic, aber ich bin nicht auf dieses vorher gestoßen.

enter image description here

Letztlich versuche ich eine Excel-Version des Armaturenbretts unter folgendem Link zu tun:

Link to Dashboard

+0

Ist die Bar nur eine gezeichnete Form? –

+1

Ein Textbox-Objekt hat einen "oberen" und "linken" Wert, mit denen Sie die Position des Objekts relativ zum Arbeitsblatt oder relativ zu einer anderen Form/einem anderen Objekt steuern können, je nachdem, wie es erstellt wurde. –

+0

Gerade jetzt ist die Bar nur eine gezeichnete Form. Letztendlich möchte ich die Bar auch dynamischer gestalten. Ich versuche tatsächlich, ein Dashboard zu simulieren, das ich nützlich finde. Siehe oben. – Mutuelinvestor

Antwort

1

Ich mag Ihre Idee daher habe ich überprüft, wie der vollständige Code aussieht. Hier ist das Ergebnis:

Sub SolutionShape(currentVal) 

Dim shpBar As Shape, shpCurrent As Shape 

'let's assume we have only two shapes on the Activesheet 
Set shpBar = ActiveSheet.Shapes(1) 
Set shpCurrent = ActiveSheet.Shapes(2) 

Dim barMin As Double, barMax As Double 
    barMin = 0.51    'both values could be taken from sheet 
    barMax = 6.75 

'let's do it visualy complicated this time :) 
With shpCurrent 
    .Left = (-.Width/2 + shpBar.Left) + _ 
     (((currentVal - barMin)/(barMax - barMin)) * shpBar.Width) 

    **'EDITED- adding information about current value:** 
    .TextFrame.Characters.Text = currentVal 
End With 

End Sub 

Rufen Sie die Prozedur aus Falle von Direktfenster für Test, zB .:

SolutionShape 0.51  'go to beginning 
SolutionShape 6.75  'go to end 

Diese Lösung funktioniert, wo immer Sie Formen legen und was auch immer neue Dimensionen von ihnen eingestellten .

+0

Danke für die Antwort, ich werde versuchen zu folgen, was du gerade getan hast. Danke noch einmal. – Mutuelinvestor

+0

Kaz, beabsichtigtest du, dass dein Code eine Funktion oder ein Sub ist? – Mutuelinvestor

+0

Sub-Prozedur ... –

3

Schalten Sie die Makroaufzeichnung, wenn das Shape-Objekt nicht ausgewählt ist. Wählen Sie es jetzt und ändern Sie seine Position. Stoppen Sie die Aufzeichnung und verwenden Sie den generierten Code.

Es sieht nützlich aus, wenn ich es versuchte. Ich habe einen IncrementTop- und IncrementLeft-Code. Sie können auch die Eigenschaften Top und Left direkt verwenden.

Es könnte eine Idee sein, den Namen des Shape-Objekts in etwas aussagekräftiges zu ändern (in der Adressbox links von der Formel-Box), damit Ihr Code lesbarer wird.

Also für meine Form PositionIndicator genannt:

ActiveSheet.Shapes("PositionIndicator").Left = 250 

Oder

ActiveSheet.Shapes("PositionIndicator").Left = _ 
    ActiveSheet.Shapes("PositionIndicator").Left + 5 

Um es auf einen Zellwert zu verknüpfen verwenden nur Range("CELLADDRESS").Value2

es Sie die Zellen Werte ändern sich jedes Mal anwenden zu können verwenden:

Private Sub Worksheet_Change(ByVal Target As Range) 
    'Here your script to check if the change concerns one of your input cells and then run the code to change the location of the Shape-object 
End Sub 

Viel Glück

+0

Danke. Ich mag die Idee, die Record-Funktion zu nutzen, um damit anzufangen. Danke vielmals. – Mutuelinvestor

+0

mit der Aufnahme-Funktion ist sehr oft ein guter Ausgangspunkt, wenn Sie nicht genau wissen, was zu tun ist. Der Trick danach ist, diesen Code in einen nützlichen für Ihren genauen Zweck zu verwandeln! –

1

Angenommen, der Fortschrittsbalken ist eine Form in Ihrem Arbeitsblatt (Index 1) und Textfeld ist Shape Index 2; Im Folgenden wird das Textfeld entlang des Fortschrittsbalkens basierend auf% abgeschlossen verschoben.

Hinweis: Es muss angepasst werden, um den Teil der Textboxform, der sich links von der Pfeilspitze befindet, zu versetzen.

Option Explicit 
Public Sub movebox() 

    Dim textbox As Shape, progbar As Shape 
    Dim ws As Worksheet 
    Dim stp As Integer, endp As Integer 
    Dim tbdyn As Integer 
    Dim mn As Double, mx As Double, actper As Double, cur As Double 
    Dim admn As Double, admx As Double 

    Set ws = Sheets("sheet1") 
    Set progbar = ws.Shapes(1) 
    Set textbox = ws.Shapes(2) 

'// Far left of progress bar position 
    stp = progbar.Left 
'// Far right of progress bar position 
    endp = (progbar.Width + stp) 

'// Adjust for starting at 0.51 
'// You could adjust mn,mx and cur to take the values 
'// from the appropriate cells on the spreadsheet 
    mn = 0.51 
    mx = 6.07 
    admn = 0 
    admx = 6.07 - mn 
    cur = 4 
'// Calculate percentage complete 
    actper = cur/admx 
'// Apply percentage to progress bar 
    tbdyn = actper * endp 
'// Move the textox appropriately 
    textbox.Left = tbdyn 

End Sub 
Verwandte Themen