Копирование Excel VBA из отфильтрованного списка со скрытым столбцом - PullRequest
0 голосов
/ 01 сентября 2011

Попробуй это.Сначала установите следующую таблицу данных на листе 1

A   B   C   D
a1  b1  c1  d1
a2  b2  c2  d2
a3  b3  c3  d3
a4  b4  c4  d4
a5  b5  c5  d5

Создайте именованную область «Набор дат» A2: D6.Поместите фильтр в таблицу, скройте столбец B и отфильтруйте таблицу, чтобы показать только первую строку.

Теперь протестируйте следующий код в наборе данных:

 Sub DataCopy()
   Dim r
   For Each r In Names("Dateset").RefersToRange.Rows
      r.Copy Worksheets(2).Range("a65536").End(xlUp).Offset(1, 0)
   Next
 End Sub

Я получаю следующий результат:

a1  c1  d1  
a2  b2  c2  d2
a3  b3  c3  d3
a4  b4  c4  d4
a5  b5  c5  d5

Без фильтра я получаю (как и ожидалось):

a1  b1  c1  d1
a2  b2  c2  d2
a3  b3  c3  d3
a4  b4  c4  d4
a5  b5  c5  d5

Можете ли вы помочь мне получить все данные - также из видимой строки?

Пс.Я также попытался:

Dim c as Range
For Each c In Range("A2", Range("A6")).Cells
    Range(c, c.End(xlToRight)).Copy Worksheets(2).Range("A65536").End(xlUp).Offset(1, 0)
    c.EntireRow.Copy Worksheets(2).Range("A65536").End(xlUp).Offset(1, 0)
    Range(c, c.Offset(0, 5)).Copy Worksheets(2).Range("A65536").End(xlUp).Offset(1, 0)
Next

, но безуспешно ... Я проверял в Excel 2007 и 2010.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2011

Вот удар в темноте:

 Sub DataCopy()

    Dim vArray As Variant

    vArray = Names("Dateset").RefersToRange.Value

    Worksheets(2).[A1].Resize(UBound(vArray, 1), UBound(vArray, 2)).Value = vArray

 End Sub

По сути, вы не должны копировать строки, подобные этим, в таких обстоятельствах, то есть скрытые и отфильтрованные строки.

Если вы хотите получить лучший ответ, вам следует ОПРЕДЕЛИТЬ ТОЧНО, что вы пытаетесь сделать. Ваши примеры и объяснения сбивают с толку. Для меня все равно :) Я просто не понимаю, что вы на самом деле пытаетесь сделать.

0 голосов
/ 01 сентября 2011

Это определенно похоже на ошибку.

Поскольку проблема возникает только в первой строке, вы можете скопировать ТОТ столбец за столбцом, но скопировать оставшиеся строки по всей строке:

Sub DataCopy()
    Dim r As Range
    Dim dest As Range
    For Each r In Names("DateSet").RefersToRange.Rows
        If r.Row = 2 Then
            For Each c In r.Columns
                Set dest = Worksheets(2).Cells(r.Row, c.Column)
                r.Cells(1, c.Column).Copy dest
            Next
        Else
            Set dest = Worksheets(2).Cells(r.Row, r.Column)
            r.Copy dest
        End If
    Next
End Sub
...