Копирование столбцов с одного листа на новый лист

#excel #vba

#excel #vba

Вопрос:

Я хочу скопировать несколько столбцов с листа с именем «Данные» и создать новый лист для вставки этих столбцов.

Я получаю

ошибка времени выполнения «438» объект не поддерживает это свойство или метод.

в строке

 For Each xlcell In .myRng.Cells ' look through each cell in your header 
 

Мой полный код.

 Sub extractcols()

    Dim myCollection    As Collection
    Dim myIterator      As Variant
    Dim myRng           As Range
    Dim xlcell          As Variant
    Dim ws              As Worksheet
    Dim wsh             As Worksheet
    Dim colCounter      As Integer
    
    Dim lCol As Long, i As Long

    Set ws = ActiveWorkbook.Worksheets("Data")
    Set myCollection = New Collection

    'Create a collection of header names to search through
    myCollection.Add ("1")
    myCollection.Add ("2")
    myCollection.Add ("3")
    
    'Add worksheet
    With ThisWorkbook
 
        .Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = "Main"
 
        Set wsh = ActiveWorkbook.Worksheets("Main")
    
        'Where to search, this is the header
        With ThisWorkbook.Sheets("Data")
            lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    
            colCounter = 0
            For Each xlcell In .myRng.Cells ' look through each cell in your header
                For Each myIterator In myCollection ' look in each item in the collection
                    If myIterator = xlcell.Value Then ' when the header matches what you are looking for
                        colCounter = colCounter   1 ' creating a column index for the new workbook
                        ws.Columns(xlcell.Column).Copy
                        wsh.Columns(colCounter).Select
                        wsh.Paste
                    End If
                Next
            Next
        End With
    End With
End Sub
 

Я определил заголовки столбцов или имена столбцов, которые я хочу скопировать из листа «Данные», как MyCollection.Add.

Я хочу скопировать эти указанные столбцы с листа с именем «Данные», затем создать новый лист с именем «Main» и вставить эти столбцы в новый лист.

Комментарии:

1. Удалите . перед myRng , а затем убедитесь Set myRng = ... , что перед циклом.

2. myRng не создан. Вероятно, вам нужно Set myRng = .range("A1", .cells(1, lCol)) , а затем сделайте то, что предложил BigBen, используя: For Each xlcell In myRng.Cells . И для копирования вы не должны ничего выбирать : ws.Columns(xlcell.Column).Copy wsh.Columns(colCounter) . В одной строке…

3. @FaneDuru спасибо, теперь все идеально спасибо за ваше руководство, пожалуйста, вставьте свой ответ для принятия

Ответ №1:

Во-первых, myRng он только объявлен, а не определен. Попробуйте настроить его следующим образом:

 Set myRng = .range("A1", .cells(1, lCol))
 

Затем используйте его как:

 For Each xlcell In myRng.Cells 'without dot (.) in front of it
 

Нет необходимости в каком-либо выборе для копирования диапазона. В этой ситуации он использует только ресурсы Excel. На самом деле, эта часть вашего кода должна выглядеть следующим образом:

 'your existing code
'...
    lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    Set myRng = .range("A1", .cells(1, lCol))    
    colCounter = 0
    For Each xlcell In myRng.Cells ' look through each cell in your header
        For Each myIterator In myCollection ' look in each item in the collection
            If myIterator = xlcell.Value Then ' when the header matches what you are looking for
                colCounter = colCounter   1 ' creating a column index for the new workbook
                ws.Columns(xlcell.Column).Copy wsh.Columns(colCounter) 'if you want pasting in the incremented column number...
            End If
        Next
    Next
'...
'your existing code...