
Spreadsheet reference conversions (Excel, ...)

topchem
//Utility code for converting spreadsheet style cell references (A1, D5, ...) to numeric row/column values and vice versa
//=================================================================================================================== // Function RCToCell() // Created : 2018-07-27 // Input : Row & Column Values // Requires : // Returns : A String representing the Excel Cell reference corresponding to the input row/column // Output : // // Change history // 1.0.0 : 2018-07-27 : Initial version // Converts an R1C1 spreadsheet cell reference into an alphanumeric string //=================================================================================================================== Function/S RCToCell(Row,Column) Variable Row, Column //Row and Column values, starting at 1 Variable residue String Cell = "" do residue = mod(Column-1,26) //Find the remainder after dividing by 26 (letters) Cell = num2char(residue+65) + Cell //Convert remainder to letter using UTF-8 numbering Column = (Column - residue )/ 26 //Determine if we need another letter while (Column > 1) // keep going while we need to add letters Cell = Cell + num2str(Row) //Add the row as a string Return Cell End //=================================================================================================================== // Function CellToRC() // Created : 2018-07-27 // Input : Excel type Cell reference as string, also passing output variables by reference // Requires : // Returns : 1 on success, negative values for error // Output : Row & Column numbers corresponding to input cell are returned via reference passing // // Change history // 1.0.0 : 2018-07-27 : Initial version // Converts an Excel style spreadsheet cell reference into row and column values // This code expects upper-case letters and will give incorrect results with lower case letters // Input is matched to a pattern of letters followed by numbers // 1.0.1 : 2018-07-30 : Added input checking to make sure that non-numeric portion is uppercase letters. // Also checking that input has letters followed by numbers // Code is somewhat forgiving of extra numbers/symbols before letters and letters/symbols after numbers // Input like "Tabname!H258" will give a correct Column 8, Row 258 output (ignoring the TabName) // However, absolute cell references ($AA$15) will fail due to the symbol between the letters and numbers //=================================================================================================================== Function CellToRC(Cell,Row,Column) String Cell //The cell reference Variable &Row, &Column //Row & Column values corresponding to cell, passed by reference so we can return them String Alpha, Numeric //letter and number portions of the cell reference, in string format SplitString /E="([[:alpha:]]+)([[:digit:]]+)" Cell , Alpha, Numeric //Extract letters and numbers using grep pattern //input checking, make sure we got both letters and numbers if(V_flag != 2) Print "Malformed Cell Reference." return -1 //return error code endif Row = str2num(Numeric) //Convert row string to numeric value //Convert letter values to numbers //Treat this like a conversion from base 26, using A-Z as digits. Variable i = strlen(Alpha) //determine how many digits we have Column = 0 //Initialize the numeric value Variable Letterval //Numeric value of each letter/digit do //step through each digit backwards from the end //Find the UTF8 code for the current digit. Subtract 64 to get equivalent number value Letterval = char2num(Alpha[i-1])-64 //Convert the current letter digit into a value if(Letterval < 1 || Letterval > 26 ) //Check that it maps onto 1-26 Print "Unexpected input value. Check that letters are uppercase." return -2 //return error code endif //Multiply by the correct base 26 exponent before adding to cumulative sum Column = Column + (Letterval * (26 ^ (strlen(Alpha) - i ))) i = i - 1 //step to the next highest digit while(i > 0 ) // Print Column, Row return 1 //signal successful execution End

Forum

Support

Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More