简体   繁体   English

excel-设置/迭代动态范围

[英]excel - set/iterate dynamic range

EDIT....Boss threw me a curveball; 编辑……老板把我扔了个弯线球;

i'd like to pull out values for several ranges of data in excel. 我想在Excel中提取多个数据范围的值。 The ranges are defined by date. 范围由日期定义。

sDate     variable    aDate           result
1/2/2012  totalN      1/3/2012        9     
1/2/2012  Nitrate     1/4/2012        ND
1/8/2012  totalN      1/10/2012       7.2
1/9/2012  EC          1/10/2012       8
1/9/2012  totalN      1/12/2012       8.4
1/9/2012  Nitrate     1/12/2012       ND

so, for the above, I'd like to pull variable, aDate & result of each unique sDate-variable combination. 因此,对于上述情况,我想获取每个唯一sDate-variable组合的变量,aDate和结果。 I have a set output .xls that would need to be populated, in the following format: 我有一个需要按照以下格式填充的输出.xls:

date     TriCHL    aDate     DiCHL    aDate     totalN    aDate     Nitrate    aDate     BEN    aDate     EC    aDate
1/2/2012 -         -         -        -         9         1/3/2012  ND         1/4/2012  -      -         -     -
1/8/2012 -         -         -        -         7.2       1/10/2012 -          -         -      -         -     -
1/9/2012 -         -         -        -         8.4       1/12/2012 ND         1/12/2012 -      -         8     1/10/2012

VBA would be OK, filling an array with unique values, then looping over the array and selecting from the entire range, then extracting values?? VBA可以,用唯一值填充数组,然后遍历数组并从整个范围中选择,然后提取值?

I'm lost 我迷路了

thanks for any help! 谢谢你的帮助!

Edit 编辑

Here's my solution; 这是我的解决方案; may not be elegant, but it's functional 可能不优雅,但实用

Sub ProcessData()

Dim sRng As Range       'starting position of SAMPDATE colrow of input data from lab    ***static***
Dim endsRng As Range    'end SAMPDATE colrow of input data from lab
Dim Rng As Range        'total range of SAMPDATE colrow of input data from lab
Dim row As Object       'row object for input data iteration
Dim sDate As Range      'starting colrow of unique sample dates on output sheet         ***static***
Dim endsDate As Range   'end colrow of unique sample dates on output sheet
Dim totalrng As Range   'total range of unique sample dates on output sheet
Dim datad As String     'sample date on output sheet
Dim datav As String     'chemical variable name on output sheet
Dim i, j As Integer     'used for iterating the output matrix
Dim finalr As String    'final result values from the input lab data
Dim finald As String    'final anadate values from the input lab data

'lets get the last row of the input data
Sheets("data").Select
Set sRng = Sheets("data").Range("f2")
sRng.Select
Do
    ActiveCell.Offset(1, 0).Select
Loop Until IsEmpty(ActiveCell.Value)
Set endsRng = ActiveCell.Offset(-1, 0)

'lets set the total range of the input data as Rng
Set Rng = Sheets("data").Range(sRng.Address & ":" & endsRng.Address)

For Each row In Rng.Rows
    'this is an attempt at being flexible
    If row.Offset(0, 2).Value Like "*1,1-Dichloroethene*" Then
        row.Offset(0, 2).Value = "1,1-Dichloroethylene"
    ElseIf row.Offset(0, 2).Value Like "*cis-1,2-Dichloroethene*" Then
        row.Offset(0, 2).Value = "cis-1,2-Dichloroethylene"
    ElseIf row.Offset(0, 2).Value Like "*Methylene chloride*" Then
        row.Offset(0, 2).Value = "Dichloromethane"
    ElseIf row.Offset(0, 2).Value Like "*Cyanide*" Then
        row.Offset(0, 2).Value = "Free Cyanide"
    ElseIf row.Offset(0, 2).Value Like "*Chlorobenzene*" Then
        row.Offset(0, 2).Value = "Monochlorobenzene"
    ElseIf row.Offset(0, 2).Value Like "*1,4-Dichlorobenzene*" Then
        row.Offset(0, 2).Value = "para-Dichlorobenzene"
    ElseIf row.Offset(0, 2).Value Like "*Tetrachloroethene*" Then
        row.Offset(0, 2).Value = "Tetrachloroethylene"
    ElseIf row.Offset(0, 2).Value Like "*Antimony*" Then
        row.Offset(0, 2).Value = "Total Antimony"
    ElseIf row.Offset(0, 2).Value Like "*Fluoride*" Then
        row.Offset(0, 2).Value = "Total Fluoride"
    ElseIf row.Offset(0, 2).Value Like "*Arsenic*" Then
        row.Offset(0, 2).Value = "Total Arsenic"
    ElseIf row.Offset(0, 2).Value Like "*Barium*" Then
        row.Offset(0, 2).Value = "Total Barium"
    ElseIf row.Offset(0, 2).Value Like "*Beryllium*" Then
        row.Offset(0, 2).Value = "Total Beryllium"
    ElseIf row.Offset(0, 2).Value Like "*Cadmium*" Then
        row.Offset(0, 2).Value = "Total Cadmium"
    ElseIf row.Offset(0, 2).Value Like "*Chromium*" Then
        row.Offset(0, 2).Value = "Total Chromium"
    ElseIf row.Offset(0, 2).Value Like "*Lead*" Then
        row.Offset(0, 2).Value = "Total Lead (as Pb)"
    ElseIf row.Offset(0, 2).Value Like "*Nickel*" Then
        row.Offset(0, 2).Value = "Total Nickel"
    ElseIf row.Offset(0, 2).Value Like "*Selenium*" Then
        row.Offset(0, 2).Value = "Total Selenium (Se)"
    ElseIf row.Offset(0, 2).Value Like "*Thallium*" Then
        row.Offset(0, 2).Value = "Total Thallium"
    ElseIf row.Offset(0, 2).Value Like "*Mercury*" Then
        row.Offset(0, 2).Value = "Total Mercury as Hg"
    ElseIf row.Offset(0, 2).Value Like "*Nitrogen, Total*" Then
        row.Offset(0, 2).Value = "Total Nitrogen"
    ElseIf row.Offset(0, 2).Value Like "*Xylenes, Total*" Then
        row.Offset(0, 2).Value = "Total Xylenes"
    ElseIf row.Offset(0, 2).Value Like "*trans-1,2-Dichloroethene*" Then
        row.Offset(0, 2).Value = "trans-1,2-Dichloroethylene"
    ElseIf row.Offset(0, 2).Value Like "*Trichloroethene*" Then
        row.Offset(0, 2).Value = "Trichloroethylene"
    ElseIf row.Offset(0, 2).Value Like "*TTHMs*" Then
        row.Offset(0, 2).Value = "Trihalomethanes (TTHM)"
    ElseIf row.Offset(0, 2).Value Like "*Vinyl chloride*" Then
        row.Offset(0, 2).Value = "Vinyl Chloride"
    ElseIf row.Offset(0, 2).Value Like "*Total Coliform*" Then
        row.Offset(0, 2).Value = "Total Coliform"
    ElseIf row.Offset(0, 2).Value Like "*1,2-Dichlorobenzene*" Then
        row.Offset(0, 2).Value = "o-Dichlorobenzene"
    ElseIf row.Offset(0, 2).Value Like "*E*Coli" Then
        row.Offset(0, 2).Value = "Fecal Coliform"
    End If
Next row

'lets get the last row of the unique sample dates on the output sheet
Sheets("output").Select
Set sData = Sheets("output").Range("b2")
sData.Select
Do
    ActiveCell.Offset(1, 0).Select
Loop Until IsEmpty(ActiveCell.Value)
Set endsDate = ActiveCell.Offset(-1, 0)

'lets set the total range of the unique sample dates on the output sheet
Set totalrng = Range(sData.Address & ":" & endsDate.Address)

For i = 2 To (totalrng.Count + 1)
    For j = 3 To 77
        datad = Cells(i, 2).Value
        datav = Cells(1, j).Value
        For Each row In Rng.Rows
            If (row.Value = datad And row.Offset(0, 2).Value = datav) Then
                finalr = row.Offset(0, 3).Value
                finald = row.Offset(0, 1).Value
                Exit For
            End If
        Next row
        If (finalr = "--" And finald = "--") Then
            Cells(i, j).Value = ""
            Cells(i, j + 1).Value = ""
        Else
            Cells(i, j).Value = finalr
            Cells(i, j + 1).Value = finald
        End If
        'lets clear the variables for the next iteration
        finalr = "--"
        finald = "--"
        'here we skip the analyze date col
        j = j + 1
    Next j
Next i

End Sub

This should work, assuming your data is in the first 2 columns. 假设您的数据在前两列中,这应该可以工作。 It ouputs the result in columns 4 and 5. 它在第4列和第5列中输出结果。

Public Sub getMax()

    Dim data As Variant
    Dim dict As Variant
    Dim d As Variant
    Dim i As Long

    data = UsedRange
    Set dict = CreateObject("Scripting.Dictionary")

    For i = LBound(data, 1) + 1 To UBound(data, 1) 'skips the first line
        If dict.exists(data(i, 1)) Then
            If dict(data(i, 1)) < data(i, 2) Then
                dict(data(i, 1)) = data(i, 2)
            End If
        Else
            dict.Add data(i, 1), data(i, 2)
        End If
    Next i

    ReDim data(1 To dict.Count, 1 To 2) As Variant

    i = 1
    For Each d In dict
        data(i, 1) = d
        data(i, 2) = dict(d)
        i = i + 1
    Next d

    Cells(1, 4).Resize(UBound(data, 1), UBound(data, 2)) = data

End Sub

VBA would be OK, filling an array with unique values, then looping over the array and selecting from the entire range, or a function would work also. VBA可以,用唯一值填充数组,然后在数组上循环并从整个范围中进行选择,否则函数也将起作用。

There is no need for VBA or a formula :) You can use the Pivot Table. 不需要VBA或公式:)您可以使用数据透视表。 See the snapshot below. 请参阅下面的快照。

在此处输入图片说明

HTH 高温超导

Sid 席德

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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