2014-01-20 4 views
0

На Sheet1 у меня есть три столбца, которым нужны данные, введенные в них. Три столбца всегда будут заканчиваться в одной строке, но последняя строка будет изменяться с каждым набором данных.Диапазон копирования ячеек, содержащих только видимые данные

Лист2 принимает информацию, указанную в трех столбцах на листе1, и применяет ее к формулам, которые помещают его в определенный формат, который мне нужно скопировать и вставить в файл txt для другой программы.

Формулы на Sheet2 содержат формулы IF (ISBLANK), которые заполняют ячейки только в том случае, если на листе 1 есть данные. Если в Sheet1 не введены данные, ложный аргумент возвращает «» в ячейку.

Я хочу кнопку макроса или управления на Sheet1, которая скопирует диапазон A6: B500 на Sheet2, но только если ячейки заполнены данными из Sheet1, что делает формулы IF истинными.

Вот код того, что происходит:

Лист 1 было объяснено, и не содержит в себе ничего особенного.

Лист 2 содержит следующие начиная с A6 и каждые 5 ячеек вниз, пока он не достигнет: 496

=IF(ISBLANK(Sheet1!A2),"","host "&(INDIRECT(E6))&" {") 

Эти формулы также продолжают обновлять позиции ячейки от Лист1. Начиная B7 через B10 есть аналогичные формулы для больше текста с клетки, взятые из листа 1 обновляется до столбца B не достигнет B500, и эти формулы следующим образом:

B7: =IF(ISBLANK(Sheet1!C2),"","hardware ethernet "&(INDIRECT(E7))&";") 
B8: =IF(ISBLANK(Sheet1!B2),"","fixed-address "&(INDIRECT(E8))&";") 
B9: =IF(ISBLANK(Sheet1!A2),"","option host-name "&""""&(INDIRECT(E9))&""";") 
B10: =IF(ISBLANK(Sheet1!A2),"","}") 

До сих пор мои макрос выглядит следующим образом:

Sub CommandButton1_Click() 
    Dim rng As Range 
    If Not Selection Is Nothing Then 
     Set rng = Sheets("Sheet2").Range("Sheet2!A6:Sheet2!B500").Cells.SpecialCells(xlCellTypeVisible) 
     rng.Copy 
    End If 
End Sub 

проблема у меня в том, что независимо от того, что данные введены, макро копирует все ячейки в диапазоне, и у меня есть куча пустых новых линий после моих видимых данных.

+0

Не уверен, что я точно понимаю, что вы после. Кажется, что часть проблемы определяет последнюю заполненную строку. Правда? Если это так, вы можете использовать 'UsedRange' для этой цели, например. 'maxRow = ActiveSheet.UsedRange.Rows.Count' – David

+0

Возможный дубликат [Диапазон копирования ячеек, содержащих только видимые данные, не включая формулы] (http://stackoverflow.com/questions/21141204/copy-range-of-cells -that-contains-only-visible-data-not-includes-formula) – pnuts

ответ

0

Вы должны проверять длину строки, а не на то, что они относятся к типу Visible. Видимость в основном связана со скрытыми ячейками. Попробуйте следующее:

Sub CopyNonBlanks() 
    Dim RngToCopy As Range, Cell As Range 
    For Each Cell In Selection 
     If Not RngToCopy Is Nothing Then 
      If Len(Cell.Value) > 0 Then 
       Set RngToCopy = Union(RngToCopy, Cell) 
      End If 
     Else 
      Set RngToCopy = Cell 
     End If 
    Next Cell 
    RngToCopy.Select 'Or .Copy 
End Sub 

Это должно выделить ячейки, которые оценивают в "". Смотрите скриншот ниже:

enter image description here

Надеется, что это помогает.

+0

Это близко к тому, чего я пытаюсь достичь, но обратитесь к прилагаемым скриншотам за дополнительной информацией: https://dl.dropboxusercontent.com /u/2989505/sheet1.JPG https://dl.dropboxusercontent.com/u/2989505/sheet2.JPG https://dl.dropboxusercontent.com/u/2989505/sheet2-2.JPG у меня есть формула начинается с A6 на листе 2, но поскольку B6 не содержит данных, он пропускается.A7 также пропущен и выбран B7, потому что он верен в цикле if. Когда все сказано и сделано, выбор не может быть скопирован, потому что выбраны ячейки в прерывистом порядке. Следуя sheet2-2.jpg, – user2554993

+0

Мне нужно все, что выбрано из A6: Bxxx, в зависимости от того, где последняя строка содержит значения больше 0, поэтому я могу скопировать выбранные ячейки в буфер обмена. – user2554993

Смежные вопросы