2013-03-19 11 views
5

Pracuję nad projektem deski rozdzielczej, w którym będę miał trzy wartości: wartość minimalną, wartość maksymalną i wartość bieżącą. Wartościami minimalnymi i maksymalnymi będą punkty końcowe paska i chciałbym umieścić pole tekstowe zawierające bieżącą wartość w odpowiedniej lokalizacji wzdłuż paska. Zobacz poniżej:Czy możliwe jest dynamiczne sterowanie położeniem pola tekstowego w programie Excel 2007

Czy można to zrobić w Excelu, a jeśli tak, to w jaki sposób mogę to osiągnąć. Mam pewne doświadczenie z Visual Basic, ale nie spotkałem się z tym wcześniej.

enter image description here

Ostatecznie ja próbuje zrobić wersję Excel desce rozdzielczej pod następującym linkiem:

Link to Dashboard

+0

Czy pasek jest tylko narysowanym kształtem? –

+1

Obiekt textbox będzie mieć wartość "top" i "left", które powinieneś być w stanie użyć do kontrolowania położenia obiektu względem arkusza lub względem innego kształtu/obiektu, w zależności od tego, jak został utworzony. –

+0

W tej chwili pasek jest po prostu narysowany. W ostatecznym rozrachunku chciałbym również uczynić pasek bardziej dynamicznym. Właściwie to próbuję symulować pulpit, który uważam za przydatny. Patrz wyżej. – Mutuelinvestor

Odpowiedz

1

Podoba mi się twój pomysł, dlatego sprawdziłem, jak może wyglądać cały kod. Oto wynik:

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 

wywołać procedurę od przypadku z bezpośrednim okna dla testu, np .:

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

Takie rozwiązanie będzie działać gdziekolwiek jesteś i cokolwiek umieścić kształty nowe wymiary nich ustawione .

+0

Dzięki za odpowiedź, postaram się podążać za tym, co zrobiłeś teraz. Dzięki jeszcze raz. – Mutuelinvestor

+0

Kaz, czy zamierzałeś, aby twój kod był Funkcją lub Subadapterem? – Mutuelinvestor

+0

Procedura sub ... –

3

Włącz makro nagrywania gdy Shape-obiekt nie został wybrany. Teraz wybierz i zmień jego pozycję. Zatrzymaj nagrywanie i użyj wygenerowanego kodu.

Przydaje się mi, gdy go wypróbowałem. Mam kod IncrementTop i IncrementLeft. Możesz także bezpośrednio użyć właściwości Góra i Lewica.

Może to być pomysł, aby zmienić nazwę obiektu Shape na coś znaczącego (w polu adresu po lewej stronie pola formuły), aby kod był bardziej czytelny.

Więc dla mojego Shape o nazwie PositionIndicator:

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

Albo

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

Aby połączyć ją z wartością komórki wystarczy użyć Range("CELLADDRESS").Value2

ją stosować przy każdej zmianie wartości komórki użyj:

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 

Powodzenia

+0

Dzięki. Podoba mi się pomysł użycia funkcji nagrywania, aby zacząć od tego. Wielkie dzięki. – Mutuelinvestor

+0

używanie funkcji nagrywania jest często dobrym punktem wyjścia, gdy nie wiesz dokładnie, co robić. Sztuczka polega na tym, aby ten kod stał się przydatny do konkretnego celu! –

1

Założenie, że pasek postępu jest kształtem w arkuszu roboczym (indeks 1), a pole tekstowe to indeks kształtu 2; Następujące przeniesienie pola tekstowego wzdłuż paska postępu w oparciu o% kompletny.

Uwaga: Musi zostać wyregulowany, aby zrównoważyć część kształtu pola tekstowego znajdującego się po lewej stronie strzałki.

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 
Powiązane problemy