Excel VBA问题从筛选数据集复制

时间:2017-11-01 13:21:54

标签: excel vba excel-vba

我正在开展一个大型项目,但对VBA来说还是个新手。我想要做的部分工作要求我将预过滤数据集中的数据复制到新工作表中。从我在网上找到的,似乎最好的方法是使用.SpecialCells(xlCellTypeVisible).Copy。不幸的是,这似乎对我没用。

目前,当代码运行时,它会将所有单元格值复制到新工作表,甚至是过滤或空白单元格。我的目标是让可见细胞复制。

这是我到目前为止的相关代码......

Sheets(dataSheetName).Range(yColumn & periodStart & ":" & yColumn & periodEnd).SpecialCells(xlCellTypeVisible).Copy
Sheets(VBASheetName).Range(ySourceColumn & VBAheaderRow + groupCount(groupIndex) + 1).PasteSpecial xlPasteValues

编辑:人们要求提供更多背景信息。此代码的目标是基于多个系列向图表添加趋势线。从我能找到的唯一方法是将数据合并到一个工作表中,然后可以使用斜率和截距公式来求解趋势线。当数据源未经过滤时,这似乎有效,但我希望用户能够过滤具有正确趋势线的数据。希望这是有道理的。

以下是我正在处理的数据的一小部分。有数百列和数千行,但数据是从这里拉出的:

Data source to be copied

数据集进一步细分为时间段,每个时间段都在不同的“组”中。用户可以以基本上无限的方式对其进行过滤,然后我希望将过滤后的数据复制到新工作表中,并将其添加到相应的组列中。源表的标题如下所示。

Paste loaction

这最终将对用户隐藏,但数据将被复制到黄色单元格,然后斜率,截距和系列值被“保存”(复制到汇总表)并用于绘制趋势线。我之前的代码处于循环中,该循环遍历每个时间段并将数据(y源列和x源列)复制到“粘贴位置”图像中的正确列。对于每个创建的图形,也会重复此操作。

这是一段更大的代码。再次,这是一个巨大的子的一部分,我不想发布整个事情(除非有人真的想要它),但这里是代码的更大部分:

For periodIndex = 1 To 10
    If graphPeriod = "Yes" Then
        If XYShowTrendlines = "Yes" Then
            'copies the values into the VBA worksheet to graph trendlines as series
            Sheets(dataSheetName).Range(yColumn & periodStart & ":" & yColumn & periodEnd).SpecialCells(xlCellTypeVisible).Copy
            Sheets(VBASheetName).Range(Split(Cells(1, (groupIndex * 2)).Address, "$")(1) & VBAHeaderRowXYGroupData + groupCount(groupIndex) + 1).PasteSpecial xlPasteValues
            Sheets(dataSheetName).Range(xColumn & periodStart & ":" & xColumn & periodEnd).SpecialCells(xlCellTypeVisible).Copy
            Sheets(VBASheetName).Range(Split(Cells(1, (groupIndex * 2) - 1).Address, "$")(1) & VBAHeaderRowXYGroupData + groupCount(groupIndex) + 1).PasteSpecial xlPasteValues

            Worksheets(VBASheetName).Calculate
            'copies the calculated x and y values to the summary table
            Dim index As Integer
            For index = 1 To 12
                If IsError(Sheets(VBASheetName).Range(Split(Cells(1, ((index + (index Mod 3)) / 3) + 4).Address, "$")(1) & "3")) = False Then
                    If index Mod 3 = 0 Then
                        'slope and r-squared
                        Sheets(VBASheetName).Range(Split(Cells(1, (index / 3) + 4).Address, "$")(1) & "3:" & Split(Cells(1, (index / 3) + 4).Address, "$")(1) & "4").Copy
                    Else
                        'values
                        Sheets(VBASheetName).Range(Split(Cells(1, index - ((index - (index Mod 3)) / 3)).Address, "$")(1) & "10:" & Split(Cells(1, index - ((index - (index Mod 3)) / 3)).Address, "$")(1) & "11").Copy
                    End If
                    Sheets(VBASheetName).Range(Split(Cells(1, index * 2 + 9).Address, "$")(1) & VBAHeaderRowXYGroupData + graphIndex & ":" & Split(Cells(1, index * 2 + 10).Address, "$")(1) & VBAHeaderRowXYGroupData + graphIndex).PasteSpecial xlPasteValues, Transpose:=True
                End If
            Next index
            Worksheets(XYSheetName).Activate
        End If
    End If
Next periodIndex

0 个答案:

没有答案