Solved

Rotating a list

Posted on 2013-12-28
7
198 Views
Last Modified: 2013-12-29
I have a closed loop list like

loop(1)=      19
loop(2)=      33
loop(3)=      32
loop(4)=      31
loop(5)=      6
loop(6)=      10
loop(7)=      11
loop(8)=      19

I would like to have a macro which will find the minimum number (here it is 6) and rotate the list so that the list starts with that number giving

loop(1)=      6
loop(2)=      10
loop(3)=      11
loop(4)=      19
loop(5)=      33
loop(6)=      32
loop(7)=      31
loop(8)=      6
0
Comment
Question by:Saqib Husain, Syed
  • 3
  • 3
7 Comments
 
LVL 18

Expert Comment

by:Raheman M. Abdul
ID: 39744121
Where did you store the numbers in the list?
Where do you want the output list?
0
 
LVL 80

Expert Comment

by:byundt
ID: 39744156
There may be a more elegant way of doing it, but here is code that uses an intermediate array for rewriting the list.
Sub Test()
Dim vLoop(1 To 8) As Variant, vResult As Variant
Dim i As Long
vLoop(1) = 19
vLoop(2) = 33
vLoop(3) = 32
vLoop(4) = 31
vLoop(5) = 6
vLoop(6) = 10
vLoop(7) = 11
vLoop(8) = 19
RotateLoop vLoop
For i = 1 To 8
    Debug.Print i & "    " & vLoop(i)
    Next
End Sub

Sub RotateLoop(vLoop As Variant)
Dim dMin As Double
Dim v As Variant
Dim i As Long, iMin As Long, iFirst As Long, iLast As Long, j As Long, k As Long
iFirst = LBound(vLoop)
iLast = UBound(vLoop)
ReDim v(iFirst To iLast)
dMin = Application.Min(vLoop)
iMin = Application.Match(dMin, vLoop, 0) + iFirst - 1
j = iFirst
For i = iMin To iLast
    v(j) = vLoop(i)
    j = j + 1
Next
If iMin > iFirst Then
    For i = iFirst To iMin - 1
        v(j) = vLoop(i)
        j = j + 1
    Next
End If
For i = iFirst To iLast
    vLoop(i) = v(i)
Next
End Sub

Open in new window

0
 
LVL 43

Author Comment

by:Saqib Husain, Syed
ID: 39744370
Thanks, Brad, but the result does not match the desired result. The original loop starts at 19 and ends at 19. The transformed loop should start at 6 and end at 6.

Would it be also possible to have vLoop as a collection object?
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 80

Expert Comment

by:byundt
ID: 39744834
I can add the "repeat the starting value at end of list" feature by adding two statements to the original code:
Sub RotateLoop(vLoop As Variant)
Dim dMin As Double
Dim v As Variant
Dim i As Long, iMin As Long, iFirst As Long, iLast As Long, j As Long, k As Long
iFirst = LBound(vLoop)
iLast = UBound(vLoop)
ReDim v(iFirst To iLast)
dMin = Application.Min(vLoop)
iMin = Application.Match(dMin, vLoop, 0) + iFirst - 1
j = iFirst
For i = iMin To iLast - 1
    v(j) = vLoop(i)
    j = j + 1
Next
If iMin > iFirst Then
    For i = iFirst To iMin - 1
        v(j) = vLoop(i)
        j = j + 1
    Next
End If
v(iLast) = v(iFirst)
For i = iFirst To iLast
    vLoop(i) = v(i)
Next
End Sub

Open in new window

Before I embark upon modifying the code to work with a collection, could you be more specific about which property of the objects in the collection should be minimized?
0
 
LVL 43

Author Comment

by:Saqib Husain, Syed
ID: 39744911
I am not sure about what you mean by
which property of the objects in the collection should be minimized?


I have something like

Sub Test()
Dim vLoop As New Collection
Dim vResult As Variant
Dim i As Long
vLoop.Add 19
vLoop.Add 33
vLoop.Add 32
vLoop.Add 31
vLoop.Add 6
vLoop.Add 10
vLoop.Add 11
vLoop.Add 19
RotateLoop vLoop
For i = 1 To 8
    Debug.Print i & "    " & vLoop(i)
    Next
End Sub
0
 
LVL 80

Accepted Solution

by:
byundt earned 500 total points
ID: 39744931
Collection rotating sub:
Sub RotateLoop(vLoop As Collection)
Dim dMin As Double
Dim i As Long, iMin As Long, n As Long
n = vLoop.Count
dMin = 1E+307
For i = 1 To n
    If vLoop(i) < dMin Then
        iMin = i
        dMin = vLoop(i)
    End If
Next
If iMin > 1 Then
    vLoop.Remove n
    For i = 1 To iMin
        vLoop.Add vLoop(1)
        If i < iMin Then vLoop.Remove 1
    Next
End If
End Sub

Open in new window

0
 
LVL 43

Author Closing Comment

by:Saqib Husain, Syed
ID: 39744941
Perfect, thanks
0

Featured Post

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

Suggested Solutions

What is a Form List Box? (skip if you know this) The forms List Box is the alternative to the ActiveX list box. If you are using excel 2007, you first make sure you have a developer tab (click the Orb)->"Excel Options"->Popular->"Show Developer tab…
Workbook link problems after copying tabs to a new workbook? David Miller (dlmille) Intro Have you either copied sheets to a new workbook, and after having saved and opened that workbook, you find that there are links back to the original sou…
The viewer will learn how to create a normally distributed random variable in Excel, use a normal distribution to simulate the return on an investment over a period of years, Create a Monte Carlo simulation using a normal random variable, and calcul…
This Micro Tutorial will demonstrate the scrolling table in Microsoft Excel using the INDEX function.

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now