Копирование больших объемов информации с нескольких других листов

То, что я пытаюсь сделать, это объединить информацию из нескольких листов в один лист. Я видел другие сообщения на SO, но они, похоже, не работают для меня. Я пытался сделать что-то вроде этого:

Sub Copy_Data()
    Dim empt As Long
    Dim emptmas As Long

    For s = 2 To 8
        Set ws = Worksheets(2)
        For col = 1 To 25
            For row = 2 To 51

            empt = Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Select
            emptmas = empt + 1

            Worksheets(1).Cells(row, col).Value = Worksheets(s).Cells(emptmas, col).Value

            Next row
        Next col
    Next s

End Sub

Но ничего не происходит, когда я запускаю код, даже ошибки. Я пытался запустить только:

Worksheets(1).Cells(1, 1).Value = Worksheets(2).Cells(1, 1).Value

Но даже это ничего не дало. Нельзя ли использовать функцию Cells() для копирования с другого листа?


person xxxRxxx    schedule 03.09.2015    source источник
comment
Если предполагается, что For s = 2 To 8 зациклит листы, вам нужно будет объявить объект листа и назначить ему каждый лист внутри этого цикла. Для s = от 2 до 8 установите ws = рабочие листы (iIndex)   -  person MatthewD    schedule 03.09.2015
comment
Хорошо, это полезно, я пойду дальше и сделаю это. Тем не менее, я все еще пытаюсь найти ответ на вопрос, можно ли получить значения ячеек с другого листа с помощью Cells().   -  person xxxRxxx    schedule 03.09.2015
comment
Как установка другой переменной, ws, на Worksheets(2) изменит работу цикла?   -  person xxxRxxx    schedule 03.09.2015
comment
Да, вы можете получить значения ячеек таким образом. Но я думаю, вы хотите скопировать диапазон.   -  person MatthewD    schedule 03.09.2015
comment
Правильно, я хочу скопировать диапазон. Один из моих коллег, который использует VBA, часто утверждает, что невозможно просто выполнить Range("A1").Value = Worksheets("Other_Worksheet").Range("A1).Value, поэтому я не знаю, как еще это сделать без цикла.   -  person xxxRxxx    schedule 03.09.2015
comment
Посмотрите на stackoverflow. com/questions/32383969/ Вот что там делается.   -  person MatthewD    schedule 03.09.2015


Ответы (2)


У меня сейчас нет времени, чтобы закончить это за вас, но, надеюсь, кто-то другой это сделает или это направит вас в правильном направлении. Я проверю позже.

Private Sub Copy_Data()
    Dim iIndex As Integer
    Dim ws As Excel.Worksheet
    Dim wsCopyFrom As Excel.Worksheet
    Dim r As Range

    'Set the worksheet where you are going to copy the data to.
    Set ws = ActiveWorkbook.Sheets("Sheet5")

    'Loop through the worksheets 
    For iIndex = = 2 To 8

        Set wsCopyFrom = Worksheets(iIndex)
        wsCopyFrom.Activate

        'Copy range "A2:Z51" from wsCopyFrom to
        'the bottom of ws

    Next iIndex
End Sub
person MatthewD    schedule 03.09.2015

Не проверено, но я думаю, что это то, что вам нужно:

Sub MacroMan()

Dim lastCell As Excel.Range

For i = 2 To 8
    With Sheets(i)    
        Set lastCell = .Cells.Find(What:="*", After:=.Cells(2, 1), Lookat:=xlPart, _
            LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
            MatchCase:=False)

        If Not lastCell Is Nothing Then 
            .Range(Cells(2, 1), lastCell).Copy Destination:=Sheets(1).Range("A" & _
                Sheets(1).Rows.Count).End(xlUp).Offset(1, 0)
        End If
    End With
Next i

End Sub
person SierraOscar    schedule 03.09.2015