简体   繁体   中英

Group two non-adjacent columns into 2d array for Excel VBA Script

I think this question might be related to Ms Excel -> 2 columns into a 2 dimensional array but I can't quite make the connection.

I have a VBA script for filling missing missing data. I select two adjacent columns, and it finds any gaps in the second column and linearly interpolates based on (possibly irregular) spacing in the first column. For instance, I could use it on this data:

1    7
2    14
3    21
5    35
5.1    
6    42
7
8     
9    45

to get this output

1    7
2    14
3    21
5    35
5.1  35.7  <---1/10th the way between 35&42
6    42
7    43   <-- 1/3 the way between 42 & 45
8    44   <-- 2/3 the way between 42 & 45 
9    45

This is very useful for me.

My trouble is that it only works on contiguous columns. I would like to be able to select two columns that are not adjacent to each other and have it work the same way. My code starts out like this:

Dim addr As String
addr = Selection.Address

Dim nR As Long
Dim nC As Long

'Reads Selected Cells' Row and Column Information
nR = Range(addr).Rows.Count   
nC = Range(addr).Columns.Count

When I run this with contiguous columns selected, addr shows up in the Locals window with a value like "$A$2:$B$8" and nC = 2

When I run this with non -contiguous columns selected, addr shows up in the Locals window with a value like "$A$2:$A$8,$C$2:$C$8" and nC = 1.

Later on in the script, I collect the values in each column into an array. Here's how I deal with the second column, for example:

 'Creates a Column 2 (col1) array, determines cells needed to interpolate for, changes font to bold and red, and reads its values
        Dim col2() As Double
        ReDim col2(0 To nR + 1)
        i = 1
        Do Until i > nR
            If IsEmpty(Selection(i, 2)) Or Selection(i, 2) = 0 Or Selection(i, 2) = -901 Then
                Selection(i, 2).Font.Bold = True
                Selection(i, 2).Font.Color = RGB(255, 69, 0)
                col2(i) = 9999999
            Else
                col2(i) = Selection(i, 2)
            End If

            i = i + 1
            Loop

This is also busted, because even if my selection is "$A$2:$A$8,$C$2:$C$8" VBA will treat Selection(1,2) as a reference to $B$2 , not the desired $C$2 .

Anyone have a suggestion for how I can get VBA to treat non-contiguous selection the way it treats contiguous?

You're dealing with "disjoint ranges." Use the Areas collection, eg, as described here . The first column should be in Selection.Areas(1) and the second column should be in Selection.Areas(2) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM