根据公式栏单元格引用

时间:2016-01-11 00:41:39

标签: excel vba excel-vba

我需要在sheet2中提供更多信息,但我无法弄清楚如何添加它。

我在sheet1中有很多数据,但所有内容都分为3 sections

sheet1的第1部分在A,B,C,D列中,包含-date,time,name,last

sheet1的第2部分是数字数据,其范围是E到JX列

sheet1的第3部分在JY:MV范围内,它包含结果(来自第2部分)

我所拥有的代码经过第3部分,如果值为< 1,则将该值复制到F列中的第2页,并从该行第1部分复制

示例:

如果在sheet1 K32中找到值0.5,则表2看起来像:

A        B      C          D      F 
date  time  name  last  0.5

我需要帮助的任务

1)是否可以在E列中的sheet2中看到找到值的sheet1列名?

2)由于第3节中的每个值都来自第2节中的2个值,这两个值是否也可以复制到第2页?

例如

在sheet1中,K50为0.2,结果来自AA50(2.2)和AC50(2.0),使用的公式为(AA-AC)

是否可以根据公式单元格引用复制表2中的2.2和2.0?

要点: 最终的sheet2应如下所示:

A       B       C          D       E                                                               F         G           H
date, time, name, last,  Column name where value is found, value,  data1,  data2

所以我需要帮助添加E,G和H

 Sub moveData()
 Dim rng As Range
 Dim iniCol As Range
 Dim i
 Dim v
 Dim x
 Dim myIndex
 Dim cellVal
 Dim totalCols
 Dim sht1 As Worksheet
 Dim sht2 As Worksheet

Dim ABC() 'var to store data from Cols A,B,C in Sheet1
Dim JYJZKA As Range 'var to store data from Cols K,L,M in Sheet1

Set sht1 = Sheets("Sheet1")
Set sht2 = Sheets("Sheet2")
Set rng = Range("JY1:KB400")
Set iniCol = Range("JY1:JY400")
totalCols = rng.Columns.Count 'Count the total of columns in the selectec range
myIndex = 0 'ini the index for rows in sheet2

For Each i In iniCol
x = -1
    ABC = Range(Cells(i.Row, 1), Cells(i.Row, 4))
    Set JYJZKA = Range(Cells(i.Row, 285), Cells(i.Row, 351))
    'Copy range from A to C

    sht2.Activate

    myIndex = Application.WorksheetFunction.CountA(Columns(1)) + 1
    For Each v In JYJZKA
        If v.Value < 1 Then
            x = x + 1
            Range(Cells(myIndex + x, 6), Cells(myIndex + x, 6)).Value = v.Value
            Range(Cells(myIndex + x, 1), Cells(myIndex + x, 4)).Value = ABC
        End If
    Next v
    'Paste range equal to copy range.
    'Application.CutCopyMode = False
    sht1.Activate
Next i
End Sub

1 个答案:

答案 0 :(得分:2)

看看这是否可以让你开始。

我已将大块数据加载到变量数组中。这大大加快了通过单个细胞比较的循环。

Sub section_3_to_Sheet2()
    Dim r As Long, c As Long, vVALs As Variant, vTMP As Variant

    With Worksheets("Sheet1")
        With .Range(.Cells(2, 1), .Cells(Rows.Count, "MV").End(xlUp))
            vVALs = .Value2
        End With
    End With

    With Worksheets("Sheet2")
        For r = LBound(vVALs, 1) To UBound(vVALs, 1)
            For c = 285 To UBound(vVALs, 2)
                If vVALs(r, c) < 1 Then
                    vTMP = Array(vVALs(r, 1), vVALs(r, 2), vVALs(r, 3), vVALs(r, 4), _
                                 "=ADDRESS(" & r + 1 & ", " & c & ", 4, 1, """ & .Name & """)", _
                                 vVALs(r, c), vVALs(r, c - 280))
                    .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(1, 7) = vTMP
                End If
            Next c
        Next r
    End With

End Sub

通常,像这样的数据块具有列标题标签,所以我在第2行开始,而不是第1行,因为您的示例数据可能表示。

原始数据的位置由ADDRESS function提供。

由于E:JX与JY:MV的列数不同,我对作为第二个(例如data2)值返回的值有点困惑。我选择了一个简单的偏移。