Quote of the Day
Gratitude is riches. Complaint is poverty.
— Doris Day. This quote is another expression of the Benedictine philosophy.
While working on a test report for an aircraft manufacturer this week, I needed to convert a large number of number lists to strings of dashed ranges. For illustration, suppose you are given a list {1, 2, 3, 5, 6, 7, 8, 10}. Converting this list to a dashed set of ranges means generating the string "1-3, 5, 6-8, 10." Figure 1 shows another example with an optional prefix added to each number.
The need for this operation is more common than you might think. I usually see the dashed string format used on Bills of Materials (BOMs) for listing out the reference designators for specific part numbers, like resistors. A PCB BOM might have multiple 10Ω resistors with reference designators listed as "R1-R3, R5, R6-R8, R10." Normally, the schematic capture system would generate the reference designators in this format automatically, but I have worked in situations where the parts lists were in Excel and you needed to convert lists to list of dashed ranges.
Today's situation involved creating a dashed range list of the various graphs in a test report that had calibration and data charts interspersed. The customer wanted their data formatted this way and I complied – the life of a contractor.
My workbook is attached here. The VBA code is shown below.
Option Explicit ' PROGRAM: Generate Dashed Range String from Cells Containing Numbers ' AUTHOR: Mark Biegert ' FUNCTION: Given a range of cells containing numbers, this function ' will convert the numbers to dashed ranges. ' INPUTS: r range of cells containing integers ' OUTPUT: String containing dashed ranges of numbers, separated by commas ' REVISION: 1.0 ' Function DashedRange(ByVal r As Range, Optional ByVal p As String = "") As String ' Variable Definitions Dim s As String 'String I am building of integer ranges Dim cnt 'Number of consecutive integers Dim i 'Iteration variable 'Initializations s = p & r.Value2(1, 1) 'The first number is always in the list. cnt = 1 'The first number is the first in a potential sequence 'Iteration For i = 2 To r.Count If i <> r.Count Then 'We are not at the last number If r.Value2(i, 1) <> r.Value2(i - 1, 1) + 1 Then 'We have detected the end of a range If cnt = 1 Then s = s & ", " & p & r.Value2(i, 1) 'If the number is isolated, just put a comma after it and start the next potential range. Else s = s & "-" & p & r.Value2(i - 1, 1) & ", " _ & p & r.Value2(i, 1) 'The number is not isolated, I need to create a range. cnt = 1 'Restart my range length count End If Else cnt = cnt + 1 'Consecutive number. Just increment range count and move on. End If Else If r.Value2(r.Count, 1) = r.Value2(r.Count - 1, 1) + 1 Then 'We are at the last number of the input list s = s & "-" & p & r.Value2(r.Count, 1) 'The last number is part of a range, finish it off as a range. Else If cnt <> 1 Then 'A range was going on, but the last number is not consecutive. s = s & "-" & p & r.Value2(r.Count - 1, 1) & ", " _ & p & r.Value2(r.Count, 1) Else 'The last two numbers were isolated, put in string as isolated. s = s & ", " & p & r.Value2(r.Count, 1) End If End If End If Next i DashedRange = s End Function
Pingback: Using Excel to Convert a Number List to Dashed String of Ranges | Math Encounters Blog | jtveg's Blog