Как скопировать и вставить только отфильтрованные ячейки в Excel, используя VBA - PullRequest
0 голосов
/ 10 января 2020

Я пытался скопировать и вставить диапазон отфильтрованных ячеек в определенное пространство c в моем листе Excel (посмотрите на изображения) с использованием vba, но когда я пытаюсь это сделать,

ошибка 1004

. Я искал на многих форумах и пытаюсь решить мою проблему по-разному, но она не работает, и ошибка 1004 по-прежнему возникает.

enter image description here

Sub arrumando_dados_pro_xml()
Dim n As Integer
Dim i As Integer
Dim m As Integer
Dim j As Integer



n = Cells(1000, 1).End(xlUp).Row



j = Cells(n - 1, 1).End(xlUp).Row


m = Cells(1, 50).End(xlLeft).Row




 Range(Worksheets("Planilha1").Cells(2, 1), Worksheets("Planilha1").Cells(j, m)).SpecialCells(xlCellTypeVisible).Copy
 '''Range("A2:P37").SpecialCells(xlCellTypeVisible).Select
 ''''Selection.SpecialCells(xlCellTypeVisible).Select
 '''Selection.SpecialCells(xlCellTypeVisible).Copy
 ''''Call Plan1.AutoFilter.Range.Copy

 Range(Worksheets("Planilha2").Cells(1, 1), Worksheets("Planilha2").Cells(1, m)).Paste

 Range(Worksheets("Planilha2").Cells(1, 1), Worksheets("Planilha2").Cells(1, m)).Copy

 Range(Worksheets("Planilha1").Cells(n, 1), Worksheets("Planilha2").Cells(n, m)).Copy

''' Range(Cells(n, 1), Cells(n, m)).Select
''' ActiveSheet.Paste



End Sub

1 Ответ

0 голосов
/ 10 января 2020

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

'Declare your variables
Dim ws1 As Worksheet, ws2 As Worksheet, As Range, lRow As Long, lCol As Long

'Assign your variables, you should always identify the workbook and worksheet
'ThisWorkbook refers to the workbook where your code resides
Set ws1 = ThisWorkbook.Sheets("Planilha1")
Set ws2 = ThisWorkbook.Sheets("Planilha2")

'Using your worksheet variable find the last used row and last used column
lRow = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
lCol = ws1.Cells(1, ws1.Columns.Count).End(xlToLeft).Column

'Define your range by resizing using lRow and lCol.
Set rng = ws1.Cells(2, 1).Resize(lRow - 1, lCol)

    'Copy the visible cells in the range(normally used after filtering or with hidden rows/columns)
    rng.SpecialCells(xlCellTypeVisible).Copy
    'paste the copied range starting on row 1, after the last column with data, by using .Offset(, 1)
    ws2.Cells(1, 1).PasteSpecial xlPasteValues

Если у вас есть какие-либо вопросы, пожалуйста, задавайте, и я помогу.

Отредактировано Я изменил ваш код, пришлось внести изменения, см. Комментарии

'Added worksheet variables
Dim ws1 As Worksheet, ws2 As Worksheet, n As Long, m As Long 'removed j As Long

Set ws1 = ThisWorkbook.Sheets("Planilha1")
Set ws2 = ThisWorkbook.Sheets("Planilha2")

n = ws1.Cells(1000, 1).End(xlUp).Row
'Removed [j = ws1.Cells(n - 1, 1).End(xlUp).Row] if there are no blank cells after "n" the new last used row then j = 1
m = ws1.Cells(1, 50).End(xlToLeft).Column 'you can't use .End(xlLeft).Row to get the last column

'changed j to n, if j = 1 then only the top two rows will be copied
ws1.Range(ws1.Cells(2, 1), ws1.Cells(n, m)).SpecialCells(xlCellTypeVisible).Copy

'when pasting, just use one cell
ws2.Cells(1, 1).PasteSpecial Paste:=xlPasteValues

Application.CutCopyMode = False 'Exits the CutCopyMode, removes "Marching Ants"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...