2015-10-30 3 views
3

У меня есть макрос, который проходит через данные и выводит его в определенном формате на другой лист. Проблема в том, что ошибки после ряда 65536 была заселена, который я предполагаю, что это ограничение накладывается на MS:Разделение вывода макроса на несколько листов

Sub Macro1() 
' 
' Macro1 Macro 
' 

' 
Sheets.Add.Name = "Sheet2" 

Worksheets("Sheet2").Cells(1, 1).Value = "datacol1" 
Worksheets("Sheet2").Cells(1, 2).Value = "datacol2" 
Worksheets("Sheet2").Cells(1, 3).Value = "datacol3" 

Worksheets("data").Activate 
SourceColumn = 2 
SourceRow = 2 
Cells(SourceRow, 1).Activate 
targetRow = SourceRow 
targetcolumn = 1 

While Cells(1, SourceColumn).Value <> "" 

While ActiveCell.Value <> "" 
Worksheets("Sheet2").Cells(targetRow, targetcolumn).Value = ActiveCell.Value 
Worksheets("Sheet2").Cells(targetRow, targetcolumn + 1).Value =   Worksheets("Data").Cells(1, SourceColumn).Value 
Worksheets("Sheet2").Cells(targetRow, targetcolumn + 2).Value = Worksheets("Data").Cells(SourceRow, SourceColumn).Value 
SourceRow = SourceRow + 1 
targetcolumn = 1 
targetRow = targetRow + 1 
Cells(SourceRow, 1).Activate 
Wend 
SourceColumn = SourceColumn + 1 
SourceRow = 2 
Cells(SourceRow, 1).Activate 

Wend 
With Worksheets("Sheet2").Sort 
.SetRange Range(Cells(2, 1), Cells(targetRow, 3)) 
    .Header = xlNo 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

End Sub 

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

+0

Вы используете Excel 2003 или ранее? – Hambone

+0

Я использую Excel 2010 – user5495762

ответ

1

Я не думаю, что это ограничение Excel. Я думаю, что проблема заключается в том, что ваша переменная не определена, поэтому VBA делает все возможное, используя тип данных, который недостаточно для обработки номера строки, которую вы ему даете. Изменив тип данных на long, я думаю, вы исправите свою проблему.

В качестве демонстрации это должно касаться обеих проблем. В целях иллюстрации я разделил листы на 100 000 строк (а не 65 тыс., Чтобы показать, что они будут работать), но вы можете изменить это на 1 000 000 или любой другой реальный предел. Я сделал это 100 000, чтобы доказать, что он раскололся.

Sub Macro1() 
    Dim wsFrom, wsTo As Worksheet 
    Dim SourceRow, SheetNumber, TargetRow As Long 
    Dim val As String 

    Set wsFrom = Worksheets("data") 

    SheetNumber = 2 
    SourceRow = 2 

    val = wsFrom.Cells(SourceRow, 1).Text 

    While val <> "" 

    Sheets.Add.Name = "Sheet" & SheetNumber 
    Set wsTo = Worksheets("Sheet" & SheetNumber) 

    wsTo.Cells(1, 1).Value = "datacol1" 
    wsTo.Cells(1, 2).Value = "datacol2" 
    wsTo.Cells(1, 3).Value = "datacol3" 
    TargetRow = 2 

    While val <> "" And TargetRow < 100000 
     wsTo.Cells(TargetRow, 1).Value = wsFrom.Cells(SourceRow, 1).Value 
     wsTo.Cells(TargetRow, 2).Value = wsFrom.Cells(SourceRow, 2).Value 
     wsTo.Cells(TargetRow, 3).Value = wsFrom.Cells(SourceRow, 3).Value 

     SourceRow = SourceRow + 1 
     TargetRow = TargetRow + 1 
     val = wsFrom.Cells(SourceRow, 1).Text 

    Wend 
    ' insert your sort logic here 
    SheetNumber = SheetNumber + 1 
    Wend 
End Sub 
+0

Благодарим за быстрый ответ, но это, похоже, вызывает некоторые странные результаты. Он выводит значения столбца 1 в столбец 2, а не все экспортируется на новый лист. Если бы я мог сделать все это на одном листе, это было бы идеально, я бы определенно предпочел не создавать несколько листов, если можно. Для справки Я создал образец листа, пожалуйста, посмотрите https://app.box.com/s/4uq8j828bu6u1hvt7aggamb0eiomno6t – user5495762

+0

Возможно, я неверно истолковал ваш исходный код ... Я думал, что он меняет столбцы 1 и 2 на новый лист. Разве это не ваше намерение? Это просто буквально перемещает первые три столбца на новый лист? Я признаю, что я не копался в нем много. – Hambone

+0

Да, это буквально копирование данных с одного листа на другой. – user5495762